Альтернативы переменным уровня класса для class_eval? - PullRequest
3 голосов
/ 02 июля 2010

У меня есть вопрос о лучших методах работы с переменной областью Ruby, используя class_eval.

В этом коде в блоке class_eval локальные переменные first и second не определены.

def parent_method(opts={})
first = opts[:percent]
second = (10 * first).to_i

SecondClass.class_eval do 
  def second_method; return {:a => first, :b => second}; end; 
end   
end

Похоже, это проблема с областью видимости, потому что я нашел единственный способ заставить это работать - сделать переменные первого и второго уровня класса:

def parent_method(opts={})
@@first = opts[:percent]
@@second = (10 * @@first).to_i

SecondClass.class_eval do 
  def second_method; return {:a => @@first, :b => @@second}; end; 
end   
end
  1. Какова лучшая практика для этого сценария? Я понимаю, что глобальные переменные - плохой выбор для этого сценария, потому что из-за широкого диапазона результатов переменные уровня класса аналогично осуждаются?
  2. Помимо работы с областью действия переменных, существуют ли другие способы решения проблемы доступности этих переменных из class_eval?

1 Ответ

5 голосов
/ 02 июля 2010

Проблема не в class_eval, а в def.Когда вы определяете метод таким образом, он вводит новую область видимости.Вот лучший способ это исправить:

def parent_method(opts={})
    first = opts[:percent]
    second = (10 * first).to_i

    SecondClass.class_eval do 
      define_method(:second_method) { return {:a => first, :b => second} }
    end     
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...