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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么Ruby的默认参数值不能分配给nil参数?相关的知识,希望对你有一定的参考价值。

我是Ruby的新手,遇到了让我感到困惑的事情。

我在方法签名中设置了默认参数值。

在调用方法时,我将nil参数传递给该参数。

但是未分配默认值;它仍然是nil

# method with a default value of 1000 for parameter 'b'
def format_args(a, b=1000)
  "	 #{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的“没有价值”不一样。

答案

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

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

另一答案

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

def foo(bar=nil)
  bar ||= "default value"
  puts bar
end
另一答案

在Ruby中,方法总会返回一些东西。有时,没有什么可以返回(数据库中的查询变为空或类似的东西)。 nil是针对那些案件的;它意味着“没有在这里”,但它是对象的引用。要获得所需的行为,只需传递参数即可。

def talk(msg="Hello")
  puts msg
end

talk #=> "Hello"
另一答案

在if语句中尝试... v.is_nil?

以上是关于为什么Ruby的默认参数值不能分配给nil参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ruby 中为 splat 参数设置默认值

尝试在 ruby​​ on rails 中创建嵌套资源时,“表单中的第一个参数不能包含 nil 或为空”

Ruby - 关键字参数 - 你能把所有的关键字参数当作一个哈希值吗?如何?

将类变量作为默认值分配给类方法参数

是否可以在 Ruby 中使用默认参数定义块?

传入值为 nil 的函数参数的默认值