2017-02-22 18 views
1

私は拡張のための2種類の構文を書いていますが、1つのリターン50、他のリターン70、誰もが説明することができる別の動作が表示されますか?ルビーの拡張構文はどのように機能していますか?

module Discount 
    def cost 
    super + 20 
    end 
end 

class Toy 
    extend Discount 
    def cost 
    50 
    end 
end 

# check 
Toy.new.cost #=> 50 

しかし:あなたはクラス宣言、私の際extendを呼び出す最初のスニペットで

module Discount 
    def cost 
    super + 20 
    end 
end 

class Toy 
    def cost 
    50 
    end 
end 

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

に行く私はより多くの一例を与える: 'クラスバーガー デフ スーパー+ 10 エンド エンドのコストデフエンド エンド モジュールチーズバーガー の費用 モジュールLargeBurger def cost super + 15 end end = Burger.new はburger.extend(チーズバーガーは) は、burger.extend(LargeBurger)は、出力60と75以上の – Tsao

+0

コードを.cost'置く新しい拡張モジュールのコストメソッドが古いコストをオーバーライドしていないに見えます.costます バーガーバージョン – Tsao

+0

それは私をちょっと混乱させます – Tsao

答えて

2

。 e。明らかにクラスであるToyオブジェクトに。 Toy.extend(Discount)を呼び出すのと同じです。

2番目のスニペットでは、extendToy.new(これは明らかにToyインスタンスです)です。

関連する問題