最后,当我设法理解如何解决这个问题,即如何更改内部动态变量的值时,代码继续前进,现在以这种方式声明:
my int $is-win = Rakudo::Internals.IS-WIN;
这是一个在内部声明的类变量class Encoding::Builtin
。在世界上一切都有意义,因为操作系统不是在变量的生命周期内发生变化的东西。但是,我需要从其他操作系统测试此代码,因此我需要访问该类变量并为其分配一个True
值。我可以使用元对象协议来做到这一点吗?
最后,当我设法理解如何解决这个问题,即如何更改内部动态变量的值时,代码继续前进,现在以这种方式声明:
my int $is-win = Rakudo::Internals.IS-WIN;
这是一个在内部声明的类变量class Encoding::Builtin
。在世界上一切都有意义,因为操作系统不是在变量的生命周期内发生变化的东西。但是,我需要从其他操作系统测试此代码,因此我需要访问该类变量并为其分配一个True
值。我可以使用元对象协议来做到这一点吗?
Perl 6 中不存在“类变量”的概念。
正在考虑的声明是一个词法变量,它的生命周期绑定到声明它的范围(由大括号限制)。它与被声明的那个没有任何关系class
,所以没有办法通过 MOP 到达它。class
(就词法变量而言,这个问题中的块恰好附加到声明中是偶然的。)它也没有被声明our
,所以它也没有存储在包中。
唯一可以访问词法的方式——除了在调试器下——是如果该词法范围内的某些东西显式地使其成为可能(例如,通过获取伪包并将其存储在更广泛可见的地方,或者通过允许EVAL
提供代码)。在这种情况下都没有发生,因此无法访问该变量。
Perl 6 对词法作用域非常严格,这是语言设计中非常有意的部分。它支持用户理解和重构程序,支持编译器进行程序分析和优化。换句话说,Perl 6 在涉及词法方面是一种相当静态的语言(并且可能会在未来的语言版本中进行更多的静态分析),而在涉及对象方面则是一种动态语言。