为什么在ruby/rails/activerecord中总是不需要self?

And*_*rew 46 ruby activerecord self ruby-on-rails-3

在测试轨道模型中的getter/setter对时,我发现了一个很好的行为示例,我一直认为它很奇怪且不一致.

在这个例子中,我正在处理class Folder < ActiveRecord::Base.

Folder belongs_to :parent, :class_name => 'Folder'

在getter方法上,如果我使用:

def parent_name
  parent.name
end
Run Code Online (Sandbox Code Playgroud)

...要么...

def parent_name
  self.parent.name
end
Run Code Online (Sandbox Code Playgroud)

...结果完全一样,我得到了父文件夹的名称.但是,如果我使用getter方法...

def parent_name=(name)
  parent = self.class.find_by_name(name)
end
Run Code Online (Sandbox Code Playgroud)

......父母变成零,但如果我用......

def parent_name=(name)
  self.parent = self.class.find_by_name(name)
end
Run Code Online (Sandbox Code Playgroud)

......那么它的确有效.

所以,我的问题是,为什么你有时需要声明self.method,为什么你只能使用局部变量?

这似乎需要/使用self的ActiveRecord的不一致,我想明白这一点更好,所以我不觉得我一直在猜测我是否需要自行申报与否.您应该/何时不应该在ActiveRecord模型中使用self?

pin*_*can 82

这是因为属性/关联实际上是方法(getter/setter)而不是局部变量.当您声明"parent = value"时,Ruby假定您要将值分配给本地变量parent.

在堆栈的某个地方有一个setter方法"def parent ="并且调用你必须使用"self.parent ="来告诉ruby你实际上想要调用setter而不只是设置一个局部变量.

当涉及getter时,Ruby会先查看是否有一个局部变量,如果找不到它,那么它会尝试找到一个具有相同名称的方法,这就是为什么你的getter方法在没有"self"的情况下工作的原因.

换句话说,它不是Rails的错,但它是Ruby本身的工作方式.

希望有所帮助.

  • 哇,完美.它起到了getter的作用,因为ruby找不到本地,因此寻找一种方法.所以,换句话说,如果我的意思是自我,我应该使用自我,而不是让它离开.哇,这是一个非常非常有用的解释. (5认同)

归档时间:

查看次数:

8284 次

最近记录:

14 年,7 月 前