2010-07-28 4 views
13

코드입니다 후자는 클래스 메서드 일 뿐이지 만 두 메서드 중 하나를 호출 할 때는 M.greet를 사용해야합니다. 그렇습니까? 누군가가 하나의 코드를 다른 코드보다 더 많이 사용할 수 있는지에 대해 궁금해했습니다. 감사!루비 모듈 및 확장 상황의 어떤 종류에서 자기

답변

13

첫 번째 예는 일반적으로 그들의 존재를 모를 때 사람들이 (module_function의 기능을 달성하는 방법입니다 이 방법).

module_function은 모두 인스턴스 메소드 및 클래스 메소드입니다. 두 번째 코드 예제에서 메서드는 클래스 메서드입니다.

+0

오, 멋진 방법입니다. 그렇게하면 모든 기능을 제공하지 않으려는 경우에 대비하여 기능을 부여 할 메소드를 선택할 수 있습니다. 감사! – joeellis

9

당신의 첫 번째 예제와 함께이 작업을 수행 할 수있을 것입니다,하지만 두 번째 :

include M 
greet 
2

모듈은 모듈 메서드를 작성하여 네임 스페이스로 사용할 수 있으며 모듈의 인스턴스 메서드를 다른 개체에 혼합 할 수 있습니다.

자체 확장 모듈 개념을 사용하면 모듈을 두 가지 방법으로 사용할 수 있습니다. 독립형 네임 스페이스 또는 믹스 인 중 하나입니다. 이 모듈을 고려해보십시오 :

module M 
    def bar 
    puts "bar" 
    end 
end 
class C 
    include M 
end 

이것은 인스턴스 메소드를 가지며 다른 객체와 혼합 될 수 있습니다. 우리가

puts M.class # => Module 

이 방법을 보여 수, 모듈 클래스 Module의 단지 목적은,

puts M::bar # => undefined method `bar' for M:Module 
puts C.bar # => this is bar 

그러나 : 그것은 모듈 방법이 없으며, 따라서 공간으로 사용할 수 없습니다 우리가 뭔가 미친 짓을 할 수 있다고. 메소드를 인스턴스와 모듈 메소드가되도록 모듈을 혼합 할 수 있습니다.

module M 
    extend self 
    def bar 
    puts "bar" 
    end 
end 
puts M::bar # => this is bar 
puts C.bar # => this is bar