【问题标题】:Changing a class variable from outside the class从类外部更改类变量
【发布时间】:2018-08-07 17:41:27
【问题描述】:

最后,当我managed to understand how to fix this,也就是如何改变一个内部动态变量的值时,代码继续前进,现在是declared in this way

my int $is-win = Rakudo::Internals.IS-WIN;

这是在class Encoding::Builtin 中声明的类变量。在世界上一切都有意义,因为操作系统不是在变量的生命周期内发生变化的东西。但是,我需要从其他操作系统测试此代码,因此我需要访问该类变量并为其分配一个 True 值。我可以使用meta object protocol 做到这一点吗?

【问题讨论】:

  • 与其尝试使用内部结构,不如使用稍慢但更一致的$*DISTRO.is-win?您应该能够轻松地动态覆盖哪个?
  • @ElizabethMattijsen 在这种特殊情况下我不能。事实上,这就是我在 Rakudo 中打开this issue 的原因。

标签: raku meta-object-protocol


【解决方案1】:

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

正在考虑的声明是一个词法变量,它的生命周期绑定到声明它的范围(由花括号限制)。它与正在声明的class 没有任何关系,因此无法通过 MOP 到达它。 (就词法变量而言,这个问题中的块恰好附加到 class 声明是偶然的。)也没有声明 our,因此它也不存储在包中。

访问词法的唯一方法——除了在调试器下——是如果该词法范围内的某些东西显式地使其成为可能(例如,通过获取伪包并将其存储在更广泛可见的地方,或者通过允许EVAL 提供的代码)。在这种情况下都没有发生,因此无法访问该变量。

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

【讨论】:

    猜你喜欢
    • 2011-06-24
    • 2014-10-10
    • 2014-10-12
    • 2019-02-04
    • 1970-01-01
    • 2014-08-02
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多