我是Ruby的新手,遇到了一些令我困惑的事情。
我在方法签名中设置了默认参数值。
调用方法时,我将nil
参数传递给该参数。
但未分配默认值;它仍然是nil
。
# method with a default value of 1000 for parameter 'b'
def format_args(a, b=1000)
"\t #{a.ljust(30,'.')} #{b}"
end
# test hash
dudes = {};
dudes["larry"] = 60
dudes["moe"] = nil
# expecting default parameter value
puts "Without nil check:"
dudes.each do |k,v|
puts format_args(k,v)
end
# forcing default parameter value
puts "With nil check:"
dudes.each do |k,v|
if v
puts format_args(k,v)
else
puts format_args(k)
end
end
输出:
Without nil check:
larry......................... 60
moe...........................
With nil check:
larry......................... 60
moe........................... 1000
这是预期的行为吗?
我错过了什么ruby-foo?
似乎nil
与我习惯于在其他语言中考虑null
并不相同“没有价值”。
答案 0 :(得分:49)
未提供参数时使用默认参数。
如果您将其作为nil
提供,那么它将是nil
。所以是的,这是预期的行为。
答案 1 :(得分:33)
如果你想设置一个默认值,即使传递了nil,并且仍然允许在没有参数的情况下调用方法,你需要将默认值设置为nil并使用“或equals”运算符:
def foo(bar=nil)
bar ||= "default value"
puts bar
end
答案 2 :(得分:0)
在Ruby中,方法总会返回一些东西。有时,没有什么可以返回(数据库中的查询变为空或类似的东西)。 nil
适用于那些案件;它意味着“没有在这里”,但是对对象的引用。要获得所需的行为,只需传递无参数。
def talk(msg="Hello")
puts msg
end
talk #=> "Hello"
答案 3 :(得分:0)
在if语句中尝试... v.is_nil?
。
答案 4 :(得分:0)
调用该方法时,还可以使用Ruby的splat运算符(arg
):
*
输出:
dudes.each do |k,v|
puts format_args(k,*v)
end