Существует следующий код:method_missing и define_method в Рубине
class MyOpenStruct
def initialize(initial_values = {})
@values = initial_values
end
def _singleton_class
class << self
self
end
end
def method_missing(name, *args, &block)
if name[-1] == "="
base_name = name[0..-2].intern
puts "add_method_to_set"
self.class.add_method_to_set(base_name)
@values[base_name] = args[0]
else
puts "add_method_to_get"
self.class.add_method_to_get(base_name)
@values[name]
end
end
def self.add_method_to_get(name)
define_method(name) do |value|
@values[name]
end
end
def self.add_method_to_set(name)
define_method(name) do |value|
@values[name] = value
end
end
end
obj1 = MyOpenStruct.new(name: "Dave")
obj1.address = "1"
obj2 = MyOpenStruct.new(name: "Dave")
obj2.address = "2"
Я хочу сделать следующее вещь: когда я выполнить некоторый метод (obj1.address) и он отсутствует, я хочу, чтобы добавить этот метод к моему Класс MyOpenStruct. Но когда я выполняю свой код, я теряю «два раза» вместо одного. Зачем? Я не понимаю. Пожалуйста, объясните это мне. Благодарю.
Не было бы лучше просто засеять начальный набор с некоторыми значениями по умолчанию, как вызов 'супер ({адрес: ''} .merge (initial_values))' 'внутри initialize'? – tadman
вы должны просто наследовать от «OpenStruct», если хотите эту функциональность, я сделал это, как только я пошел нормально. – Orlando
Подсказка: проверьте имена метода, который вы определяете –