Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为什么字符串+;fixnum加法生成强制错误?_Ruby - Fatal编程技术网

Ruby 为什么字符串+;fixnum加法生成强制错误?

Ruby 为什么字符串+;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

为什么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 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'的操作数类型”