Julia中如何让自定义结构体的运算符支持多输入连续运算?
解决Julia自定义结构体连续乘法运算错误的方案
你的问题出在没有正确扩展Julia Base模块的乘法运算符,虽然二元运算能临时工作,但连续运算时方法调度会出现匹配问题。
修正步骤
- 显式导入Base模块的
*运算符,确保我们是在扩展系统内置的乘法运算符,而非定义局部函数。 - 使用标准的方法定义语法扩展
*的行为。
修正后的完整代码
struct MyNumber name::String value::Int end # 导入Base的乘法运算符,以便扩展 import Base: * # 定义MyNumber类型的乘法方法 *(a::MyNumber, b::MyNumber) = MyNumber("no_name", a.value + b.value) x1 = MyNumber("positive", 4) x2 = MyNumber("positive", 3) y = x1 * x2 println(y) # 输出: MyNumber("no_name", 7) # 连续运算现在可以正常执行 z = x1 * x2 * x1 * x2 * x2 println(z) # 输出: MyNumber("no_name", 17)
原理说明
Julia的运算符本质是函数,直接写a::MyNumber * b::MyNumber = ...虽然能处理单次二元运算,但这种写法没有关联到Base模块的全局*运算符,连续运算时(如(x1*x2)*x1),后续的乘法调用可能无法正确匹配到你定义的方法。通过import Base: *并显式扩展方法,能让Julia的方法调度系统正确识别每一步运算的类型匹配,确保连续运算正常执行。
内容的提问来源于stack exchange,提问作者Leonard Neon
相关产品推荐
相关产品推荐

