什么时候在Ruby方法中使用`self.foo`而不是`foo`

这不是特定的Rails – 我只是使用Rails作为例子。

我在Rails中有一个模型:

class Item < ActiveRecord::Base def hello puts "Hello, #{self.name}" end end 

(比方说, Item模型(类)有一个称为name的方法)。 我什么时候需要使用self.name ,什么时候可以使用name ? (例如#{name}

  1. 喜欢省略self.是惯用的self. 调用方法时; 这通常是不需要的。

  2. 当调用一个setter方法而不是foo = xxx ,你必须使用self.foo = xxx ,这样Ruby才会意识到你没有试图创build一个新的局部variables。

    • 同样的,万一你有一个与方法同名的现有局部variablesdo_something ,你必须使用self.do_something来调用这个方法,因为do_something最终会读取variables。
  3. 不能使用self.foo(...)来调用私有方法; 你必须改为调用foo(...)

如果你省略了self Ruby将首先查找具有该名称的本地variables,然后查找实例方法。 写self.不是惯用的self. 。 无论如何,你必须写作self.something = value

请注意,调用私有方法时不能使用self (受保护的方法没有问题):

 class A def foo; self.bar; end private def bar; "bar"; end end A.new.foo # private method `bar' called for #<A:0x7f49193584f0> (NoMethodError) 

按照这个教程 ,你不需要使用指针。 但我认为 (或我们自己的情况下)指针是用来解决名称冲突。 实际上, self.nameself.name是相同的语句(如果没有你的类的name方法)。 例如:

 class Moo attr_accessor :name def moo(name) name = name # O_o which *name* should i use? end def foo(name) @name = name # the same as *self.name = name* end def hello puts self.name # the same as *puts @name* end end a = Moo.new a.hello() # should give no output a.moo('zaooza') a.hello() # Hey! Why does it prints nothing? a.foo('zaooza') a.hello() # whoa! This one shows 'zaooza'! 

尝试运行这个代码,你会看到=)