Complexクラスと!のついたメソッド
Complexは複素数です。
require "complex" c = Complex(1, 2) p c #=> Complex(1, 2) p c.real #=> 1 p c.image #=> 2 p c.arg #=> 1.10714871779409 p c.polar #=> [2.23606797749979, 1.10714871779409] p c.conjugate #=> Complex(1, -2) d = Complex(-1, 0) p d.arg #=> 3.14159265358979 p d.polar #=> [1.0, 3.14159265358979]
Rationalは有理数です。
Rational(分子, 分母)で、約分や分母のゼロチェックをしてオブジェクトを作ります。
Rational.new!というコンストラクタもありますが、こちらは約分も分母のゼロチェックもしません。
ちなみにRational.newはprivateです。
half = Rational(1, 2) one = half + half p half #=> Rational(1, 2) p one #=> Rational(1, 1) p half.to_f #=> 0.5 p one.to_f #=> 1.0 r = Rational(12, 24) p r #=> Rational(1, 2) p Rational.new!(1, 2) #=> Rational(1, 2) p Rational.new!(12, 24) #=> Rational(12, 24) p Rational.new!(1, 0) #=> Rational(1, 0) p Rational(1, 0) #=> in `reduce': denominator is zero (ZeroDivisionError)
疑問:!がついたメソッドは破壊的メソッド(例:String#chomp!)だと思っていたのですが、このRational.new!に!がついている理由は何でしょうね。
追記:kjanaさんから「より安全でない・特殊な・注意を要するメソッドの印として ”!” を付ける」のだそうです。なるほど。情報感謝です。
疑問:では、二つ以上!がついたメソッドはあるでしょうか explode_the_earch!!!!!!! とか。超破壊的メソッド :-)
追記:ri !!とrefe !!ではとりあえず見つかりませんでした。id:walf443さんもコメント感謝です。そういえば、?も似ていますね。Haskellの'だと何個でもつくんですけどね。
> ri !! Nothing known about !! > refe !! not match: !!
といいますか、エラーでした。
def rubyco end def rubyco! end def rubyco!! #=> parse error, unexpected '!', expecting '\n' or ';' end