Ruby Nil和Zero

Hen*_*zza 14 ruby

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

tok*_*and 15

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

nil.to_i #=> 0 
"".to_i #=> 0
"123hello".to_i #=> 123
"hello".to_i #=> 0
Run Code Online (Sandbox Code Playgroud)

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

  • 您不需要使用正则表达式.如果你想要一个字符串不完全是一个数字(例如"123hello")时出错,你可以这样做:`Integer("123hello")`(抛出一个'ArgumentError`). (3认同)

Dig*_*oss 14

NilClass定义#to_i它定义的相同原因定义#to_a返回[].它给你一些正确的类型,但是一个空的值.

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

<%= big.long.expr.nil? ? "" : big.long.expr %>
Run Code Online (Sandbox Code Playgroud)

变为:

<%= big.long.expr %>
Run Code Online (Sandbox Code Playgroud)

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

if how.now.brown.cow && how.now.brown.cow[0]
  how.now.brown.cow[0]
else
  0
end
Run Code Online (Sandbox Code Playgroud)

变为:

how.now.brown.cow.to_a[0].to_i
Run Code Online (Sandbox Code Playgroud)

当只需要表示时,存在短转换.长时间的转换是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
Run Code Online (Sandbox Code Playgroud)

  • @Ed S.:不,`to_int`意味着等价,`to_i`是如此松懈,它实际上并不意味着什么. (4认同)

And*_*imm 8

to_i 意思是"如果可以的话,将我转换为整数".

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

还有,询问有关的区别另一个问题to_ito_int,to_sto_str等,让我知道,如果你想我帮您找到它.


Jör*_*tag 6

协议to_i说你必须返回一个Integer,你不能提出异常.您的两条建议都至少违反了其中一条规则.所以,不,那些不仅不合逻辑,它们只是无效.

但请注意,nil 没有回应to_int.如果确实做出了回应to_int,那确实会"不合逻辑".


dzu*_*zuc 6

如果你碰巧在 Rails 中,那么你可以使用try

nil.to_i # => 0
nil.try :to_i # => nil
Run Code Online (Sandbox Code Playgroud)