福間@福岡 です。

記事 <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/