metaprogramming - 水晶语言:如何用项目特定包中文件中定义的所有模块填充数组?
问题描述
总而言之,我想知道是否可以在 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
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]
推荐阅读
- html - How can I select a class in a class in css?
- python - Python: Whats the difference between directly importing and using 'from' keyword
- python-3.x - ImportError: cannot import name SignedJwtAssertionCredentials when oauth2client==4.0.0, neither using PyOpenSSL==20.0.1
- wordpress - 提交联系表格 7 后更改登录用户的角色
- jquery - 为什么onclick动作fontawesome后消失
- python - Tensorflow TimeseriesGenerator 参数混淆
- java - 无法将整个输入文件复制到Java中的输出文件
- jquery - Codeigniter Ajax 删除
- sql - Oracle:查找锁定的行返回错误的行 ID
- python - Pydantic 模型 w Fastapi 看不到属性