Julia中Einsum宏操作结构体元素报错:无法转换Expr为Symbol求解释
关于Einsum宏直接操作结构体元素报错的原因解析
问题复现
使用Einsum包时,直接通过结构体属性访问数组并调用@einsum宏会触发类型转换错误,但先将属性赋值给变量后再调用宏则正常运行:
using Einsum struct MyStruct a::Array end s1 = MyStruct(rand(5, 2)) s2 = MyStruct(rand(6, 2)) # 运行报错:ERROR: LoadError: MethodError: Cannot `convert` an object of type Expr to an object of type Symbol @einsum result[i, j] := s1.a[i, k] * s2.a[j, k] # 可正常运行 s1_a = s1.a s2_a = s2.a @einsum result[i, j] := s1_a[i, k] * s2_a[j, k]
错误原因
问题出在@einsum宏的元编程实现逻辑上:
- 宏在解析右侧的数组引用时,内部逻辑期望接收的是单纯的变量名(
Symbol类型,比如s1_a)。 - 而结构体属性访问
s1.a本质是一个表达式(Expr类型,对应语法树节点:(s1.a)),宏的处理代码中存在试图将数组标识符转换为Symbol的逻辑,当传入的是Expr时,类型转换失败,从而抛出MethodError。 - 先将
s1.a赋值给变量s1_a后,s1_a是标准的Symbol,完全符合宏的预期输入格式,因此能正常执行。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

