可以合并在Ruby中更改常量?

可以合并在Ruby中更改常量?,ruby,constants,Ruby,Constants,我遇到了一种情况,合并似乎在修改常量的值。这会发生吗?怎么做 我正在做一些API摄取和映射,就像你一样 稍后,我将其包含在API客户端的一个类中,然后调用get\u placement方法 困境 第一步 对于第一次运行,在pry binding 1和2中,FEATURE\u DEFAULTS的值如上所示。对于2,FEATURE\u DEFAULTS的值相同,product['norm\u features']的值相同(加上extract\u features的网格化操作的结果! 步骤2 对于每个

我遇到了一种情况,
合并似乎在修改常量的值。这会发生吗?怎么做

我正在做一些API摄取和映射,就像你一样

稍后,我将其包含在API客户端的一个类中,然后调用
get\u placement
方法

困境 第一步 对于第一次运行,在pry binding 1和2中,
FEATURE\u DEFAULTS
的值如上所示。对于2,
FEATURE\u DEFAULTS
的值相同,
product['norm\u features']
的值相同(加上
extract\u features的网格化操作的结果!

步骤2 对于每个
事物
/产品,
调用者
的输出是

  FEATURE_DEFAULTS = {
    "thingone" => true,
    "thingtwo" => true
  }
步骤3 当我第二次运行此功能时(启动服务/应用程序后),
功能的默认值以及pry binding 1和2的值为

  FEATURE_DEFAULTS = {
    "thingone" => true,
    "thingtwo" => true
  }
这里发生了什么

这似乎证实了在运行
extract\u features!
方法后,
FEATURE\u默认值
CONST已更改。如果我不在
extract\u features!
中使用
merge!
,而是使用
merge
,则CONST值不会更改

如果需要,我可以发布更多代码,或者大部分代码都可以发布到要点中。
Ruby MRI 2.2.2

我在rails应用程序中这样做,但我认为这并不重要

我遇到了一种情况,
merge!
似乎在修改常量的值。这会发生吗?如何发生

不,一般来说,方法不能更改变量绑定,不管这些变量是局部变量、实例变量、类变量、全局变量还是常量。变量在Ruby中不是对象,不能对它们调用方法,不能将它们作为参数传递给方法,因此,不能让它们自己更改。

例外情况是元编程方法,如、或

但是,您可以做的,以及在本例中您正在做的,是告诉对象变量指向的对象更改自身。不幸的是,的文档有点不清楚,因为它没有明确提到
哈希#合并!
会改变其接收者

这似乎证实了在运行
extract\u features!
方法后,
FEATURE\u默认值
CONST已更改。如果我不在
extract\u features!
中使用
merge!
,而是使用
merge
,则CONST值不会更改

不,它只确认对象的状态
FEATURE\u DEFAULTS
指向已更改,它没有说明
FEATURE\u DEFAULTS
的绑定是否已更改,即它指向的对象。您可以通过查看其
对象id
来确认常量仍然指向同一对象


当然,常数可以被重新分配,尽管会触发一个警告。

我希望
合并!
改变它的接收者-这是我的意图。我不希望它改变
功能默认值的值。
。我明白你的意思;
功能默认值
指向一个对象(
object\u id
未更改),并且该对象的值已被修改。仍然感觉像是“更改常量”,但我听到了你的意思。Ruby中“常量”的定义是“如果重新分配,将生成警告”注意,它是OO的一个基本支柱,你无法知道对象是如何在内部实现的,这意味着你无法知道一个方法是否可以改变它的接收者,这意味着类似“深常量”的东西根本不可能存在,因为无法知道哪些方法可以调用,哪些不可以。
  FEATURE_DEFAULTS = {
    "thingone" => true,
    "thingtwo" => true
  }