Как альтернативно обращаться к методам доступа в виде индексов массива? - PullRequest
1 голос
/ 15 июня 2009

У меня есть класс 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?) - Кто-нибудь знает лучший способ сделать это?

(Я понял это частично, но я застрял в квадратных скобках, потому что [] вызывает новый метод для отсутствующего метода ...)

1 Ответ

3 голосов
/ 15 июня 2009
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]
...