어떻게 루비에서 디렉토리의 각 파일에있는 모든 클래스의 인스턴스를 만들고 배열로 제공합니까? ?디렉토리의 모든 클래스 인스턴스를 자동으로 작성하려면 어떻게합니까?
미리 감사드립니다.
어떻게 루비에서 디렉토리의 각 파일에있는 모든 클래스의 인스턴스를 만들고 배열로 제공합니까? ?디렉토리의 모든 클래스 인스턴스를 자동으로 작성하려면 어떻게합니까?
미리 감사드립니다.
ObjectSpace
을 사용하여 새 클래스를 찾고 인스턴스화 할 수 있습니다. 그들은 모두 그들의 .rb 파일을 포함하고 초기화 인수를 취하지 같은 이름을 공유하는 가정
def load_and_instantiate(class_files)
# Find all the classes in ObjectSpace before the requires
before = ObjectSpace.each_object(Class).to_a
# Require all files
class_files.each {|file| require file }
# Find all the classes now
after = ObjectSpace.each_object(Class).to_a
# Map on the difference and instantiate
(after - before).map {|klass| klass.new }
end
# Load them!
files = Dir.glob("path/to/dir/*.rb")
objects = load_and_instantiate(files)
재미있는 솔루션, 결코 생각하지 못했습니다. 고맙습니다. – user1207719
쿨 솔루션, +1 –
...
#initialize array of objects
objects = []
#list ruby files in directory
classes = Dir.glob("*.rb")
#make method to easily remove file extension
def cleanse(fileName)
return fileName.gsub(".rb", "")
end
classes.each do |file|
#require the new class
require fileName
#add it to our array
objects[objects.length] = eval(cleanse(file) + ".new()")
end
이 작업을 수행 할 왜 그냥 궁금해서? ...이있다 순전히 학문적? 또는 항목을 미리 캐시하고 싶습니까? – scunliffe
아니요, 미리 정의 된 배열에 클래스를 추가하기 위해 코드로 돌아갈 필요가 없기 때문에이 작업을 수행하고 있습니다. 내 생각에 클래스가 포함 된 파일을 디렉토리에 놓고 스크립트가 어려운 부분을 수행하도록하기 위해 작업량을 단순성과 동일하게 낮 춥니 다. – user1207719