高橋征義です。

Masahiro Sato <msato / echem.titech.ac.jp>さん:
> どうもありがとうございました。

どういたしまして。

> なかなかメソッドの付け足しのセンスが
> 身に付かなくて苦労しています。
> selfがポイントでしょうか。

「+」とか「-」とかの二項演算子については、引数は一つだけで
もう片方にはselfを使うというのは慣れるまで少しわかりにくい
ところかもしれません。
もっとも、二項演算子は見た目が特殊なメソッドなので、仕方ない
ところではありますが。

「メソッドの付け足しのセンス」はむずかしいですねえ。
例えばさっきのRange#+の例では、(1..3)+[2,4,6] みたいな
こともできる(わりには[2,4,6]+(1..3)はできない)、という
仕様になっています。これがいいかどうかは微妙です。
もっとstrictに、

  def +(a)
    if a.kind_of?(Range)
      raise ArgumentError, "Range以外は使えません(意訳)"
    end
    self.to_a + a.to_a
  end

みたいにした方がいいかもしれません。


というわけで、Rangeにどういう形で付け足すのがいいのかは
判断の余地があるので、いっそ、

  def concat_enums(*args)
    args.collect{|enum|
      enum.to_a
    }.flatten
  end

  # p concat_enums([1,2,3], [5,6,7,8], [10,11])
  # p concat_enums(1..3, 5..8, 10..11)
  # p concat_enums(1..3, [5,6,7,8], 10..11)

みたいなメソッドにすることも考えられます。

……やっぱりむずかしいですねえ(^_^;

高橋征義 (TAKAHASHI Masayoshi)