2013-10-18 2 views
2

전역 컨텍스트 (주)에서 모듈을 포함 할 때 전역 컨텍스트에서 해당 메서드를 직접 사용할 수 있습니다. 클래스에서 모듈을 포함하면 include에서 호출 된 동일한 컨텍스트에서 호출 할 수없는 인스턴스 메서드를 정의합니다. 왜 이런거야?"포함"이 클래스와는 다른 글로벌 컨텍스트에서 다르게 동작하는 이유는 무엇입니까?

예 : 주요

에서

module Foo 
    def hello 
    puts "Hello, world!" 
    end 
end 

# In a class: 
class Bar 
    include Foo 
    hello # Hello is an instance method so it won't work here. 
end 

# In main 
include Foo 
hello # Works fine. Why? 

답변

1

는 푸

헬로 # 잘 작동 있습니다. 왜?

What is the Ruby Top-Level?이 개념에 대한 좋은 블로그를 먼저 읽으셔야합니다.

최상위에 사용하면 include FooObject 겠는데 최상위의 인스턴스 최상위 오브젝트 main에 인스턴스 메소드 #hello를 호출하기 때문에이 Object class.which이다에서 모듈을 포함하는 것을 의미 모듈 Foo의 인스턴스 메소드 #hello이 클래스 object의 인스턴스 메소드가되는 이유. 당신이 hello과 방법을 요구하고 있지만, 루비 self.hello로 내부적으로하고있는 경우 최상위 수준에

module Foo 
    def hello 
    puts "Hello, world!" 
    end 
end 
Object.include?(Foo) # => false 
include Foo 
Object.include?(Foo) # => true 
self # => main 
self.class # => Object 
self.instance_of? Object # => true 
hello # => Hello, world! 

. 그리고 self은 내가 전에 설명했던 main입니다.

+0

"최상위 레벨에서 'Object' 클래스의 인스턴스 인 최상위 레벨 객체'main'에서 인스턴스 메소드'# hello'를 호출하기 때문에. 기다려주십시오. 'main'이'Object' 클래스의 인스턴스라면,'Object.new.send (: instance_eval)에 Foo가 포함될 때 최상위 레벨에서'include'가 어떻게 작동할까요? 끝 '하지 않습니까? (그것은'include'에'NoMethodError'를 던집니다.) – Ajedi32

+0

@ Ajedi32라는 간단한 개념을 가지고 엉망이되고 있습니다. –

+0

요점은'include'가'Object' :'Object.new. 응답? : # => 거짓을 포함하십시오. 그렇다면 '메인'에 정의 된 이유는 무엇입니까? – Ajedi32

관련 문제