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. 新しいローカル変数を作成しようとしていないことを Ruby が認識できるように、setter メソッドを呼び出すときは の代わりに を使用する必要があります。self.foo = xxxfoo = xxx

    • do_something同様に、メソッドと同じ名前の既存のローカル変数があるというまれなイベントでは、変数を読み取ってしまうため、 を使用self.do_somethingしてメソッドを呼び出す必要があります。do_something
  3. を使用してプライベート メソッドを呼び出すことはできません。self.foo(...)代わりに ただ を呼び出す必要があります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

このチュートリアルに従って、自己ポインタを使用する必要はありません。しかし、名前の競合を解決するためにthis (または私たちの場合は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'!

このコードを実行してみてください =)

于 2011-01-15T13:04:48.093 に答える