28

我是 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用其他语言思考的“没有价值”不同。

4

5 回答 5

65

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

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

于 2012-05-08T20:39:15.227 回答
42

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

def foo(bar=nil)
  bar ||= "default value"
  puts bar
end
于 2014-04-28T14:30:05.697 回答
1

*调用该方法时,您还可以使用 Ruby 的 splat 运算符 ( ):

dudes.each do |k,v|    
  puts format_args(k,*v)
end

输出:

     larry......................... 60
     moe........................... 1000
于 2019-10-15T01:30:42.873 回答
0

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

于 2013-09-28T11:20:03.567 回答
0

在 Ruby 中,方法总是返回一些东西。有时,没有什么可以返回(数据库中的查询变成空的或类似的东西)。nil适用于这些情况;它的意思是“这里什么都没有”,但它对对象的引用。要获得您想要的行为,只需不传递任何参数。

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

talk #=> "Hello"
于 2012-05-08T20:49:06.377 回答