2017-02-22 55 views
1

Я пишу два вида синтаксиса для расширения, но появляется другое поведение, одно возвращение 50, другое возвращение 70, кто-нибудь может объяснить, почему?Как работает синтаксис расширения ruby?

module Discount 
    def cost 
    super + 20 
    end 
end 

class Toy 
    extend Discount 
    def cost 
    50 
    end 
end 

# check 
Toy.new.cost #=> 50 

Но:

module Discount 
    def cost 
    super + 20 
    end 
end 

class Toy 
    def cost 
    50 
    end 
end 

# check 
Toy.new.extend(Discount).cost #=>70 
+0

Дают еще один пример: класса 'Burger Защиту стоить конца конец модуля чизбургера Защиту стоимость супер + 10 концевых конца модуль LargeBurger def стоимость super + 15 конец конец гамбургер = Burger.new ставит burger.extend (чизбургер) .cost ставит burger.extend (LargeBurger) .cost' – Tsao

+0

Код выше выхода 60 и 75, выглядит новый метод расширения стоимости модуля не отменяет старую стоимость version – Tsao

+0

Это немного меня смущает – Tsao

ответ

2

В первом фрагменте кода вы звоните extend во время объявления класса, т.е.. е. на Toy объект, который, по-видимому, является классом. Это то же самое, что и вызов Toy.extend(Discount).

Во втором фрагменте вы extendToy.new, который, по-видимому, является экземпляром Toy.

1

Объект # extend - это просто ярлык, который включает в себя модуль в eigenclass приемника.

для получения дополнительной информации о eigenclasses перейти к https://en.wikipedia.org/wiki/Metaclass#In_Ruby

 Смежные вопросы

  • Нет связанных вопросов^_^