Можно ли вызвать super, чтобы вызвать метод псевдонима в методе, который псевдоним - PullRequest
0 голосов
/ 09 марта 2019

Допустим, в автомобиле модели activerecord есть два логических поля: suv и blue

Если в модели автомобиля определен метод, такой как

  def suv
   something_true? ? super : false
  end
  alias :blue :suv

Теперь, если что-то_три?это правда, "супер" работает, если я вызываю car.suv.Однако, это не работает, если я вызываю car.blue, тогда вместо этого car.blue возвращает значение suv, хранящееся в базе данных.Есть ли способ заставить это работать?

1 Ответ

1 голос
/ 09 марта 2019

Это умная идея, но я не думаю, что она будет работать.Даже если к нему обращаются через псевдоним, вызов super внутри метода suv вызовет только suv.Вы можете использовать метапрограммирование, хотя:

class A
  def a; 1; end
  def b; 2; end
end

class B < A
  def initialize(condition)
    @condition = condition
  end
  %i{a b}.each do |fn|
    define_method(fn) do
      @condition ? super() : "default"
    end
  end
end

puts B.new(false).a # => "default"
puts B.new(false).b # => "default"
puts B.new(true).a  # => 1
puts B.new(true).b  # => 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...