从班级外部更改班级变量

时间:2018-08-07 17:41:28

标签: perl6 meta-object-protocol

最后,当我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吗?

1 个答案:

答案 0 :(得分:10)

Perl 6中不存在“类变量”的概念。

所考虑的声明是一个词法变量,并且其生存期绑定到在其中声明的范围(用花括号限制)。它与声明的class没有任何关系,因此无法通过MOP来实现。 (就词法变量而言,此问题中的代码块恰好附在class声明上是偶然的。)它也不是声明为our,因此也没有存储在包中。

除调试器之外,访问词法的唯一方法是,如果该词法范围内的某些内容明确地使其成为可能(例如,通过获取伪包并将其存储在更广泛可见的位置,或允许EVAL提供的代码)。在这种情况下都不会发生,因此无法访问该变量。

Perl 6在词法作用域方面非常严格,这是语言设计中非常有意的部分。它支持用户理解和重构程序,并支持编译器进行程序分析和优化。换句话说,Perl 6在涉及词汇事物时是一种相当静态的语言(在将来的语言版本中可能会进行更多的静态分析),而在涉及对象事物时则是一种动态语言。