Ruby 为什么类中的常量值会发生变化?
我有一门课是这样的:Ruby 为什么类中的常量值会发生变化?,ruby,Ruby,我有一门课是这样的: class Example DEFAULT_VALUE = { 'first_key': ['a', 'b'], 'second_key': 'c' } def append_new_value(value) default_value_copy = DEFAULT_VALUE default_value_copy[:first_key] << value puts "default_value_co
class Example
DEFAULT_VALUE = {
'first_key': ['a', 'b'],
'second_key': 'c'
}
def append_new_value(value)
default_value_copy = DEFAULT_VALUE
default_value_copy[:first_key] << value
puts "default_value_copy: #{default_value_copy}"
puts "DEFAULT_VALUE: #{DEFAULT_VALUE}"
end
end
example = Example.new
example.append_new_value('d')
example.append_new_value('e')
正如我之前所理解的,在调用append\u new\u value
方法后,不应更改DEFAULT\u value的值
你们能帮我解释一下这个例子吗?首先,Ruby没有其他语言所期望的常量概念。Ruby常量可以更改值。如果您想指定一个对象不应该在Ruby中发生变异,那么必须对其使用该方法 然后是Ruby通过引用或值传递方法参数的问题。你可以说Ruby是传统意义上的传递值。然而,在Ruby中,所有变量都是对对象的引用,所以如果将对象传递给方法,它确实会发生变化
如果您正在寻找不变性的捷径,请查看。
dup
只创建一个浅拷贝,即DEFAULT\u值[:first\u key]
和DEFAULT\u值。dup[:first\u key]
仍然引用相同的数组。@Stefan您说得对。在这个例子中不适用,我只是提到它作为参考。常数不变。常量引用的对象。Ruby不是一种纯粹的函数式语言,对象是允许更改的。
default_value_copy: {:first_key=>["a", "b", "d"], :second_key=>"c"}
DEFAULT_VALUE: {:first_key=>["a", "b", "d"], :second_key=>"c"}
default_value_copy: {:first_key=>["a", "b", "d", "e"], :second_key=>"c"}
DEFAULT_VALUE: {:first_key=>["a", "b", "d", "e"], :second_key=>"c"}