knuです。

At Thu, 6 Jan 2000 15:59:13 +0900,
Akinori MUSHA aka knu <knu / idaemons.org> wrote:
> 	class Array
> 	  def slice!(*args)
> 	    a = self[*args]
> 	    self[*args] = []
> 	    a
> 	  end
> 	end
> 
> が、二引数を与えた場合におかしな動作をしたので気づいたんですが、

 どっちみち、 Integer を一つ与えたときに実行される

	self[i] = []

では要素は削除されないのでこのコードは駄目ですが、それはおいといて、

At Thu, 6 Jan 2000 15:59:05 +0900,
Akinori MUSHA aka knu <knu / idaemons.org> wrote:
>  そうですねえ。もし delete() と別に delete[] というメソッドが
> 定義できればイメージはぴったりなんですが。。

 無理やりやってみました。邪道もいいところですが。。

	class Array
	  def delete(*args)
	    if args.size == 0
	      proc { |a, *args|
		if args.size == 0	# delete[i] / delete[i..j]
		  case a
		  when Integer
		    self[a,1] = []
		  when Range
		    self[a] = []
		  else
		    raise ArgumentError
		  end
		elsif args.size == 1	# delete[i,len]
		  b = args[0]
	
		  Integer === a && Integer === b or raise ArgumentError
	
		  self[a,b] = []
		else
		  raise ArgumentError
		end
	      }
	    elsif args.size == 1	# delete(obj)
	      obj = args[0]
	
	      self.each_index do |i|
		if self[i] == obj
		  self[i,1] = []
		  return true
		end
	      end
	      false
	    else
	      raise ArgumentError
	    end
	  end
	end
	
これで delete(obj) も delete[i] も delete[i,len] も受け付けます。
ただし、先ほど ruby-list に投げたような現象のおかげで、
delete[i..j] はうまく行きません。

 むー。Proc#[] を悪用しているだけという気も。。文法として
obj.method[...] というのを許すというのも難しい問題ですしね。。
(最近 ruby-list で議論がありました)

# 結局これも脱線かい

-- 
                     /
                    /__  __
                   / )  )  ) )  /  http://www.idaemons.org/knu/
Akinori MUSHA aka / (_ /  ( (__(   mailto:knu / idaemons.org

"We are but hungry..  Associated Ita-meshi Daemons!"
                                   http://www.idaemons.org/