루비에서 '로드'또는 '요구 사항'의 결과로 어떤 모듈이 정의되는지 어떻게 알 수 있습니까?

StackOverflow https://stackoverflow.com/questions/451347

  •  19-08-2019
  •  | 
  •  

문제

Ruby에서 "foo를 요구하는"경우 foo.rb에 정의 된 모듈 또는 모듈의 이름을 결정하는 방법이 있습니까?

예를 들어, foo.rb라는 루비 파일이 다음과 같습니다.

# foo.rb
module MyModule
    def self.summary
        "this does something useful"
    end
    ...
end

다른 스크립트에서 "foo를 요구하는"후에는 이제 myModule이라는 모듈이 있는지 어떻게 결정할 수 있습니까?

내가 뒤 따르는 것은 다음과 같은 일을 할 수 있다는 것입니다.

file = someComputedFileName()
require file
puts "summary of #{file}: #{???::summary}

모듈 이름과 파일 이름을 동일하게 만들도록 강요 할 수는 있지만 오히려 그렇지 않습니다. 짧은 파일 이름을 만들 때 더 많은 자유를 원하지만 표현 모듈 이름을 더 많이 원합니다. 그러나 각 파일이 단일 모듈 만 정의 할 것이라고 직접 보장합니다 (생각 : 플러그인).

도움이 되었습니까?

해결책

한 가지 방법은 사용하는 것입니다 ObjectSpace.Each_Object (module) 파일을 요구하기 전에 정의 된 모든 모듈을 찾으려면. 그런 다음 파일이 필요한 후에는 모든 정의 된 모듈을 다시 고리하고 새 모듈이 있는지 확인하십시오.

require "set"
old_modules = SortedSet.new
ObjectSpace.each_object(Module) {|m| old_modules.add(m) }

file = someComputedFileName()
require file

new_modules = SortedSet.new
ObjectSpace.each_object(Module) {|m| new_modules.add(m) unless old_modules.include?(m) }

puts "summary of #{file}: #{new_modules.to_a.map{|m|m.summary}.join(',')}"

또한 파일에서 둘 이상의 모듈을 정의 할 수 있습니다.

다른 팁

이것이 최선의 해결책인지는 모르겠지만 내 머리 꼭대기에서 이것은 작동하는 것 같습니다.

all_constants = Object.constants
require 'foo'

foo_constants = Object.constants - all_constants

foo_constants는 foo.rb에 의해 정의 된 모듈, 클래스 또는 기타 상수 만 제공해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top