【问题标题】:Overloading '=' in Perl在 Perl 中重载 '='
【发布时间】:2015-11-02 13:23:01
【问题描述】:

由于在 Perl 中简单地重载 '=' 并不像人们期望的那样,那么正确的方法是什么?

引自overloadperldoc:

简单赋值不可重载('=' 键用于复制构造函数)。 Perl 确实有一种方法可以为对象做任何你想做的事情,但这涉及到使用tie(),而不是overload - 请参阅下面的tieCOOKBOOK 示例。

我已经阅读了COOKBOOKtie 的文档,但无法弄清楚如何以这种方式使用它。


我希望能够像这样创建一个对象:my $object = Object->new() 然后当我将它分配给某物时,我希望它进行一些特殊处理。

例如:$object = 3 会在内部执行类似$object->set_value(3); 的操作

我知道这不一定是好的做法。这更像是一个教育问题。我只是想知道如何做到这一点。不是它是否应该完成。

【问题讨论】:

    标签: perl oop operator-overloading equals-operator


    【解决方案1】:

    上面引用的 perl 文档措辞有些拙劣。无法将分配重载到当前包含某些特定对象或其他对象的某个存储位置(即变量);变量的当前值对于赋值从来都不重要。

    但是,您可以做的是直接向该变量添加魔法,捕捉存储到其中的尝试(SET 魔法,由绑定类的 STORE 方法实现)。但重要的是要意识到这是变量本身的魔法,而不是它当前包含的值。

    【讨论】:

      【解决方案2】:

      你不能那样做。您可以为变量添加魔法,以便在将值分配给变量后调用 sub,但这与您的要求相去甚远。


      此外,您问的问题并没有真正的意义。下面应该怎么做?

      my $object;
      $object = Object->new();
      $object = Object->new();
      

      【讨论】:

      • 如果不可能,那么文档是什么意思? “Perl 确实有办法让一个对象做任何你想做的事情,但这涉及到使用 tie(),而不是重载。”
      • tie 或多或少地向 Perl 代码展示了魔法。您可以绑定一个变量,以便在将值分配给变量后调用 sub,但这与您的要求相去甚远。正如我所指出的,你问的没有任何意义。
      • 您在上面编写的代码将在第一次调用 new 时创建一个新对象,然后在第二次调用时将该对象的值设置为该对象的另一个实例。
      • 第二个调用会像$object->set_value(Object->new())
      • 这不是很有用,但我认为如果以这种方式设置,它将是如何工作的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-18
      • 1970-01-01
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多