gpt4 book ai didi

operator-overloading - 类的重载运算符

转载 作者:行者123 更新时间:2023-12-04 00:41:06 26 4
gpt4 key购买 nike

假设我有以下类(class):

class A {
has $.val;

method Str { $!val ~ 'µ' }
}

# Is this the right way of doing it?
multi infix:<~>(A:D $lhs, A:D $rhs) {
('(', $lhs.val, ',', $rhs.val, ')', 'µ').join;
}

我如何以与 + 相同的方式为类重载运算符(例如 Str )在上一个类?

我猜这仅适用于在实例对象上调用并使用 multi operator-type:<OP>(T $lhs, T $rhs) { } 的方法。运算符的语法是正确的方法,但我不确定。

例如,在 Python 中,以运算符命名的特殊方法(例如 operator.__add__ )和运算符(例如 + )之间似乎存在对应关系。此外,自定义类的任何运算符重载都是在类内部完成的。

最佳答案

在 Perl 6 中,运算符被认为是当前语言的一部分。与当前语言相关的所有事物都是按词法定义的(即 my -scoped)。因此,一个 multi sub 是正确使用的东西。

如果将此代码放入模块中,您可能还需要标记 multi对于具有 is export 的运算符(operator):

multi infix:<~>(A:D $lhs, A:D $rhs) is export {
('(', $lhs.val, ',', $rhs.val, ')', 'µ').join;
}

以便 use 的用户可以使用它或 import该模块( use 实际上是根据 import 定义的,并且 import 将符号导入词法范围)。

虽然有些运算符默认委托(delegate)给方法(例如, prefix:<+> 调用 Numeric),但两者之间没有 1:1 的关系,对于大多数运算符,它们的实现直接在运算符 sub 中进行。 (或分布在许多 multi sub 上)。

此外,运算符集是开放的,因此不限于重载现有运算符,还可以引入新的运算符。当运算符的新含义与所用符号的正常语义没有明确相关时,这是鼓励的;例如,重载 +做矩阵加法是明智的,但对于不可能被认为是一种加法的东西,新的运算符将是更好的选择。

关于operator-overloading - 类的重载运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55814075/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com