这是因为范围界定而发生的。当您在一个方法中并尝试像这样设置一个新变量时:
class SomeData < ActiveRecord::Base
def set_active_flag(val)
active_flag = val
end
end
您正在创建一个位于 set_active_flag 内部的全新变量。一旦执行完毕,它就会消失,不会self.active_flag
以任何方式改变(实际的实例变量)。
但是(这对我来说是一个困惑的根源):当您尝试在 ruby 中读取实例变量时,如下所示:
class SomeData < ActiveRecord::Base
def whats_my_active_flag
puts active_flag
end
end
您实际上会self.active_flag
返回(实际的实例变量)。
原因如下:
Ruby 将尽其所能避免返回nil
.
- 它最初询问“是否
active_flag
存在于whats_my_active_flag
?
- 它搜索并意识到答案是“nope”,所以它跳了一个级别,到 SomeData 的实例
- 它再次问同样的事情:“
active_flag
在这个范围内存在吗?
- 答案是“是的”,所以它说“我有东西要给你”,然后它就会返回!
但是,如果您active_flag
在 中定义whats_my_active_flag
,然后请求它,它会再次执行以下步骤:
- 它询问“是否
active_flag
存在于whats_my_active_flag
?
- 答案是“是的”,所以它返回那个值
在任何一种情况下,除非您明确告诉它,否则它不会更改的值。self.active_flag
描述这种行为的一个简单方法是“它不想让你失望”并返回nil
——所以它尽最大努力找到它可以找到的任何东西。
同时,“它不想弄乱您不打算更改的数据”,因此它不会更改实例变量本身。
希望这可以帮助!