为什么`1i.to_i`引发`RangeError`而不是'NoMethodError`?

S.G*_*ami 4 ruby

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班级来自哪里?

Joh*_*ger 9

当然,1i有方法.to_i和.to_f所以它会响应它们.但实际上这看起来很棘手!

是的,它回应了他们.当您调用to_i复杂的文字时1i,该方法会抛出一个RangeError.那与Range班级无关; 它告诉你,尽管1i有一个to_i来自类的方法,但Complex它的具体值不是可以获得有意义结果的值.

或者换一种说法,那就是做一个对象,其虚部不为零,甚至不准确的调用时:Complex::to_i

to_i→整数

如果可能,以整数形式返回值(虚部应该恰好为零).

Complex(1, 0).to_i    #=> 1
Complex(1, 0.0).to_i  # RangeError
Complex(1, 2).to_i    # RangeError
Run Code Online (Sandbox Code Playgroud)

A RangeError大致传达一个参数超出了它所提供的函数范围,即数学意义上的"范围". Complex将"范围"感应用于目标对象有点不寻常,而不是方法参数,但它仍然有意义.

  • 来自[`RangeError`]的文档(http://ruby-doc.org/core-2.6.1/RangeError.html):_"当给定的数值超出范围时引发."_ (2认同)