Имею следующее:

class Parent
  def A
    return 'A'
  end
  def B
    return 'B'
  end
end

class Child < Parent
  def A
    super
    return 'Child.A'
  end
  def B
    super
    return 'Child.B'
  end
end

Когда я это сделаю: p Child.A ==> Child.A

А затем я добавил это под приведенным выше кодом.

class Child < Parent
  alias method_of_child_A A
  def A
    method_of_child_A
  end
end

Когда я делаю

p Child.A
=> A

Он возвращает мне «A» вместо «Child.A». И я ищу ребенка. И я бы хотел, чтобы синтаксис также мог делать следующее.

Class GrandChild < Child
  alias method_of_GrandChild_A A #if Grandchild.A doesn't exist, 
                                 #it will alias Child.A instead.
                                 #Which what alias does basically.
  def A
    method_of_GrandChild_A
  end
end

Итак, когда я это сделаю: p GrandChild.A => Child.A

Я не слишком знаком с функцией псевдонима, так может ли кто-нибудь просветить меня? Спасибо!

1
user3163916 6 Янв 2014 в 05:55

1 ответ

Лучший ответ

Я считаю, что ваш код уже работает так, как вы ожидаете:

require 'pry'
class Parent
  def A; 'A'; end
  def B; 'B'; end
end

class Child < Parent
  def A; 'Child.A'; end
  def B; 'Child.B'; end
end

class Child < Parent
  alias method_of_child_A A
  def A
    method_of_child_A
  end
end

p Child.new.A #=> "Child.A"

Мои правки были косметическими, чтобы сделать код немного короче.

1
csexton 6 Янв 2014 в 06:09
А что, если бы я хотел, чтобы определение было супер?
 – 
user3163916
6 Янв 2014 в 06:11
Вы можете просто оставить его там, в примере кода он ничего не делал, поэтому я просто вытащил его. Я бы не стал форматировать производственный код однострочными def - просто пытаюсь быть кратким.
 – 
csexton
6 Янв 2014 в 06:15