Ruby零和零

Ruby零和零,ruby,Ruby,Ruby的NilClass实例中的to_i方法返回零这一事实背后的科学是什么?返回nil或引发异常不是更符合逻辑吗 它符合Ruby的许可哲学(例如,与Python的严格性相反): 正如Zabba所指出的,您可以使用进行严格转换。to_i的意思是“如果可以,请将我转换为整数” 如果您想要“如果您非常像整数,请给我您的整数值,否则请给一个NoMethodError”,然后使用.to\u int 还有另一个问题问到到i和到int,到s与到str之间的区别。请告诉我您是否希望我为您找到它。NilClas

Ruby的NilClass实例中的to_i方法返回零这一事实背后的科学是什么?返回nil或引发异常不是更符合逻辑吗

它符合Ruby的许可哲学(例如,与Python的严格性相反):

正如Zabba所指出的,您可以使用进行严格转换。

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