何时在Ruby方法中使用`self.foo`而不是`foo`

jri*_*iff 37 ruby self

这不是Rails特有的 - 我只是以Rails为例.

我在Rails中有一个模型:

class Item < ActiveRecord::Base

  def hello
    puts "Hello, #{self.name}"
  end
end
Run Code Online (Sandbox Code Playgroud)

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

Phr*_*ogz 61

  1. 在调用方法时更喜欢省略它是惯用的self.; 通常从不需要它.

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

    • 类似地,如果您有一个do_something与方法同名的现有局部变量,则必须使用它self.do_something来调用该方法,因为do_something最终将读取该变量.
  3. 不能使用self.foo(...)调用私有方法; 你必须改为打电话foo(...).


tok*_*and 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)
Run Code Online (Sandbox Code Playgroud)