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,我收到错误。遇到这样的情况我该如何处理?
*以下是为自定义数据类型定义运算符的正确方法:
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.:*,因此不需要显式导入运算符,如下所述。
小智 5
要添加 jbytecode 的答案,原始代码不起作用的原因是因为您*在 Main 模块中定义了一个新函数,而不是扩展该Base.:*函数。
Base.:*有许多方法,其中一种可以处理诸如a*b*c.
您定义的函数只有 1 个方法*(MyNumber,MyNumber)
事实上,在运行任何 * 之前的这样的函数定义将破坏代码中其他类型的使用 * 。(如果您在定义自己的 * 之前确实使用了 * ,Julia 会要求您导入 Base.:* 来扩展它)