最后,当我managed to understand how to fix this时,即如何更改内部动态变量的值时,代码继续运行,现在是declared in this way:
my int $is-win = Rakudo::Internals.IS-WIN;
这是在class Encoding::Builtin
内部声明的类变量。毫无疑问,OS是在变量生存期内不会发生变化的东西。但是,我需要从其他操作系统测试此代码,因此我需要访问该类变量并为其分配一个True
值。我可以使用meta object protocol吗?
答案 0 :(得分:10)
Perl 6中不存在“类变量”的概念。
所考虑的声明是一个词法变量,并且其生存期绑定到在其中声明的范围(用花括号限制)。它与声明的class
没有任何关系,因此无法通过MOP来实现。 (就词法变量而言,此问题中的代码块恰好附在class
声明上是偶然的。)它也不是声明为our
,因此也没有存储在包中。>
除调试器之外,访问词法的唯一方法是,如果该词法范围内的某些内容明确地使其成为可能(例如,通过获取伪包并将其存储在更广泛可见的位置,或允许EVAL
提供的代码)。在这种情况下都不会发生,因此无法访问该变量。
Perl 6在词法作用域方面非常严格,这是语言设计中非常有意的部分。它支持用户理解和重构程序,并支持编译器进行程序分析和优化。换句话说,Perl 6在涉及词汇事物时是一种相当静态的语言(在将来的语言版本中可能会进行更多的静态分析),而在涉及对象事物时则是一种动态语言。