Raku中EVALFILE引入类名至作用域与官方文档冲突问题咨询
问题原因说明
这个现象既不是文档表述疏漏,也不是EVALFILE的实现bug,核心是Raku中不同类型声明的默认作用域规则有差异:
- 文档中明确提到的「EVAL永远无法向周围作用域引入符号」中的符号特指词法作用域符号,也就是用
my声明、仅在当前代码块作用域生效的符号。你测试中定义的some-routine子程序默认就是my类型的词法符号,因此EVALFILE执行结束后外部词法作用域无法找到该符号,完全符合文档描述。 - 你测试中定义的
SomeClass没有显式指定作用域,Raku中类、角色、枚举这类类型的默认声明作用域是our,也就是包级全局符号,会被注册到当前进程的全局包表中,不属于词法作用域符号范畴,自然不受「EVAL不能引入词法符号」的规则限制。
验证方法
你可以通过修改声明规则验证上述逻辑:
- 把类声明改为
my class SomeClass {},再在EVALFILE外部调用SomeClass.a()会报未声明错误,和子程序的表现完全一致 - 把子程序声明改为
our sub some-routine {},EVALFILE执行完后外部直接调用some-routine()也可以正常运行,和当前类的表现完全一致
内容的提问来源于stack exchange,提问作者rajashekar
相关产品推荐
相关产品推荐

