39

这不是特定于 Rails 的——我只是以 Rails 为例。

我在 Rails 中有一个模型:

class Item < ActiveRecord::Base

  def hello
    puts "Hello, #{self.name}"
  end
end

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

4

3 回答 3

66
  1. 在调用方法时倾向于省略是惯用的;self.通常从不需要它。

  2. 调用 setter 方法时必须使用,而不是,以便 Ruby 意识到您没有尝试创建新的局部变量。self.foo = xxxfoo = xxx

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

于 2011-01-15T18:30:58.693 回答
10

如果省略selfRuby 将首先查找具有该名称的局部变量,然后查找实例方法。写起来不习惯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)
于 2011-01-15T13:05:32.417 回答
0

按照本教程,您无需使用指针。但我认为这个(或在我们的例子中是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'!

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

于 2011-01-15T13:04:48.093 回答