Ruby 使用访问器省略“self”

Ruby 使用访问器省略“self”,ruby,self,accessor,Ruby,Self,Accessor,当通过访问器方法attribute访问实例变量时,表达式self.attribute和attribute之间有什么区别?例如,我们定义了一个访问器: def post @post end 我们可以打电话 self.post 或者干脆 post 添加self有什么特别之处?当可能存在一个阴影方法调用的局部变量时,会产生不同。使用self可以指定我们想要的是方法,而不是本地变量。请参见示例: class Foo def post @post end def post=

当通过访问器方法
attribute
访问实例变量时,表达式
self.attribute
attribute
之间有什么区别?例如,我们定义了一个访问器:

def post
  @post
end
我们可以打电话

self.post
或者干脆

post

添加
self
有什么特别之处?

当可能存在一个阴影方法调用的局部变量时,会产生不同。使用
self
可以指定我们想要的是方法,而不是本地变量。请参见示例:

class Foo
  def post
    @post
  end

  def post= (content)
    @post = content
  end 

  def test
    #difference 1 
    p post # >> nil

    @post = 10
    p post # >> 10

    post = 42
    p post # >> 42
    p self.post # >> 10

    #difference 2
    # assign to @post, note that you can put space between "self.post" and "="
    self.post = 12 

    #otherwise it means assigning to a local variable called post.
    post = 12
  end
end

Foo.new.test

您好,我在示例代码中添加了一些内容。我认为这可能是为什么self关键字特别受欢迎的原因attributes@GingerJim:是的,那也是。但我以为你只是在问getter。你确定在
=
周围加空格会有什么区别吗?我不认为这有什么区别,在没有接收者的情况下,这两种情况都是对局部变量的赋值。对于无接收者无参数的消息发送,局部变量引用和getter方法之间存在歧义。避免这种歧义的另一种方法是添加一个空参数列表,这样
post()
也将调用getter,就像
self.post
一样。后者更惯用,但它不适用于私有方法,因为这些方法只能在没有显式接收器的情况下调用。@sawa:是的,对不起,我应该仔细阅读我批准的内容。