Чтобы избежать гниения ссылок, блог Криса Ванстрата , на который ссылается user83510, находится ниже (с его разрешения)
Тем не менее, ничто не сравнится с оригиналом, поэтому используйте его ссылку, пока она продолжает работать.
→ поющие синглтоны
18 ноября 2008 г.
Есть вещи, которые я просто не понимаю. Дэвид Боуи, например. Или Южное полушарие. Но ничто так не поражает, как сингл Руби. Потому что на самом деле это совершенно не нужно.
Вот что они хотят, чтобы вы сделали с вашим кодом:
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 более лаконичен, код легче тестировать, макетировать и заглушать, и до сих пор его очень просто преобразовать в соответствующий класс в случае необходимости.
((авторское право должно быть десятью крисом Вантстратом))