Chciałbym wymagać pliku w Ruby bezdefiniowanie stałych tego pliku w Object. Zamiast tego chciałbym uwzględnić je tylko w module wymaganego pliku. Na przykład, jeśli mam plik foo.rb, który wygląda następująco:
module Foo
def self.hello_world
puts "Hello, World."
end
end
Reprezentacja wyniku, który mam nadzieję osiągnąć, wygląda mniej więcej tak:
module Bar
require_relative "./foo.rb"
end
Foo.hello_world
# NameError: uninitialized constant Foo
Bar::Foo.hello_world
# Hello, World.
Wygląda na to, w jaki sposób rzeczy są potrzebneRuby, wszystko zdefiniowane na najwyższym poziomie innego pliku będzie zdefiniowane jako stała w Object, a zatem globalnie dostępne. Mam problem, ponieważ potrzebuję czegoś z pliku, który powoduje konflikt ze stałą w globalnej przestrzeni nazw.
Zdaję sobie sprawę, że ten problem może być fundamentalny dla Ruby, ale czy jest możliwe zastosowanie techniki metaprogramowania w celu rozwiązania tego problemu?
Odpowiedzi:
1 dla odpowiedzi № 1Wygląda na to, że następujący fragment kodu działa w przypadku tego, co próbuję zrobić:
module Bar
class_eval File.open("./foo.rb").read
end
Być może wciąż czegoś mi brakuje.
0 dla odpowiedzi nr 2
Jeśli nie potrzebujesz dostępu do przodka, szukasz tego extend
module Foo
def hello_world
puts "Hello, World."
end
end
module Bar
extend Foo
end
Bar.hello_world