2012-04-03 2 views
2

x.rb을로드하면 then all the classes in that file are loaded입니다. 어떤 클래스가 사용되고 있는지 확인하고 볼 수 있습니까?루비에서 사용되는 클래스 만로드 하시겠습니까?

x.rb에 Hello 클래스와 Goodbye 클래스가 모두 포함되어 있고 내 프로그램에서만 Hello 클래스가 사용된다고 가정하면 Hello 클래스 만로드 할 수 있습니까?

문서를 확인하고 Hello 클래스와 그 코드를 사용하는 .rb 만 출력하는 스크립트에 만족합니다. 흥미로운 github 프로젝트가 존재하지 않겠지 만, 그게 낫다고 생각합니다. 내 스킬 셋 atm.

+2

없음

을 ¹. 소스 파일은 전체적으로로드되고 평가됩니다. 별도의 파일을 사용하지 않는 이유는 무엇입니까? –

+1

Hello 클래스를 독점적으로로드하는 데 소요되는 시간과 메모리는 컴퓨터와 함께 Goodbye를로드하는 것보다 큽니다. – benzado

답변

2

클래스가 자신의 별도의 파일에 정의 할 때, 당신은 autoload ¹² 방법을 사용할 수 있습니다. autoload은 상수가 정의되지 않은 경우 const_missing을 사용하여 자동으로 파일을 필요로합니다.

여기에도 파일을 다루고 있습니다. x/hello.rb의 내용을 읽고 평가하게됩니다. 이 코드는 모든 작업을 실행할 수 있습니다. 그것은 require 다른 파일 수 있습니다. 그것은 백만 개의 다른 클래스를 정의 할 수 있습니다.

이것은 소스 코드가 실제로 텍스트이기 때문입니다. 이것은 특히 해석 언어에 해당됩니다. 예 : in Java, you can usually only declare one public type per "compilation unit". Ruby에는 그런 것이 없습니다.


는 가능하지, Matz strongly discourages the practice ² Ruby Inside article on autoload

0

참고 : 나는 질문의 일부를 잘못 읽었고 다른 부분은 어떻게 든 나를 피했다 ... 나는 큰 시간을 멀티 태스킹해야했을 것입니다. 어쨌든,이 대답은 질문의 절반 만 대답하고 잘못 대답합니다. 그냥 말해. 당신은 소켓을 사용할 수, 청소기 및 방법을 이제

$ cat definer.rb 
class Foo 
    def greet(person) 
    puts "Hello, #{person}!" 
    end 
end 
Bar = Class.new 

$ cat finder.rb 
$LOAD_PATH << File.dirname "." 
before = Object.constants 
require 'definer' 
after = Object.constants 
print (before - after).join(" ") 

$ cat looker.rb 
differences = `ruby finder.rb`.split(" ") 
puts "The following constants will be defined when finder.rb is loaded: #{differences.join(", ")}" 

:

좋아, 여기 가능성이 저렴한 방법이지만, 이런 일을하려고합니다. 나는 이것에 대한 예를 얻을 것이다. 당신이 Hello 쓸 때

autoload :Hello, 'x/hello' 
autoload :Goodbye, 'x/goodbye' 

, 당신은 실제로 Hello 일정에 액세스 :

+0

질문에 대한 연결이 표시되지 않습니까? –

+0

주 프로그램에서 실제로 정의하지 않고'definer.rb'가 정의한 모든 상수를 출력합니다. – Jwosty

+0

잠깐만 ... 내가 잘못된 질문에 게시 한 것 같아요. * facepalm * – Jwosty

관련 문제