Ruby вызывает дочерний метод из родительского класса

Я пишу программу на рельсах, в которой один класс ведет себя так же, как другой класс. Единственное отличие состоит в том, что существует переменная класса @secret_num, которая вычисляется по-разному между двумя классами. Я хотел бы вызвать конкретный метод суперкласса, но использовать переменную класса из дочернего класса. Что сложно, так это то, что переменная класса не является константой, поэтому я устанавливаю ее в своем собственном методе. Есть ли способ сделать то, что я пытаюсь сделать ниже? Спасибо

Class Foo
  def secret
    return [1,2,3].sample
  end

  def b
    @secret_num = secret
    ... # lots of lines of code that use @secret_num
  end
end

Class Bar < Foo
  def secret
    return [4, 5, 6].sample
  end

  def b
    super    # use @secret_num from class Bar.
  end
end    

Это не работает, потому что вызов super также вызывал метод secret родительского класса, то есть Foo#secret, но мне нужно использовать секретный номер из дочернего класса, то есть Bar#secret.


person Duke Silver    schedule 18.09.2012    source источник
comment
Должна ли это быть переменная класса? Как насчет атрибута?   -  person waldrumpus    schedule 18.09.2012
comment
FWIW, как показывает выбранный ответ, вам не нужно использовать явный оператор return в объявлениях ваших методов. Ruby автоматически возвращает последний оператор в методе.   -  person Colin R    schedule 18.09.2012


Ответы (1)


class Foo
  def secret
    [1,2,3].sample
  end

  def b(secret_num = secret)
    <lots of lines of code that use secret_num>
  end
end

class Bar < Foo
  def secret
    [4, 5, 6].sample
  end
end    

Обратите внимание: вам не нужно передавать secret в качестве аргумента для b. Пока вы не переопределите b в подклассе, наследование позаботится о вызове правильной реализации secret.

Я предпочитаю использовать его в качестве аргумента, чтобы я мог передавать различные значения при тестировании.

person dj2    schedule 18.09.2012