来自python背景,我习惯于运行只提供我需要的参数的函数:
def f(a=1,b=2)
print a,b
f(b=3) #prints "1 3"
Ruby似乎为可选参数提供了相同的语法:
def f(a=1, b=2)
puts "#{a} #{b}"
end
但是运行f(b=3)
会打印3 2
。
我的猜测是它在函数调用发生之前评估b=3
,并将其作为第一个参数传递。
这种解释是否正确,是否有办法调用提供任意参数的函数?
答案 0 :(得分:3)
f(b=3)
表示局部变量b
创建时将值赋值为3
,然后将其作为参数传递。方法实际参数a
中的儿子获得了值3
,而b
的默认值为2
。
因此正在运行f(b=3)
打印3 2
而不是。
在Ruby中调用方法时,只是将值传递给方法实际参数,没有范围来设置方法调用区域中实际参数的值。
您应该使用Keyword Arguments
来满足您的需求。我不会写代码,因为@sawa为你做了。
答案 1 :(得分:2)
请注意,在方法调用之前会评估所有参数。如果您执行f(b = 3)
,则首先进行值赋值b = 3
,其返回值为3
,并将其用作参数,因此它与执行{{1}相同}。由于您只提供一个参数,因此它将被解释为第一个参数f(3)
,默认值将用于a
。
您使用的是错误的构造。这是做到这一点的方法:
b
正在使用Ruby 2.0中引入的关键字参数,如Arup的答案链接到的页面中所述。
这是Ruby 1.8,Ruby 1.9的解决方法。
def f a: 1, b: 2
puts "#{a} #{b}"
end
f(b: 3)
# => 1 3