这不是特定于 Rails 的——我只是以 Rails 为例。
我在 Rails 中有一个模型:
class Item < ActiveRecord::Base
def hello
puts "Hello, #{self.name}"
end
end
(假设Item
模型(类)有一个名为 的方法name
。)我什么时候需要使用self.name
,什么时候可以只使用name
(例如,#{name}
)?
在调用方法时倾向于省略是惯用的;self.
通常从不需要它。
调用 setter 方法时必须使用,而不是,以便 Ruby 意识到您没有尝试创建新的局部变量。self.foo = xxx
foo = xxx
do_something
与方法同名的现有局部变量,您必须使用它self.do_something
来调用该方法,因为do_something
最终会读取该变量。你不能用来self.foo(...)
调用私有方法;您必须改为调用 just foo(...)
。
如果省略self
Ruby 将首先查找具有该名称的局部变量,然后查找实例方法。写起来不习惯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'!
尝试运行这段代码,你会看到 =)