什么时候在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}
)
-
喜欢省略
self.
是惯用的self.
调用方法时; 这通常是不需要的。 -
当调用一个setter方法而不是
foo = xxx
,你必须使用self.foo = xxx
,这样Ruby才会意识到你没有试图创build一个新的局部variables。- 同样的,万一你有一个与方法同名的现有局部variables
do_something
,你必须使用self.do_something
来调用这个方法,因为do_something
最终会读取variables。
- 同样的,万一你有一个与方法同名的现有局部variables
-
您不能使用
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.name
和self.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'!
尝试运行这个代码,你会看到=)