7

Rubyでは、ローカル変数を割り当てるだけです。

sound = "bang". 

それはmain.sound=("bang")方法ですか?もしそうなら、そのメソッド "sound=" はどこでどのように定義されていますか? またはその割り当てはどのように機能していますか?そうでない場合、実際に何が起こっているのですか?

セッターメソッドの場合、 x.sound=("bang") と言うでしょう。そして、引数「bang」を使用してオブジェクト「x」でメソッド「sound =」を呼び出しています。インスタンス変数「sound」を作成しています。

そして、私はそのすべてを描くことができます。ただし、「メイン」オブジェクトで変数を割り当てる場合はそうではありません。私が知る限り、それは Object クラスのインスタンス変数ではありません...それともそうですか? 私は困惑している。

4

3 に答える 3

1

変数の割り当ては、犬に「Spot」という名前を付けるのと同じように、オブジェクトへの参照を作成するだけです。「=」はメソッドを呼び出していません。

sound@ZachSmith のコメントのように、 「sound」という名前のローカル変数または「sound」という名前のメソッドを参照できるような単純な式self。このあいまいさを解決するために、Ruby は、変数への以前の代入を「見た」場合、識別子をローカル変数として扱います。

于 2014-01-05T14:13:54.880 に答える
0

それは main.sound=("bang") メソッドですか?

いいえmain.sound="bang"、インスタンス変数またはその変数の要素を設定する必要があります。
dot( main.sound) を使用すると、オブジェクトに何らかのメソッド (この場合はsound) を実行するように指示できます。

ローカル変数を管理するには、ruby で新しいスコープを作成します。

class E
  a = 42

  def give_a
    puts a
  end

  def self.give_a
    puts a
  end
  binding 
end
bin_e = _ # on pry
E.give_a     # error
E.new.give_a # error

どちらの方法も について知りませんa。クラスを作成すると、aすぐに消え、ガベージ コレクターによって削除されます。ただし、メソッドを使用してその値を取得できますbinding。ローカルスコープをどこかに保存し、それを変数に割り当てることができます。

bin.eval "a" # 42

lambdas には、定義された場所にスコープがあります。

local_var_a = 42
lamb = ->{puts local_var_a} 
lamb.call() # 42
于 2014-01-05T14:39:52.120 に答える