답변:
인스턴스 메서드를 클래스 메서드로 만드는 편리한 방법입니다. 그러나 더 효율적인 싱글 톤 으로 사용할 수도 있습니다 .
extend self
와 관련 이 있는지도 설명하지 않습니다 .
나를 위해 항상 생각하는 데 도움이 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 일 내가 이해하지 못하는 것이 있습니다. 예를 들어 데이비드 보위. 또는 남반구. 그러나 Ruby의 Singleton만큼 내 마음을 흔들리는 것은 없습니다. 정말로, 그것은 완전히 불필요하기 때문입니다.
다음은 코드로 사용자가 원하는 작업입니다.
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는 더 간결하고 코드는 테스트, 모의, 스텁이 더 쉬우 며 필요에 따라 적절한 클래스로 변환하는 것은 여전히 간단합니다.
((저작권 ought ten chris wanstrath))