Crystal-如何从多个文件中的模块中动态获取全局变量



我有多个这种格式的文件:car1.cr

module Cars
module Car1
BRAND = "TOYOTA"
end
end

所有这些文件都是一个主文件所需要的,我可以这样做:

puts Cars::Car1::BRAND #=> TOYOTA

我想做的是动态地puts所有品牌的所有文件,让我只需以第一种格式创建一个新文件(或删除一个文件(,就可以自动打印,而无需手动添加(或删除(。

我试着按照这个答案https://stackoverflow.com/a/50531198/13508702但没能实现我的目标。

任何帮助都会得到缓解!

您真的需要常量吗?你的文件就不能建立一个散列吗?

# cars.cr
module Cars
BRANDS = {} of String, String
end
# car1.cr
module Cars
module Car1
BRANDS["Car1"] = "TOYOTA"
# Or if you really need the constant
BRAND = "TOYOTA"
BRANDS["Car1"] = BRAND
end
end
# Or if it really just defines the data
Cars::BRANDS["Car1"] = "TOYOTA"

我怀疑你收集的信息比品牌更多,所以你可以定义一个价值类型:

module Cars
record Car, name : String, brand : String, model : String
CARS = [] of Car
end
Cars::CARS << Car.new("Car1", "TOYOTA", "AA")

这里的一般答案是,试着想一种方法来重组你的程序,这样你就不需要这种元编程能力了。这通常会导致代码更干净、更易于遵循。

回答实际问题:

module Cars
module Car1
BRAND = "TOYOTA"
end
module Car2
BRAND = "HONDA"
end
def self.collect_brands
{{@type.constants.map {|car| "#{car}::BRAND".id }}}
end
end
Cars.collect_brands # => ["TOYOTA", "HONDA"]

如果有用的话,我不知道你是否可以有一个模块数组,而是一个实例数组!

module Car
abstract def brand : String
end
BRANDS = [] of Car
module Cars
class Car1
include Car
def brand : String
"TOYOTA"
end
end
end
BRANDS << Cars::Car1.new

最新更新