Ruby Nil和Zero

时间:2011-06-17 18:40:55

标签: ruby

Ruby的NilClass实例中的to_i方法返回零的事实背后的科学是什么?返回 nil 或提出异常会不会更合乎逻辑?

6 个答案:

答案 0 :(得分:15)

它符合Ruby的宽容理念(与Python的严格性相反):

nil.to_i #=> 0 
"".to_i #=> 0
"123hello".to_i #=> 123
"hello".to_i #=> 0

正如Zabba所述,您可以使用Kernel#Integer(string)进行严格转换。

答案 1 :(得分:14)

NilClass定义#to_i的原因与定义#to_a返回[].的原因相同。它为您提供了正确的类型,但却是一种空的值。

这实际上非常有用。例如:

<%= big.long.expr.nil? ? "" : big.long.expr %>

变为:

<%= big.long.expr %>

好多了! (Erb正在调用#to_s,对于nil,是“”。)并且:

if how.now.brown.cow && how.now.brown.cow[0]
  how.now.brown.cow[0]
else
  0
end

变为:

how.now.brown.cow.to_a[0].to_i

当只需要表示时,存在短转换。长时间的转换是Ruby核心方法调用的转换,它们需要非常接近的东西。如果您想进行类型检查,请使用它们。

那是:

thing.to_int # only works when almost Integer already. NilClass throws NoMethodError

thing.to_i # this works for anything that cares to define a conversion

答案 2 :(得分:7)

to_i表示“如果可以,请将我转换为整数”。

如果你想“如果你非常像整数,给我你的整数值,否则给出NoMethodError”,然后使用.to_int

另一个问题是询问to_ito_intto_sto_str之间的区别等。如果您希望我找到它,请告诉我对你而言。

答案 3 :(得分:6)

to_i的协议表示您必须返回Integer,并且您不得引发异常。您的两条建议都至少违反了其中一条规则。所以,不,这些不仅不合逻辑,而且只会无效。

但请注意,nil 不会回复to_int。如果确实回复to_int,那确实会“不合逻辑”。

答案 4 :(得分:3)

如果您恰好在Rails中,那么您可以使用try

nil.to_i # => 0
nil.try :to_i # => nil

答案 5 :(得分:0)

一种简洁的Ruby 2.3+方法,用于返回nil的{​​{1}}而不是0,是使用safe navigation operator

nil.to_i