相关疑难解决方法(0)

为什么Ruby setter需要"自我".课程内的资格?

Ruby setters - 无论是由类创建(c)attr_accessor还是手动创建- 似乎是self.在类本身内访问时需要限定的唯一方法.这似乎使Ruby独自成为语言世界:

  • 所有方法都需要self/ this(像Perl,我认为是Javascript)
  • 没有方法需要self/ this是(C#,Java)
  • 只有setter需要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)

ruby

70
推荐指数
3
解决办法
9384
查看次数

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

在测试轨道模型中的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?

ruby activerecord self ruby-on-rails-3

46
推荐指数
1
解决办法
8284
查看次数

标签 统计

ruby ×2

activerecord ×1

ruby-on-rails-3 ×1

self ×1