やはり乗算は可換でないと違和感があるようだ
http://d.hatena.ne.jp/piyo2-moko/20080515#1210858404より
#テキストの演算 #エラー×:print num*(name+"!")+"paf@"(左側にテキストが来るように) name="moko" num=3 name*num # => "mokomokomoko" num*name rescue $! # => #<TypeError: String can't be coerced into Fixnum>
(簡潔に、なおかつxmpfilter形式に変換した)
「文字列 * 整数」は文字列の繰り返しなのだが、「整数 * 文字列」はエラーになるという話。
文字列と整数の乗算が文字列の繰り返しになるのは、一見直感的な定義だ。
だけど、やはり乗算は可換であるのが当然だというのが日常の感覚だろう。だから、整数 * 文字列がエラーになるというのはちょっと違和感を覚える人がいるかも。
だけど、よーく考えてみると「a * b」というのは「a.*(b)」の省略形(syntax sugar)だ。つまり、bを引数にしてaの「*」メソッドを呼んでいるという意味。そう考えるとべつに「a.*(b)」が「b.*(a)」と等しい必要性なんてまったくない。なまじ「a * b」と書けてしまうから違和感を覚えるのだろう。ただ、そう書けることで計算式が通常の記法で書けるという利点がある。
そう、「*」は演算子の形をしているメソッドなのだ。
ちなみに非可換な乗算というのは、Rubyに限らない。たとえば行列の乗算は非可換だ。つまり、「X*Y != Y*X」だ。
さらに、Xがn×m行列で、Yがm×l行列(n != l)のとき、X*Yはできるが、Y*Xはエラーになる。Rubyで「文字列 * 整数」は可能だが、「整数 * 文字列」はエラーになるというのに似ている。
他の非可換な乗算は群論とかの大学数学で出てくる。
require 'matrix' m = Matrix[[1,2,3],[4,5,6]] n = Matrix[[7,8],[9,10],[11,12]] m*n # => Matrix[[58, 64], [139, 154]] n*m # => Matrix[[39, 54, 69], [49, 68, 87], [59, 82, 105]]
追記
うわっ、n×m行列とm×n行列についてしか考えてなかった><>< テラアホスorz
[2008/05/17]追記
行列については高2の数学の教科書・参考書を開いてみるとよい。