1

我有一个类Foo,它有几种方法,如button_0_0, button_0_1, button_0_2,button_1_0等。

我希望能够通过以下语法交替访问这些:

foo.button[0][1]
foo.button[1][2]
# etc.

我知道我可以创建一个@button实例变量并遍历所有button_*访问器并以这种方式添加它们,但这似乎有点笨拙,并且并没有真正遵循做事的“红宝石方式”。

我想知道是否有更简洁的 Rubyish 解决方案来解决这个问题(也许通过使用method_missing?)——有人知道更好的方法吗?

(我已经部分解决了这个问题,但我被困在方括号中,因为[]在缺少的方法上调用了一个新方法......)

4

1 回答 1

3
class Foo
  def button
    Button.new(self)
  end
  def button_0_1
    "zero-one"
  end
  def button_0_2
    "zero-two"
  end

  private
  class Button
    def initialize(parent)
      @parent           = parent
      @first_dimension  = nil
    end
    def [](index)
      if @first_dimension.nil?
        @first_dimension = index
        self
      else
        @parent.send("button_#{@first_dimension}_#{index}")
      end
    end
  end
end
puts Foo.new.button[0][1]
puts Foo.new.button[0][2]
于 2009-06-15T16:48:03.157 回答