Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为什么类中的常量值会发生变化?_Ruby - Fatal编程技术网

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"}