可以合并在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
}