2014-01-05 10 views
7

Rubyでは、私はローカル変数を割り当てます。どのように代入記号が機能するのですか? - Ruby

sound = "bang". 

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

私は、setterメソッドの場合、x.sound =( "bang")と言っていることを知っています。引数 "bang"でオブジェクト "x"のメソッド "sound ="を呼び出しています。インスタンス変数 "sound"を作成しています。

と私はそのすべてを描くことができます。 "main"オブジェクトに変数を代入するときには使用できません。私が知っている限り、それはObjectクラスのインスタンス変数ではありません...またはそれですか?私は困惑している。

+0

この情報は、あなたのすべての質問にお答えするのに十分ではない..です –

+0

背景は私がここで尋ねた質問であるhttp://stackoverflow.com/questions/20932032/naming-methods-as-variables-calling-methods-ruby/20932119#20932119。 –

+0

質問:「コードの背後にあるロジックは何ですか?sound = "bang"?Rubyはそれをどのように解釈していますか? –

答えて

6

ほとんどのプログラミング言語でRubyが含まれていますが、割り当ては奇妙な獣です。それはメソッドや関数ではありません。名前(割り当てのままになっているので左辺値とも呼ばれます)に値を関連付けます。

Rubyでは、割り当て構文を使用して呼び出すことができる=で終わる名前のメソッドを定義する機能が追加されています。

属性アクセサは、クラスのメンバー変数をフェッチして割り当てる他のメソッドを作成するメソッドに過ぎません。

  • に=
  • 属性アクセサによって自動的に生成
  • 方法を終わる名前のプリミティブ=演算子
  • 方法(これらはで終わるメソッドです:

    だから基本的には割り当てを参照してください3つの方法があります=)

+0

ありがとう。私は、私が最初に理解していなかったことを理解するようになり始めていると思う:p –

1

変数の代入は、犬の名前を「斑点」にするなど、オブジェクトへの参照を作成するだけです。 "="はどんなメソッドも呼び出すわけではありません。

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

+0

私は読んでいる1つのルビーの本で終わる名前を持つことができます: "割り当ては、単に通常のメソッドへの呼び出しです"と言う。私はこのメソッドを使った例では "sound ="だからクラス/定義されている? –

+0

@Zach Smith:Rubyインタプリタは、コード内の名前の割り当てがメソッドかローカル変数かどうかについていくつかの決定を下し、それを別々に扱います。 –

+0

助けてくれてありがとう@NeilSlater –

0

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

No. main.sound="bang"は、その変数のインスタンス変数または要素を設定する必要があります。
ドット(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 

lambda sが、彼らが定義された範囲を持っている:

local_var_a = 42 
lamb = ->{puts local_var_a} 
lamb.call() # 42 
関連する問題