nekoTheShadow’s diary

IT業界の片隅でひっそり生きるシステムエンジニアです(´・ω・`)

rubyで[]や[]=を新しく定義するには。

 たとえばインデックスが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 再定義」あたりでグーグル先生にお尋ねするのもありかと。