永井@知能.九工大です.

>>>>> "F" == Tadayoshi Funaba <tadf / kt.rim.or.jp> writes:
>> はい,そうだと思います.だからこそ,賛成したわけです.(^_^)
F> そうすか。きっと反論されると思っていたのに、なにもなかったのでちょっと
F> 拍子抜けして、思わず確認してしまいました :-)

期待を裏切ってしまい,すみませんでした.(^_^)

>> ところでこういうのはいかがですか?
F> 構造体ってメンバへのアクセスメソッドを定義してるってことなのかな。今は
F> メンバのひとつをシンボルで参照するということもできないんじゃないかと思
F> うけど、どうなんでしょう、なかなか難しそうに思えますが。

そうですね.確かにこれはめちゃくちゃですね.(^_^;
では,というわけで,こういうのはいかがでしょうか?

Array#slice!(idx_list,[values])
Array#slice!(idx_list,[values]){|idx,val| ... }
   配列 idx_list の各要素を index とする self の要素の並びを配列に
   して返す.生成される配列の要素順は idx_list の順に依存する.
   配列 values が与えられたときは,idx_list と対応する配列要素を対
   応する値で置き換える (不足分は nil になる).
   イテレータとして呼び出されたときは,values による置き換えの後,
   idx_list に対応する要素をイテレータを評価した結果で置き換える.

   (例) param=[2,1,4]; a = [-1,-2,-3,-4,-5]
        a.slice!(param,[0,0])  ==> [0, 0, nil]
        p a                    ==> [-1, 0, 0, -4, nil]
        a.slice!(param,[1,2,3]){|idx, val| 
           print "arry[#{idx}] == #{val}\n"; val*2}
                               ==> [2, 4, 6]   (出力) arry[2] == 1
                                                      arry[1] == 2
                                                      arry[4] == 3
        p a                    ==> [-1, 4, 2, -4, 6]

Array#slice(idx_list)
Array#slice(idx_list){|idx,val| ... }
   配列 idx_list の各要素を index とする self の要素の並びを配列に
   して返す.生成される配列の要素順は idx_list の順に依存する.
   イテレータとして呼び出されたときは,idx_list に対応する要素につ
   いてイテレータを評価した結果を配列にして出力する.

Hash#slice!(idx_list,[values])
Hash#slice!(idx_list,[values]){|idx,val| ... }
Hash#slice(idx_list)
Hash#slice(idx_list){|idx,val| ... }
   Array#slice に同様

   (例) param=['foo','bar','baz']
        a = {'asdf'=>-1, 'bar'=>-2, 'foo'=>-3, 'zxcv'=>-4, 'baz'=>-5}
        a.slice!(param,[0,0])  ==> [0,0,nil]
        p a   ==>   {"foo"=>0, "bar"=>0, "zxcv"=>-4, "asdf"=>-1}

Struct#slice!(mem_list,[values])
Struct#slice!(mem_list,[values]){|mem,val| ... }
Struct#slice(mem_list)
Struct#slice(mem_list){|mem,val| ... }
   第 1 引数がメンバ名の配列になることを除き,Array#slice に同様

   (例) param=['foo','bar','baz']
        sss = Struct.new('SSS',:asdf,:bar,:foo,:zxcv,:baz)
        a = sss.new(-1,-2,-3,-4,-5)
        a.slice!(param,[0,0])  ==> [0,0,nil]
        p a  ==>  #<Struct::SSS asdf=-1, bar=0, foo=0, zxcv=-4, baz=nil>

========================================================
class Array
  def slice! (sel_src,val_src=nil)
    sel = if sel_src then sel_src.dup else [] end
    val = if val_src then val_src.dup else nil end
    rval = []

    if iterator?
      if val
	while (idx = sel.shift)
	  rval.push(self[idx] = yield(idx, val.shift))
	end
      else
	while (idx = sel.shift)
	  rval.push(self[idx] = yield(idx, self[idx]))
	end
      end

    else
      if val
	while (idx = sel.shift)
	  rval.push(self[idx] = val.shift)
	end
      else
	while (idx = sel.shift)
	  rval.push(self[idx])
	end
      end
    end

    rval
  end

  def slice (sel_src)
    sel = if sel_src then sel_src.dup else [] end
    rval = []
    if iterator?
      while (idx = sel.shift)
	rval.push(yield(idx, self[idx]))
      end
    else
      while (idx = sel.shift)
	rval.push(self[idx])
      end
    end

    rval
  end
end

class Hash
  def slice! (sel_src,val_src=nil)
    sel = if sel_src then sel_src.dup else [] end
    val = if val_src then val_src.dup else nil end
    rval = []

    if iterator?
      if val
	while (idx = sel.shift)
	  rval.push(self[idx] = yield(idx, val.shift))
	end
      else
	while (idx = sel.shift)
	  rval.push(self[idx] = yield(idx, self[idx]))
	end
      end
    else
      if val
	while (idx = sel.shift)
	  rval.push(self[idx] = val.shift)
	end
      else
	while (idx = sel.shift)
	  rval.push(self[idx])
	end
      end
    end

    rval
  end

  def slice (sel_src)
    sel = if sel_src then sel_src.dup else [] end
    rval = []
    if iterator?
      while (idx = sel.shift)
	rval.push(yield(idx, self[idx]))
      end
    else
      while (idx = sel.shift)
	rval.push(self[idx])
      end
    end
    rval
  end
end

class Struct
  def slice! (sel_src,val_src=nil)
    sel = if sel_src then sel_src.dup else [] end
    val = if val_src then val_src.dup else nil end
    rval = []

    if iterator?
      if val
	while (idx = sel.shift)
	  rval.push(eval("self.#{idx} = yield(idx, val.shift)"))
	end
      else
	while (idx = sel.shift)
	  rval.push(eval("self.#{idx} = yield(idx, self.#{idx})"))
	end
      end

    else
      if val
	while (idx = sel.shift)
	  rval.push(eval("self.#{idx} = val.shift"))
	end
      else
	while (idx = sel.shift)
	  rval.push(eval("self.#{idx}"))
	end
      end
    end

    rval
  end

  def slice (sel_src)
    sel = if sel_src then sel_src.dup else [] end
    rval = []
    if iterator?
      while (idx = sel.shift)
	rval.push(yield(idx, eval("self.#{idx}")))
      end
    else
      while (idx = sel.shift)
	rval.push(eval("self.#{idx}"))
      end
    end
    rval
  end
end
========================================================

-- 
                                         永井 秀利 (九工大 知能情報)
                                             nagai / ai.kyutech.ac.jp