Я хотел бы просто определить зависимости в верхней части файла с помощью операторов include и получить доступ к методам / классам, определенным во включенных модулях.
Ваши ожидания не реальны c в Ruby. Ruby не имеет системы пакетов, а includes
не эквивалентен imports
на таких языках, как Python или ES6.
Как указано в комментариях @maxpleaner, включает только копии методов модуль.
Итак, чтобы сделать это, вам нужно будет определить новые константы в потребляющем классе / модуле:
module FinancialFunctions
module ComputationSteps
module TwoBranchesPerPeriod
include Strategies
Strategy1 = ComputationSteps::Strategies::Strategy1
def a_method
Strategy1.new
end
end
end
end
Вы можете сделать это динамически с помощью Module#included
hook:
module Foo
module Bar
end
module Baz
end
def self.included(base)
self.constants.each do |c|
base.constant_set(c, self.constant_get(c))
end
end
end
module X
includes Foo
end
irb(main):002:0> X::Bar
=> Foo::Bar
Но помимо того, что это забавный пример метапрограммирования, я не думаю, что это настолько мудро, поскольку нет способа справиться с конфликтами пространств имен. Вы также можете создать импровизированный эквивалент конструкции импорта:
module Importer
def import(*constants, from:)
constants.each do |c|
const_set(c, from.const_get(c))
end
end
end
module Foo
module Bar
module A
end
module B
end
end
end
class Thing
extend Importer
import :A, :B, from: Foo::Bar
end
irb(main):001:0> Thing::A
=> Foo::Bar::A
irb(main):002:0> Thing::B
=> Foo::Bar::B
Но это также пахнет примером борьбы с языком и, вероятно, создаст больше проблем, чем решит .