アカウント名:
パスワード:
これって型のない言語としては surprise なことだと思う。
しかし、変数の型が動的に変わる言語がこれを踏襲すると混乱の元となる。float も integer も現れうる文脈では x/y と書くことが許されなくなり、場合によって(Ruby風に書けば)x.to_f/y もしくは (x/y).to_i という書き方を強要される。もし、/ がどちらかの意味にまとめられていれば、どちらか
オブジェクトの型が違えば同じメソッドに対して 違う型の値が返ってくるのは当然のような気がするんですけどねぇ。
この手の話題の根拠としてよく挙げられる数学に於いても、 (実数) / (整数) = (実数) (複素数) / (整数) = (複素数) (ベクトル) / (整数) = (ベクトル) (行列) / (整数) = (行列) というように被演算量によって演算の結果は違うわけですし。
require "mathn"
すれば
3/2 # => 3/2 (3/2)*2 # => 3
っていうふうに有理数は有理数として扱えますよ。 これじゃ駄目?(笑)
mathn.rbについてはこちら [ruby-lang.org]
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
皆さんもソースを読むときに、行と行の間を読むような気持ちで見てほしい -- あるハッカー
割り算 (スコア:0)
Re:割り算 (スコア:1)
Re:割り算 (スコア:0)
Re:割り算 (スコア:1)
で、元のコメントに話を戻しますと、Rubyには型が無いわけではなく、「変数に型宣言が不要」というだけで、値には型があります。なので3.0は実数、3は整数で別物と考えられますし、そうすれば不自然な感じはしないんじゃないかと思います。
Re:割り算 (スコア:0)
Re:割り算 (スコア:1)
しかしRationalも実数ではなく有理数です。無理数は含まないので、実数ではありません。
Re:割り算 (スコア:0)
Re:割り算 (スコア:0)
Re:割り算 (スコア:0)
しかし、変数の型が動的に変わる言語がこれを踏襲すると混乱の元となる。float も integer も現れうる文脈では x/y と書くことが許されなくなり、場合によって(Ruby風に書けば)x.to_f/y もしくは (x/y).to_i という書き方を強要される。もし、/ がどちらかの意味にまとめられていれば、どちらか
Re:割り算 (スコア:1)
> ここで問題なのは同じ記号(メソッド)に異なる二つの意味を与えてしまっていることであって
という問題を本質的に回避するためには Java のように演算子オーバーロードを無くすしかないのではないかと。演算子を中心に見るか、class を中心に見るかの差、かなぁ。Java の場合、いわゆる算術演算子は String 型の一部の例外を除けばその適用範囲はプリミティブタイプに限られており、オブジェクトを直接操作するためには利用できない点で上記のような問題は意識されにくくなっているのだと思います。
Only Jav^Hpanese available :-)
Re:割り算 (スコア:1)
> そのオブジェクトにタイプによって演算子の挙動が変わるのはごく当然な気がするのですが
「演算子」で考えるといろいろ変な先入観が入ってしまいそうですが、「メソッド」で考えれば上記はちっとも「ごく当然」ではないですね。
例えばあるオブジェクトの div メソッドの戻り値が float 型なのに別のオブジェクトの div では int で返ってきたりしたらコードを書く人は結構混乱しそう。そういう意味で「同じメソッドには同じ意味を与えるべき」という主張は全くその通りだと思います。
行って戻って結局何も言ってないことと同じになってしまいました。すみません。
Only Jav^Hpanese available :-)
Re:割り算 (スコア:1)
オブジェクトの型が違えば同じメソッドに対して 違う型の値が返ってくるのは当然のような気がするんですけどねぇ。
この手の話題の根拠としてよく挙げられる数学に於いても、
(実数) / (整数) = (実数)
(複素数) / (整数) = (複素数)
(ベクトル) / (整数) = (ベクトル)
(行列) / (整数) = (行列)
というように被演算量によって演算の結果は違うわけですし。
Re:割り算 (スコア:0)
Re:割り算 (スコア:0)
require "mathn"
すれば
3/2 # => 3/2
(3/2)*2 # => 3
っていうふうに有理数は有理数として扱えますよ。 これじゃ駄目?(笑)
mathn.rbについてはこちら [ruby-lang.org]
Re:割り算 (スコア:1)
1 + 1 はFixnumを返し、
'hoge' + 'bar' もFixnumを返すべきです!!