Ruby的NilClass实例中的to_i方法返回零的事实背后的科学是什么?返回 nil 或提出异常会不会更合乎逻辑?
答案 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_i
和to_int
,to_s
与to_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