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
有效?
答案 0 :(得分:2)
如果您将foo.bar
分配给变量,例如TT = foo.bar
,则@nref 2 TT i
有效。这基本上是免费的,因为没有复制,并且在函数优化中使TT
与foo.bar
相同。