Ruby setters - 无论是由类创建(c)attr_accessor还是手动创建- 似乎是self.在类本身内访问时需要限定的唯一方法.这似乎使Ruby独自成为语言世界:
self/ this(像Perl,我认为是Javascript)self/ this是(C#,Java)self/ this(Ruby?)最好的比较是C#VS红宝石,因为这两种语言都支持这句法工作就像类的实例变量的访问方法:foo.x = y,y = foo.x.C#称它们为属性.
这是一个简单的例子; Ruby中的相同程序然后是C#:
class A
def qwerty; @q; end # manual getter
def qwerty=(value); @q = value; end # manual setter, but attr_accessor is same
def asdf; self.qwerty = 4; end # "self." is necessary in ruby?
def xxx; asdf; end # we can invoke nonsetters w/o "self." …Run Code Online (Sandbox Code Playgroud) 在测试轨道模型中的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?