首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用常量值初始化Ruby哈希

用常量值初始化Ruby哈希
EN

Stack Overflow用户
提问于 2017-05-23 15:54:03
回答 3查看 728关注 0票数 2

实际上,我想在厨师属性中使用这样的构造,在这里,我用常量初始化结构并修改它。

代码语言:javascript
运行
复制
init_value = { "a" => { "b" => "c" } }
prepare = init_value
prepare["a"]["x"] = "y"

现在init_value也包含["a"]["x"] = "y",所以当我准备一个新的值时

代码语言:javascript
运行
复制
prepare = init_value
prepare["a"]["y"] = "x"

所以prepare["a"]包含["b", "x", "y"]键。

如何在不引用常量的情况下使用常量初始化step,以便在最后一步中,prepare["a"]只包含两个键["b","y"]

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-05-23 19:17:05

您可以将初始哈希移到方法中。这样,该方法总是返回一个“新”哈希:

代码语言:javascript
运行
复制
def init_value
  {"a"=>{"b"=>"c"}}
end

prepare = init_value
prepare["a"]["x"] = "y"
prepare
#=> {"a"=>{"b"=>"c", "x"=>"y"}}

prepare = init_value
prepare["a"]["y"] = "x"
prepare
#=> {"a"=>{"b"=>"c", "y"=>"x"}}
票数 3
EN

Stack Overflow用户

发布于 2017-05-23 16:31:29

提取自Rails 4.2.7

  • 如果对象是可复制的,Object#deep_dup“返回对象的深度副本。如果它不是可复制的,则返回self。
  • Hash#deep_dup“返回一个深入的哈希副本。
  • Array#deep_dup“返回数组的深度副本。

执行情况:

代码语言:javascript
运行
复制
class Object
  def duplicable?
    true
  end
  def deep_dup
    duplicable? ? dup : self
  end
end 

class Hash
   def deep_dup
     each_with_object(dup) do |(key, value), hash|
       hash[key.deep_dup] = value.deep_dup
     end
  end
end

class Array
  def deep_dup
    map { |it| it.deep_dup }
  end
end

# Not duplicable? 
# if ruby version < 2.0 also add Class and Module as they were not duplicable until 2.0
[Method, Symbol, FalseClass, TrueClass, NilClass, Numeric, BigDecimal].each do |m|
  m.send(:define_method, :duplicable?, ->{false})
end

然后,您可以为init_value使用一个方法,这样就可以始终调用deep_dup,而不会意外地忘记

代码语言:javascript
运行
复制
#since you asked for a constant
INIT_VALUE = { "a" => { "b" => "c" } }.freeze

def init_value 
  INIT_VALUE.deep_dup 
end

以及使用情况

代码语言:javascript
运行
复制
prepare = init_value
prepare["a"]["x"] = "y"

prepare2 = init_value
prepare2["a"]["y"] = "x"

prepare
#=> {"a"=>{"b"=>"c", "x"=>"y"}}
prepare2
#=> {"a"=>{"b"=>"c", "y"=>"x"}}
票数 3
EN

Stack Overflow用户

发布于 2017-05-23 15:56:49

我认为你在分配准备时想要一份init_value的“深拷贝”。

请参阅:How do I copy a hash in Ruby?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44139644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档