Определите методы из шаблона во время выполнения в ruby - PullRequest
3 голосов
/ 27 января 2011

Скажем, у меня есть следующие классы:

class Foo
  attr_accessor :name, :age
end

class Bar
    def initialize(name)
        @foo = Foo.new
        @foo.name = name
    end
end

Я бы хотел определить аксессор на Bar, который просто является псевдонимом для foo.name.Достаточно просто:

def name
  @foo.name
end

def name=(value)
  @foo.name = value
end

С одним свойством это достаточно просто.Однако, скажем, Foo предоставляет несколько свойств, которые я хочу показать через Bar.Вместо того чтобы определять каждый метод вручную, я хочу сделать что-то вроде этого, хотя я знаю, что синтаксис неправильный:

[:name, :age].each do |method|
  def method
    @foo.method
  end

  def method=(value)
    @foo.method = value
  end
end

Итак ... как правильно определить методы, подобные этим?1010 *

Ответы [ 3 ]

2 голосов
/ 27 января 2011

Для динамического определения метода вы можете использовать define_method, который принимает имя метода как символ или строковый аргумент.

Для динамического вызова метода вы можете использовать send, который также принимает имя метода как символ или строку.

[:name, :age].each do |method|
  define_method(method) do
    @foo.send(method)
  end

  define_method("#{method}=") do |value|
    @foo.send("#{method}=", value)
  end
end
1 голос
/ 27 января 2011

См. Delegator класс в стандартной библиотеке Ruby в зависимости от того, сколько методов вы хотите передать.

1 голос
/ 27 января 2011
[:name, :age].each do |method|
  define_method(method) do
    foo.send(method)
  end

  define_method("#{method}=") do |value|
    foo.send("#{method}=", value)
  end
end
...