2011-01-27 12 views
0

Yehudaさんがこのビデオを見ており、Rubyがどのように優れた抽象化を構築するのかを説明しました。サンプルRubyコード、これをどのように抽象化していますか?

class FOWA 
    def self.is_fun 
     def fun? 
      true 
     end 
    end 


    is_fun 
end 

彼は、ルビーで、話してどのようにあなたは何度も何度も自分のクラスのコードを繰り返している場合は、あなたが方法などの観点で物事を考えるすることなく出て、それが抽象ことができ、彼はこのように述べました。メタプログラミング技術を使用していました。

これは何か説明できますか?

これはFOWAのクラスメソッドです(静的メソッドのように、インスタンスを呼び出す必要はありません)。このクラスメソッドは本当にtrueを返す別のメソッドをラッピングするだけです。

これはis_funクラスメソッドが現在実行されているか、何ですか?最後の行 "is_fun"が何をしているのか分かりませんか?クラスの終わりに

http://vimeo.com/11679138

答えて

2

is_fun呼び出しは、静的メソッドを呼び出します。静的メソッドは、FOWAクラスの内部でfun?メソッドを定義します。あなたはクラスの終わりにis_funコールを取る場合は、fun?メソッドが定義されません

f = FOWA.new 
f.fun? 

:次に、あなたはこれを行うことができます。

彼はこの方法では使用しないと述べましたが、クラスにメソッドを動的に追加するのは簡単です。メソッドをサブクラスで利用できるようにしたい場合は、FOWAでis_funを呼び出さずに、サブクラスで呼び出すことができます。 is_funのパラメータがあり、そのパラメータに応じてfun?という定義が変わると、もう少し面白いです。あなたは同じis_fun方法でmoduleを定義し、ちょうどextendmoduleあなたのクラスを持っているとmoduleのメソッドがクラスで利用できる可能性があるため

これはまた、右modulesにつながります。メソッドをFOWAのサブクラスだけで利用できないようにするには、このテクニックを使用します。

+0

私はそれを取得しますが、インスタンスfの呼び出し側またはユーザがf.is_funを呼び出すと、これを行うクラスのdefenitionの代わりに、私が推測するはずのフライでメソッドを作成します。 – Blankman

関連する問題