Ruby 为什么字符串+;fixnum加法生成强制错误?
为什么ruby加法不能将给定的字符串强制给fixnum和vice vercaRuby 为什么字符串+;fixnum加法生成强制错误?,ruby,Ruby,为什么ruby加法不能将给定的字符串强制给fixnum和vice verca irb>fixnum = 1 => 1 irb> fixnum.class => Fixnum irb> string = "3" => "3" irb> string.class => String irb> string.to_i => 3 irb> fixnum + string TypeError: String can't be coerced
irb>fixnum = 1
=> 1
irb> fixnum.class
=> Fixnum
irb> string = "3"
=> "3"
irb> string.class
=> String
irb> string.to_i
=> 3
irb> fixnum + string
TypeError: String can't be coerced into Fixnum
from (irb):96:in `+'
from (irb):96
from :0
irb(main):097:0>
您需要将变量设置回自身,因为执行
.to\i
操作会返回一个整数值,但不会修改原始对象
>> string = "3"
=> "3"
>> string.class
=> String
>> string.to_i
=> 3
>> string
=> "3"
>> string.class
=> String
>> string = string.to_i
=> 3
>> string.class
=> Fixnum
因为ruby不知道是将字符串转换为int还是将int转换为字符串。例如,java
1+“3”
是“13”
。Ruby更喜欢引发错误,这样用户就可以决定是对一个操作数执行,还是对另一个操作数执行,而不是自动执行错误操作。它会抛出错误,因为Ruby不知道您想要什么。String+fixnum是一个不明确的语句。这可能意味着要将字符串的int值和数字相加,或者将int值和字符串的字符串值相加。例如:
str = "5"
num = 3
puts str.to_i + num
=> 8
puts str + num.to_s
=> 53
ruby只是抛出一个异常,而不是猜测您想要哪个异常。Fixnum++
只是一个方法。它的工作原理如下:
class Fixnum
def +(other)
if Fixnum === other
# normal operation
else
n1, n2= other.coerce(self)
return n1+n2
end
end
end
强制
用于自动数字类型转换。例如,如果执行42+3.141
,则使用此选项。ruby中的字符串不能自动转换为数值。您可以增强字符串
类来实现这一点。你只需要做
class String
def coerce(other)
coerced= case other
when Integer
self.to_i
when
self.to_f
end
return coerced, other
end
end
现在你可以做了
23 + "42" # => 65
0.859 - "4" # => 3.141
这不适用于其他方式<代码>强制
仅适用于数值“23”+42
无效<代码>字符串#+
不会使用强制
简化的
+
是在Fixnum
中完成的,而不是故意在Integer
中完成的Fixnum
和Bignum
有各自的方法,因为它们在内部的工作方式非常不同。这就是我希望ruby自动强制的原因。顺便说一句,python也这么说:“TypeError:不支持+:'int'和'str'的操作数类型”