ごとけんです

In message "[ruby-list:19953] メソッド名の制限?"
    on 99/12/28, "Hideaki Takata" <hideakit / d3.dion.ne.jp> writes:
>たとえば、
>
>Shikaku.set_x_from(0)to(200)_set_y_from(0)to(100)
># ShikakuをX座標で0から200、Y座標で0から100の長方形にする
>
>といった、書式ができたら便利かなと考えてるのですが、こういう書式を
>容認すると、何か問題があるでしょうか?

今のRubyで出来ることには、

Shikaku.set(:x_from => 0, :x_to => 200, :y_from => 0, :y_to => 100)

なんてのがあります。引数は一つのハッシュと解釈されます。

class Shikaku
  def set(arg)
    if arg.size == 1 && arg[0].is_a? Hash
      @x_from = arg[:x_from] || @x_from
      @x_to   = arg[:x_to]   || @x_to
      @y_from = arg[:y_from] || @y_from
      @y_to   = arg[:y_to]   || @y_to
    elsif arg.size < 5
      set4(*arg)
    end
    return self
  end

  private
  def set4(x0 = @x_from, x1 = @x_to, y0 = @y_from, y1 = @y_to)
     @x_from, @x_to, @y_from, @y_to = [x0,x1,y0,y1].collect{|e| e.to_i}
  end
end

>それともう一つ、[]を使ったメソッド名について
>def []
>とか
>def []=
>は、許されるのに
>class Recipe
>    def zairyou[]
># do something
>    end
>    def zairyou[]=
># do something
>    end
>    def tejun[]
># do something
>    end
>    def tejun[]=
># do something
>    end
>end
>みたいなメソッドは許されないのは何かこういうメソッドが悪い理由があるの
>でしょうか?

見ためを同じにするには、

class Recipe
  def initialize
    @zairyou = []
    @tejun = []
  end

  attr_reader :zairyou, :tejun
end

という手があります。この場合 Recipe#zairyou は配列 @zairyou 
を返すので、recipe.zairyou[0] = oniku とかが出来ます。もちろ
ん配列である必要はないので、必要な機能を持ったオブジェクトで 
@zairyou と @tejun を初期化すれば良いわけです。

-- gotoken