我有一個緩存評估的功能。作爲參數之一,它需要一個函數句柄。在某些情況下,函數句柄是無法訪問的,我不太明白爲什麼。下面的例子說明了什麼讓我難住了:什麼時候可以傳遞一個函數句柄?
>> A.a = @plus; feval(@A.a, 1, 1)
ans =
2
>> clear A
>> A.a.a = @plus; feval(@A.a.a, 1, 1)
Error using feval
Undefined function 'A.a.a' for input arguments of type 'double'.
所以,如果我有存儲爲結構成員的功能手柄,我可以把它傳遞罰款,如果它是一個層次深,但如果它不是兩層深。在我的真實使用案例中,我有一個結構D
,其中包含許多(117)各種類的實例,所以實際上我有stct.obj.meth
,其中stct
是一個結構,obj
是一個類實例/對象,而meth
是一種方法。通過@stct.obj.meth
失敗,但如果我分配A = stct.obj
,則通過@A.meth
成功。
在什麼情況下,我可以傳遞一個函數句柄作爲參數,這樣它仍然可以通過堆棧訪問?
編輯:雖然在上面的使用情況下,我可以簡單地刪除@
因爲@plus
已經是一個功能句柄。然而,考慮這裏的情況:
>> type cltest.m
classdef cltest < handle
methods
function C = mymeth(self, a, b)
C = a + b;
end
end
end
>> A.a = cltest();
>> feval(@A.a.mymeth, 1, 1)
Error using feval
Undefined function 'A.a.mymeth' for input arguments of type 'double'.
>> b = A.a;
>> feval(@b.mymeth, 1, 1)
ans =
2
在這種情況下,我需要的前@
... A.a.mymeth
我沒有爲什麼'@ Aamymeth'不會產生有效的函數句柄很好的解釋,但值得注意的是,在你的第一個例子中,額外的'@'不需要。你可以使用'A.a = @plus; feval(A.a,1,1);'因爲'A.a'已經是一個函數指針。 – nispio
@nispio是的。這是早先的,現在被刪除的答案的要點。 – gerrit