NoMethoErrorto_i因为类没有方法而引发:
[].to_i # >> NoMethodError (undefined method `to_i' for []:Array)
Run Code Online (Sandbox Code Playgroud)
毫无疑问的是,1i有方法to_i和to_f,所以它响应他们.但实际上这看起来非常棘手.
1i.respond_to?(:to_i) # => true
1i.to_i # >> RangeError (can't convert 0+1i into Integer)
Run Code Online (Sandbox Code Playgroud)
Range班级来自哪里?
当然,1i有方法.to_i和.to_f所以它会响应它们.但实际上这看起来很棘手!
是的,它回应了他们.当您调用to_i复杂的文字时1i,该方法会抛出一个RangeError.那与Range班级无关; 它告诉你,尽管1i有一个to_i来自类的方法,但Complex它的具体值不是可以获得有意义结果的值.
或者换一种说法,那就是做一个对象,其虚部不为零,甚至不准确的调用时:Complex::to_i
to_i→整数
如果可能,以整数形式返回值(虚部应该恰好为零).
Run Code Online (Sandbox Code Playgroud)Complex(1, 0).to_i #=> 1 Complex(1, 0.0).to_i # RangeError Complex(1, 2).to_i # RangeError
A RangeError大致传达一个参数超出了它所提供的函数范围,即数学意义上的"范围". Complex将"范围"感应用于目标对象有点不寻常,而不是方法参数,但它仍然有意义.