【问题标题】:Is there a way to overload/intercept function calls on overloaded objects in Perl?有没有办法在 Perl 中重载/拦截对重载对象的函数调用?
【发布时间】:2010-11-11 20:10:32
【问题描述】:

以类似于重载运算符的方式,有没有一种方法可以对变量应用某种魔法,以便如下:

my $magic_var = ...;

some_function($magic_var);

会产生这样的结果:

call_function(\&some_function, $magic_var)

如果没有定义some_function,我可以只使用AUTOLOAD 子来捕获呼叫,但是当它被定义时,我不知道拦截呼叫的方法(没有像注入包装器这样疯狂的东西调用者的所有潜艇,或暂时取消定义所有潜艇)。

另一种说法是,我想写use overload sin => \&my_sin;,但sin 是任何函数,并且只要在函数调用中使用重载对象,它就会调用nomethod 之类的子函数。

编辑:

应大众的要求,我研究这个的原因是因为我正在开发 Perl6 的 Perl5 版本,无论什么明星。但是,在深入研究 Perl6 实现之后,似乎它也不处理在 Whatever 上调用的函数,所以我似乎不必尝试处理函数调用(只是运算符和方法调用) .

如果有人感兴趣,该模块在 CPAN 上:Whatever

欢迎反馈/评论。

【问题讨论】:

  • 嗯,源过滤器? :) 更严重的是,有什么原因你不能找到他们最终将在函数中完成的 $magic_var` 上使用的运算符并重载 that
  • @tchrist => 我之前已经走上了源过滤器的道路,它并不漂亮。现在,这就是我的对象的行为方式(它们将被传递到 sub 中,然后绑定到它们上使用的第一个运算符)。但我希望能够更早地接听电话,既可以增加操作的惰性,也可以处理边缘情况,例如 sub 将值发送到多个运算符路径。
  • 另外,如果有某种方法可以捕获内置函数的应用,那将是理想的(当前捕获类型转换的方法("" +0 bool 等)最终会在函数调用)。
  • 请提供上下文!你为什么要这样做?你的最终目的是什么?
  • 对您提出的问题的答案将是直接否。但是,如果您退后一步并解释您实际想要实现的目标,您很可能会得到一个不同的答案。

标签: perl function overloading


【解决方案1】:

你可以使用tie机制吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多