发生这种情况是由于作用域。当您在方法内部时,尝试尝试设置一个新变量,如下所示:
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
?
- 它搜索并意识到答案是“不”,因此它跳到了SomeData实例的一个级别。
- 它再次问同样的事情:“
active_flag
在这个范围内存在吗?
- 答案是“是”,所以它说“我为你买了东西”,它返回了!
但是,如果你定义active_flag
内whats_my_active_flag
,然后问它,它经历的步骤再次:
- 它问“是否
active_flag
存在范围内whats_my_active_flag
?
- 答案是“是”,因此它将返回该值
无论哪种情况,除非您明确告知,否则它都不会更改其值self.active_flag
。
描述此行为的一种简单方法是“它不想让您失望”并返回 nil
-因此,它会尽一切可能找到它。
同时,“它不想弄乱您不打算更改的数据”,因此它不会更改实例变量本身。
希望这可以帮助!