crystal-lang : 如何用项目特定包中文件中定义的所有模块填充数组?
crystal-lang : how to fill an array with all modules defined in files in a specific package of the project?
所有问题,
我想知道是否可以在 Crystal(伪代码)中做这样的事情:
modules = Array(Module).new
foreach (file in specific_package) do
if (file.is_a(crystal_module) do
modules.push(file.module)
end
end
Crystal 没有包,只有模块。如果你想获取文件中的所有模块,你可以试试这个:
require "compiler/crystal/syntax"
Modules = [] of String
class ModuleVisitor < Crystal::Visitor
def visit(node : Crystal::ModuleDef)
Modules << node.name.names.join("::")
true
end
def visit(node : Crystal::ASTNode)
true
end
end
Dir.glob("./*.cr").each do |file|
visitor = ModuleVisitor.new
parser = Crystal::Parser.new(File.read(file))
parser.filename = file
node = parser.parse
node.accept(visitor)
end
puts Modules.join("\n")
然后你会得到一个包含所有模块名称的 Array(String)
如果你想在 class 中获取所有包含的模块,试试这个:
class Class
def included_modules
{% if @type.ancestors.any? { |a| a.class.stringify.ends_with?(":Module") } %}
{{ @type.ancestors.select { |a| a.class.stringify.ends_with?(":Module") } }}
{% else %}
[] of Nil
{% end %}
end
end
module Foo::Bar
end
class Baz
include Foo::Bar
end
puts Baz.included_modules # => [Foo::Bar]
所有问题, 我想知道是否可以在 Crystal(伪代码)中做这样的事情:
modules = Array(Module).new
foreach (file in specific_package) do
if (file.is_a(crystal_module) do
modules.push(file.module)
end
end
Crystal 没有包,只有模块。如果你想获取文件中的所有模块,你可以试试这个:
require "compiler/crystal/syntax"
Modules = [] of String
class ModuleVisitor < Crystal::Visitor
def visit(node : Crystal::ModuleDef)
Modules << node.name.names.join("::")
true
end
def visit(node : Crystal::ASTNode)
true
end
end
Dir.glob("./*.cr").each do |file|
visitor = ModuleVisitor.new
parser = Crystal::Parser.new(File.read(file))
parser.filename = file
node = parser.parse
node.accept(visitor)
end
puts Modules.join("\n")
然后你会得到一个包含所有模块名称的 Array(String)
如果你想在 class 中获取所有包含的模块,试试这个:
class Class
def included_modules
{% if @type.ancestors.any? { |a| a.class.stringify.ends_with?(":Module") } %}
{{ @type.ancestors.select { |a| a.class.stringify.ends_with?(":Module") } }}
{% else %}
[] of Nil
{% end %}
end
end
module Foo::Bar
end
class Baz
include Foo::Bar
end
puts Baz.included_modules # => [Foo::Bar]