たとえばインデックスが1から始まる配列(もどき)をあつかうクラスを作りたいとします。とりあえず名前はTable
とでもしましょうか。
class Table # 引数はArray。Table.new([1,2,3,4]) def initialize(ary) @table = ary.dup end end
このクラスにおいて、インデックスで要素を呼び出したり、指定のインデックスの要素を入れ替えたりしたいとしましょう。つまりArray#[]
やArray#[]=
のような働きをするメソッドをTable
クラスにも追加したいというわけです。
ary = [1,2,3] p ary[0] # => 1 Array#[] ary[1] = 1 # Array#[]= p ary # => [1,1,3]
しかしこのとき「名前が英数字メソッド」を利用するのは気が引けます。やはりTable#[]
やTable[]=
を追加したい。ではどうするのか――実は簡単にできてしまいます。こういうところがRubyのよいところですね。
ぐだぐだ書くよりコードで示した方がわかりやすいですね。「男一匹コードで語る」いやはやかっこいい(説明が下手なだけというのは内緒。)
rubyではすべての命令がメソッドであり、通常は「カンマ+英数字名のメソッド」という形式をとります。たとえば"Hello".upcase
のように。しかし一部のメソッドに関してはわかりやすさや慣習を優先して演算子式で示しています。[]
や[]=
はもちろんのこと、+
や*
などもそうですね。そして一部の演算子については再定義が可能になっています。
詳しくは「るりま」の「演算子式#再定義できる演算子」や「クラス/メソッドの定義#演算子式の定義」あたりを参照すると幸せになれるでしょう。あるいは「ruby 再定義」あたりでグーグル先生にお尋ねするのもありかと。