Ruby에서는 extend
. 그러나이 코드 세그먼트에서 무슨 일이 일어나고 있습니까? 구체적으로 무엇을 extend
합니까? 인스턴스 메서드를 클래스 메서드로 만드는 편리한 방법입니까? 처음부터 클래스 메서드를 지정하는 대신 왜 이런 방식으로 수행합니까?
module Rake
include Test::Unit::Assertions
def run_tests # etc.
end
# what does the next line do?
extend self
end
답변
인스턴스 메서드를 클래스 메서드로 만드는 편리한 방법입니다. 그러나 더 효율적인 싱글 톤 으로 사용할 수도 있습니다 .
답변
모듈에서 self는 모듈 클래스 자체입니다. 예를 들어
puts self
Rake를 반환합니다.
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 일 내가 이해하지 못하는 것이 있습니다. 예를 들어 데이비드 보위. 또는 남반구. 그러나 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))
답변
extend self
기존의 모든 인스턴스 메서드를 모듈 메서드로 포함합니다. 이것은 말하는 것과 같습니다 extend Rake
. 또한 Rake
class의 객체입니다 Module
.
동등한 동작을 달성하는 또 다른 방법은 다음과 같습니다.
module Rake
include Test::Unit::Assertions
def run_tests # etc.
end
end
Rake.extend(Rake)
이것은 private 메서드로 자체 포함 된 모듈을 정의하는 데 사용할 수 있습니다.