回答:
これは、インスタンスメソッドをクラスメソッドにする便利な方法です。しかし、より効率的なシングルトンとして使用することもできます。
extend self
。
モジュールでは、selfはモジュールクラス自体です。だから例えば
puts self
レーキを返すので、
extend self
基本的に、Rakeで定義されたインスタンスメソッドを使用できるようにするので、
Rake.run_tests
私にとってそれは常に考えるのに役立ちますextend
ようinclude
シングルトンクラス(また、メタまたは固有クラスとして知られている)の内部。
シングルトンクラス内で定義されたメソッドは基本的にクラスメソッドであることをご存じでしょう。
module A
class << self
def x
puts 'x'
end
end
end
A.x #=> 'x'
今、私たちは、それを知っているextend
だろうinclude
ので、シングルトンクラスの内部およびモジュール内のメソッドは、クラスメソッドとして公開します:
module A
class << self
include A
def x
puts 'x'
end
end
def y
puts 'y'
end
end
A.x #=> 'x'
A.y #=> 'y'
リンクの腐敗を避けるために、user83510によってリンクされたChris Wanstrathのブログ投稿が(彼の許可を得て)以下に再投稿されています。それでも、オリジナルに勝るものはないので、機能し続ける限り彼のリンクを使用してください。
→singin 'singletons 2008年11月18日わからないことがある。たとえば、David Bowie。または南半球。しかし、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クリスwanstrathであるべきです))