From: Akinori MUSHA aka knu Date: 2000-01-06T17:33:42+09:00 Subject: [ruby-dev:8855] Re: [REQ] Array#each{|a,b,...|}, Array#shift/pop(num)  knuです。 At Thu, 6 Jan 2000 15:59:13 +0900, Akinori MUSHA aka knu 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 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/