Ruby零和零
Ruby的NilClass实例中的to_i方法返回零这一事实背后的科学是什么?返回nil或引发异常不是更符合逻辑吗 它符合Ruby的许可哲学(例如,与Python的严格性相反): 正如Zabba所指出的,您可以使用进行严格转换。Ruby零和零,ruby,Ruby,Ruby的NilClass实例中的to_i方法返回零这一事实背后的科学是什么?返回nil或引发异常不是更符合逻辑吗 它符合Ruby的许可哲学(例如,与Python的严格性相反): 正如Zabba所指出的,您可以使用进行严格转换。to_i的意思是“如果可以,请将我转换为整数” 如果您想要“如果您非常像整数,请给我您的整数值,否则请给一个NoMethodError”,然后使用.to\u int 还有另一个问题问到到i和到int,到s与到str之间的区别。请告诉我您是否希望我为您找到它。NilClas
to_i
的意思是“如果可以,请将我转换为整数”
如果您想要“如果您非常像整数,请给我您的整数值,否则请给一个NoMethodError”,然后使用.to\u int
还有另一个问题问到
到i
和到int
,到s
与到str
之间的区别。请告诉我您是否希望我为您找到它。NilClass
定义了,到i
,因为它定义了一个返回
它为您提供了正确类型的东西,但却是一种空值
这实际上非常有用。例如:
<%= big.long.expr.nil? ? "" : big.long.expr %>
变成:
<%= big.long.expr %>
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
to_i
协议规定必须返回一个整数
,并且不能引发异常。您的两个建议至少违反了其中一条规则。所以,不,这些不仅不符合逻辑,而且完全无效
但是,请注意,
nil
不响应到int
。如果它确实响应了到_int
,那确实是“不合逻辑的”。如果您正好在Rails中,那么您可以使用try
:
nil.to_i # => 0
nil.try :to_i # => nil
对于
nil.to_i
而不是0,返回nil
的简洁Ruby 2.3+方法是使用:
相关:如果要在失败时引发异常,可以使用
n=Integer(str)
。不需要使用正则表达式。如果你想在字符串不完全是数字时出错(比如“123hello”),你可以这样做:Integer(“123hello”)
(抛出一个ArgumentError
)“好多了!”是的,这取决于你和项目中的其他人对Ruby的了解程度以及你对非直观行为的依赖程度nil.to_i
返回0而不是引发异常在逻辑上没有多大意义。如何从nil
获取0
?它也不像nil==0
返回true,但是to_i
意味着一种等价性。@Ed s:不,to_int
意味着一种等价性,to_i
太松散了,它实际上并不意味着什么。回答得好!我一直忽略了长转换,现在我可以理解它们以及它们如何符合ruby的理念。协议规定to_I
必须返回一个整数,这一事实并不能使此行为符合逻辑,它只是使其符合逻辑(给定,即使不合逻辑,也最好是符合逻辑的)
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
nil.to_i # => 0
nil.try :to_i # => nil
irb(main):001:0> nil.to_i
=> 0
irb(main):002:0> nil&.to_i
=> nil