福間@福岡 です。 記事 <19990306025901.A15776 / lib1010.esk.co.jp> において、 Wakou Aoyama <wakou / fsinet.or.jp> さんは書きました : > 先の例では [1,2,3,4,5].select{ [4,3,2] } なんていうのも出来ますし、 > [1,2,3,4,5].select{|last| last..0} というのも出来るようにしてもいいよ > うな気もします。 前者は Array#indices でできるとして、後者に近い感じで、 a = [1,2,3,4,5] a[4..3] #==> [5, 4] a[4..-3] #==> [5, 4, 3] a[-1..0] #==> [5, 4, 3, 2, 1] (== a[0..-1].reverse == a.reverse) a[3, -2] #==> [4, 3] になるようなものを書いてみました。もちろんArray#indicesがRangeを受け取る ようにしてもいいのですが。 class Array alias _bracket [] def [](*args) a0, a1 = args._bracket(0, 2) case args.length when 1 if a0.is_a? Range # self[from..to] first, last = a0.first, a0.last first += length if first < 0 last += length if last < 0 if first > last return _bracket(a0.last..a0.first).reverse end end when 2 # self[start, len] if a1 < 0 return _bracket(a0+a1+1, -a1).reverse end end _bracket(*args) end alias _bracket_assign []= def []=(*args) a0, a1, a2 = args._bracket(0, 3) case args.length when 2 if a0.is_a? Range # self[from..to] = other first, last = a0.first, a0.last first += length if first < 0 last += length if last < 0 if first > last rhs = if a1.is_a? Array then a1.reverse else a1 end return _bracket_assign(a0.last..a0.first, rhs) end end when 3 # self[start, len] = other if a1 < 0 rhs = if a2.is_a? Array then a2.reverse else a2 end return _bracket_assign(a0+a1+1, -a1, rhs) end end _bracket_assign(*args) end end # 素直に last..first や a?.to_a.reverse を渡さないのは単なる趣味です(^^; そういえば、 class Foo def []=(*args) p args end end a = Foo.new a[1] = "foo" #==> [1, "foo"] a[] = "foo" #==> [] は、そういうものなんでしょうか? --- “print %w%Just another Ruby hacker,%.join(%% %% % % )” Yasuhiro Fukuma (福間 康弘) as Yasu.F @ Kitakyushu.Fukuoka.Japan Web site: http://www8.big.or.jp/~yasuf/