在 Julia 中,如何为 2 个以上的结构定义运算符?

Leo*_*eon 4 macros struct operators julia

在 Julia 中,我有自己的结构,例如MyNumber. 我想*为我的结构定义一个运算符,例如产品运算符。以下是我尝试过的。

struct MyNumber
    name::String
    value::Int
end

x1 = MyNumber("postive", 4)
x2 = MyNumber("postive", 3)

# define product operator for MyNumber
a::MyNumber * b::MyNumber = MyNumber("no_name", a.value + b.value)

y = x1*x2
println(y) # ok here, output: MyNumber("no_name", 7)
Run Code Online (Sandbox Code Playgroud)

它运作得很好。但是,当我尝试将产品应用于 2 个以上的输入时,例如z=x1*x2*x1*x2*x2,我收到错误。遇到这样的情况我该如何处理?

jby*_*ode 6

*以下是为自定义数据类型定义运算符的正确方法:

import Base.:*

struct MyNumber
    name::String
    value::Int
end

x1 = MyNumber("postive", 4)
x2 = MyNumber("postive", 3)

# define product operator for MyNumber
Base.:*(a::MyNumber, b::MyNumber)::MyNumber = MyNumber("no_name", a.value + b.value)

y = x1*x2
println(y) # ok here, output: MyNumber("no_name", 7)
Run Code Online (Sandbox Code Playgroud)

应从 Base 包显式导入该运算符。

编辑:由于我在方法定义中使用了 the Base.:*,因此不需要显式导入运算符,如下所述。

  • 在这种情况下不需要“import Base.:*”,因为在定义方法时无论如何都需要使用“Base.”作为前缀。 (4认同)

小智 5

要添加 jbytecode 的答案,原始代码不起作用的原因是因为您*在 Main 模块中定义了一个新函数,而不是扩展该Base.:*函数。

Base.:*有许多方法,其中一种可以处理诸如a*b*c.

您定义的函数只有 1 个方法*(MyNumber,MyNumber)

事实上,在运行任何 * 之前的这样的函数定义将破坏代码中其他类型的使用 * 。(如果您在定义自己的 * 之前确实使用了 * ,Julia 会要求您导入 Base.:* 来扩展它)