Задать вопрос
beerdy
@beerdy
https://vk.com/beerdy

Как за метапрограммировать или как просто запрограммировать автодобовление методов (attr_accessor)?

Кажется я начинаю понимать "смысл жизни"
Вот пример:
class Derp
	attr_reader :success
	def initialize
		@success = Success.new
		@sum = 3
		@a = 5
	end
	def boom
		@success.sum = @sum
		@success.a = @a
	end
end

class Success
	attr_accessor :sum, :a
end

obj = Derp.new()
obj.boom
puts obj.success.sum

Как к примеру на лету в Success добавить метод accessor - abc?
И главный вопрос нужно ли оно (если можно пример для особо одаренных))?
И еще вопрос - на быстродействие в этом случае как влияет (только без холивара, а то начнется)
  • Вопрос задан
  • 287 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Fikys
@Fikys
ruby developer
Привет, я могу с ходу назвать 2 способа как это можно сделать.
Первый способ - использовать метод __send__:
class Success
  def new_accessor(attribute)
    self.class.__send__(:attr_accessor, attribute)
  end
end


Второй способ - использовать class_eval:
class Success
  def new_accessor(attribute)
    self.class.class_eval { attr_accessor attribute }
  end
end


Но возникает резонный вопрос: а оно действительно надо? Как сказали выше - отлаживать всю эту магию очень сложно. К тому же, благодаря этому можно очень сильно усложнить понимание кода.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Skarm61
Ruby On Rails developer
Вопрос - а нужно ли? В серьезном проекте запросто может добавить лишнего гемора при отладке и поддержке.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы