From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?=) Date: 2003-07-09T01:44:22+09:00 Subject: [ruby-dev:20561] Re: [BigDecimal] changing rule of coerce けいじゅ@いしつかです. In [ruby-dev:20560] the message: "[ruby-dev:20560] Re: [BigDecimal] changing rule of coerce", on Jul/08 23:45(JST) "Shigeo Kobayashi" writes: >小林です。 >> リテラルの代わりに使っているように見えますが, それだけに使い方が限定さ >> れないのが問題ですよね. たとえば, >> # どっかとおいところで >> str = "1.00001...." >> # いろいろやったり, 別メソッドの中などで. >> b0 = BigDecimal.new(...) >> b0 + str >> とやってしまったとき, strを作成したときの意図はBigDecimalでなかったと >> しても, b0+strではBigDecimalとして扱われてしまい, 一見正常に処理されて >> しまいますので, 見つかりづらいバグのもとになってしまいます. >これは変数がタイプを持たない Ruby の特徴として BigDecimal だけの >問題(?)ではないと思います。 Rubyでは変数がタイプを持たないですが, そのかわり, 意図していないものが パラメータとして渡されたときには, いつかはプロトコルミスマッチ (undefined methodなどのエラー)がでるので, その場でバグがわかります. Rubyのプログラムをデバッグするとわかる通り, このメカニズムは案外うまく いっています. 反対にあまりにも, 暗黙の型変換を多用するとその効果がなくなります. 特 に, Rubyでは文字列は非常に多く使われるので, 文字列からの暗黙の変換はで きるだけ限定した方が良いと思います. >逆に、極端な例ですが、 >def add(a,b) > a+b >end >で、Float/Ratinal/BigDecimal に対応できるというメリットもあるわけです >から。 これは, 意図したものを渡すからですね. >> 本当のリテラルを自由に定義できるようにするのは無理かも知れませんが, % >> 記法を拡張するというのはありかも. >> %D(100.10000019) >> %R(10, 20) >> %C(10, 20) >> %M[[1,2],[2,3]] >> 久々にヒットなアイディアだなぁ(^^;;; >同様な事を考えた私の頭も冴えてる? ^^;; 冴えているかも(^^;; __ ---------------------------------------------------->> 石塚 圭樹 <<--- ---------------------------------->> e-mail: keiju@ishitsuka.com <<---