茱莉亚的类型字段上的笛卡尔宏

时间:2016-09-28 12:47:40

标签: macros julia

Base.Cartesian模块提供@nref宏:

using Base.Cartesian
i_1, i_2 = 1, 1
A = rand(3,3)
@nref 2 A i

返回A[1,1]。但是,@nref不适用于(自定义)类型的字段:

type Foo
    bar::Matrix
end

foo = Foo( rand(3,3) )

i_1, i_2 = 1, 1
@nref 2 foo.bar i

这会导致错误:

ERROR: MethodError: `_nref` has no method matching _nref(::Int64, ::Expr, ::Symbol)
Closest candidates are:
  _nref(::Int64, ::Symbol, ::Any)

错误似乎合理,因为foo.bar实际上是表达式getfield(foo, bar)。 将@nref包装在函数中并传递foo.bar有效:

function baz(A)
i_1, i_2 = 1, 1
@nref 2 A i
end

baz(foo.bar)

但有没有办法使@nref 2 foo.bar i有效?

1 个答案:

答案 0 :(得分:2)

如果您将foo.bar分配给变量,例如TT = foo.bar,则@nref 2 TT i有效。这基本上是免费的,因为没有复制,并且在函数优化中使TTfoo.bar相同。