2016-03-24 9 views
1

までmy attemptまでthis questionと答えていましたが、私はいつも引数が左から右に評価されたと仮定していました。例えば、我々はある方法を持っています:Rubyでメソッドの引数がどのような順序で評価されますか?

def foo(a,b,c) 

時間がたつにつれてRubyプログラムで変数の定義と値を監視する方法はありますか? foo 0,1,2に電話すると、その変数が次の順序でどのように割り当てられるのを証明できますか?

時間0:a = 0

時間1:b = 1

時間2:c = 2

私はa, b, cの引数の同じタイプを持っていますが、それは潜在的にアップマディードますので、私の例は自明で実現しますデフォルトの引数、キーワードの引数、および配列の引数を導入するとき。誰も答えを知っていないなら、私は答えを決定する方法についての提案を感謝します。

基本的には、Ruby相当のthisです。

答えて

2

をISO Rubyの言語仕様は、引数が、彼らはプログラムテキストに表示される順序でパラメータにバインドされていることを述べています。しかし、その仕様が、と評価されたことを意味するかどうかについては曖昧です。の順に指定してください。

RubySpecでは、AFAICSはメソッド引数の評価順序について何も言及していません。

したがって、答えは次のように思われます。メソッド引数の評価順序は保証されていません。異なる実装間で異なる場合があり、同じ実装の異なるバージョン間で異なる場合があり、同じ実装の同じバージョンの2つの実行間で異なる場合があります。同じメソッドへの2つの呼び出し間で異なる場合もあります。それらは並行して評価することができる。

あなたはわかりません。

+0

決定的な順序を知らないのは少しイライラしますが、あなたは正しいです。 1つの例では、左から右ではないコードをいくつか表示することができますが、必ずしも必ずしもそうであるとは限りません。正式な情報源がなければ私たちは知ることができないだろう。 –

1

おそらく、オブジェクトの初期化を記録し、後でそれらをスタックで見ることができます。この場合

module Record 
    @@stack = [] 
    def initialize *; super; @@stack.push(self) end 
    def self.stack; @@stack end 
end 

class String 
    prepend Record 
end 

def foo a, b, c; end 

foo(String.new("x"), String.new("y"), String.new("z")) 
Record.stack # => ["x", "y", "z"] 

abcがこの順に評価されます。既定値では

は、あなたが見ることができます:

def foo a, b, c = String.new("c"); end 

foo(String.new("x"), String.new("y")) 
Record.stack # => ["x", "y", "c"] 
+0

これはかなり天才です。私はこれで遊ぶつもりです。 –

2
def arg_test(a=Time.now, b=Time.now) 
    puts "left to right" if a < b 
end 

arg_test #=> left to right 
関連する問題