캐시 된 평가 기능이 있습니다. 인수 중 하나로서 함수 핸들을 사용합니다. 어떤 상황에서는, 함수 핸들을 접근 할 수없고, 나는 왜 그런지 이해하지 못한다. 아래 예제는 내가 난처한 상황에 빠진있어 보여줍니다 :함수 핸들을 언제 전달할 수 있습니까?
>> 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'.
을 그래서,이 구조체 멤버로 저장하는 기능 핸들이있는 경우, 그것은 한 단계 깊은 있다면 난 괜찮아 함께 전달할 수 있지만, 두 가지 수준의 깊이입니다하지 않을 경우. 내 실제 사용 사례에서 다양한 클래스의 많은 (117) 인스턴스를 보유하는 구조 D
을 가지고 있으므로 실제로는 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
을, 나는 @
나는 Aamymeth' @'가 유효한 기능 핸들을 생성하지 않는 이유에 대한 좋은 설명이없는, 그러나 당신의 첫 번째 예제에서'추가는 @'아니라는 것을 주목할 필요가있다 필요합니다. 당신은'A.a = @plus; feval (A.a, 1,1);''A.a'가 이미 함수 포인터이기 때문입니다. – nispio
@nispio 예. 그것은 이전에 삭제 된 답변의 요지였습니다. – gerrit