为什么Ruby的默认参数值不能分配给nil参数?

Pat*_*ith 23 ruby

我是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
Run Code Online (Sandbox Code Playgroud)

输出:

Without nil check:
     larry......................... 60
     moe........................... 
With nil check:
     larry......................... 60
     moe........................... 1000
Run Code Online (Sandbox Code Playgroud)

这是预期的行为吗?

我错过了什么ruby-foo?

似乎与nil我习惯null用其他语言思考的"没有价值"不一样.

Jer*_*emy 51

未提供参数时使用默认参数.

如果你提供它nil,那么它将是nil.所以是的,这是预期的行为.


Mik*_*any 36

如果要设置默认值,即使传递了nil,并且仍然允许在没有参数的情况下调用方法,则需要将默认值设置为nil并使用"或等于"运算符:

def foo(bar=nil)
  bar ||= "default value"
  puts bar
end
Run Code Online (Sandbox Code Playgroud)