質問: ruby:自己拡張 rubyでは、extendの基本的な考え方を理解しています。しかし、このコードセグメントでは何が起きているのでしょうか?具体的には、extendは何をしますか?インスタンスメソッドをクラスメソッドにする便利な方法ですか?最初からクラスメソッドを指定するのではなく、なぜこのようにしたのですか?module rake include test::unit::assertions def run_tests # etc. end # what does the next line do? extend self end
回答: リンクの腐敗を防ぐため、user83510によってリンクされた chris wanstrathのブログ投稿 が(彼の許可を得て)以下に再投稿されます。それでも、オリジナルに勝るものはありませんので、それが機能し続ける限り、彼のリンクを使用してください。→singing 'singletons 2008年11月18日私には理解できないことがあります。例えば、デヴィッド・ボウイ。または南半球。しかし、rubyのシングルトンほど私の心を揺さぶるものはありません。本当に、それはまったく不要だからです。彼らはあなたのコードで何をしたいのですか?require 'net/http' # first you setup your singleton class cheat include singleton def initialize @host = 'http://cheat.errtheblog.com/' @http = net::http.start(uri.parse(@host).host) end def sheet(name) @http.get("/s/#{name}").body end end # then you use it cheat.instance.sheet 'migrations' cheat.instance.sheet 'yahoo_ceo' しかし、それはクレイジーです。力と戦う。require 'net/http' # here's how we roll module cheat extend self def host @host ||= 'http://cheat.errtheblog.com/' end def http @http ||= net::http.start(uri.parse(host).host) end def sheet(name) http.get("/s/#{name}").body end end # then you use it cheat.sheet 'migrations' cheat.sheet 'singletons' なんで? apiはより簡潔で、コードのテスト、モック、およびスタブの作成が簡単であり、必要に応じて適切なクラスに変換するのは簡単です。((著作権は10のクリス・ワンストラスのはずです))