1

このようなクラスがある場合:

class Person

  def initialize(options={})
    self.name = options[:name]
  end

  def name=(name)
    @name = name
  end

end

...その後、「name=」メソッドが呼び出され、期待どおりの結果が得られます。しかし、例を少し変更して「name=」への呼び出しから「self」を削除すると、メソッドは呼び出されません。

class Person

  def initialize(options={})
    name = options[:name]
  end

  def name=(name)
    @name = name
  end

end

どうしてこれなの?なぜ「自己」がそこになければならないのですか?私は、暗黙の「自己」が「初期化」コンストラクターで期待どおりに設定されるため、最初の例のように動作するという印象を受けました。

4

2 に答える 2

7

「名前」という名前のローカル変数を作成するか、メンバー変数を使用するかは、Ruby にはわかりません。

self.name は、メンバー変数を使用することを示しています。

ローカル変数を作成したいという構文はないので、それがデフォルトでなければなりません。

(また、メンバー変数は本物ではありませんが、私の言いたいことはわかります)

于 2013-06-29T04:55:54.957 に答える
-2

コンストラクター内からRubyメソッドを呼び出すために「self」が必要なのはなぜですか?

一般的に、それはそうではありません:

class Person
  def initialize(options={})
    set_name(options[:name]) # Calls `set_name` method; no `self.` required
  end

  def set_name(name)
    @name = name
  end
end

コードでの の必要性はself.、コンストラクター内にあることとは関係ありません。initializeを使用せずに、クラス内またはクラス内の他の場所から通常のインスタンス メソッドを呼び出すことができますself.

何が起こっているかというと、Ruby では特殊なケースとして扱われるセッター メソッド (名前が で終わるインスタンス メソッド=、たとえば)を呼び出そうとしていることです。name=

Rubyプログラミング言語によると:

代入式は、オブジェクトを介して呼び出された場合にのみ setter メソッドを呼び出すという規則があります。セッターを定義するクラス内からセッターを使用する場合は、 を介して明示的に呼び出しますself

繰り返しになりますが、コンストラクターの実行中に何がself参照されているかを Ruby が認識していないわけではありません。認識しているのです。この場合は、オブジェクトを介した呼び出しが必要なセッターを呼び出そうとしています。

コード内で、name = options[:name]というローカル変数を作成して設定しますname

于 2013-06-29T05:21:19.120 に答える