2016-03-24 67 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但它可能被搅浑了当您引入默认参数,关键字参数和数组参数时。如果没有人知道答案,我将不胜感激关于如何确定答案的建议。

基本上相当于红宝石this

回答

2

的ISO Ruby语言规范指出参数绑定到的顺序它们出现在程序文本参数。然而,规范含糊不清,这是否也意味着他们按的顺序评估

RubySpec,AFAICS对于方法参数的评估顺序没有任何说法。

所以,答案似乎是:方法参数没有保证评估顺序。不同的实现可能不同,它可能在同一个实现的不同版本之间有所不同,它可能在同一个实现的同一版本的两次运行之间不同,甚至在两次调用同一个实现的方法之间可能会不同。他们可以并行评估。

你只是不知道。

+0

不知道确切的顺序有点令人沮丧,但你是对的。即使你可以用一些代码来展示,但是在一个例子中它不是从左到右,它并不意味着它总是会是。没有官方消息来源,我想我们无法知道。 –

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