Tôi có chức năng đánh giá được lưu trong bộ nhớ cache. Là một trong các đối số, nó cần một hàm xử lý. Trong một số trường hợp, chức năng xử lý là không thể tiếp cận, và tôi không hoàn toàn hiểu tại sao. Ví dụ dưới đây cho thấy những gì đã cho tôi bối rối:Khi nào tôi có thể vượt qua một tay cầm chức năng?
>> 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'.
Vì vậy, nếu tôi có một chức năng xử lý được lưu trữ như một thành viên cơ cấu, tôi có thể vượt qua nó cùng tốt nếu nó là một mức độ sâu sắc, nhưng không nếu đó là hai cấp độ sâu. Trong trường hợp sử dụng thực sự của tôi, tôi có cấu trúc D
chứa nhiều (117) phiên bản của các lớp khác nhau, vì vậy tôi thực sự có stct.obj.meth
, trong đó stct
là cấu trúc, obj
là một cá thể/đối tượng lớp và meth
là một phương thức. Việc vượt qua @stct.obj.meth
không thành công, nhưng nếu tôi chỉ định A = stct.obj
, thì hãy chuyển @A.meth
thành công.
Trong điều kiện nào tôi có thể chuyển một hàm xử lý làm đối số, để nó vẫn có thể truy cập xuống ngăn xếp?
Sửa: Mặc dù trong trường hợp sử dụng ở trên, tôi chỉ đơn giản là có thể loại bỏ các @
vì @plus
đã là một chức năng xử lý. Tuy nhiên, xem xét tình hình ở đây:
>> 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
Trong trường hợp này, tôi cần các @
trước A.a.mymeth
...
Tôi không giải thích rõ lý do tại sao '@ Aamymeth' không tạo ra hàm xử lý hợp lệ, nhưng đáng lưu ý rằng trong ví dụ đầu tiên,' @ 'không phải là cần thiết. Bạn có thể sử dụng 'A.a = @plus; feval (A.a, 1,1), 'bởi vì' A.a' đã là một con trỏ hàm. – nispio
@nispio Có. Đó là ý chính của câu trả lời trước đó, giờ đã bị xóa. – gerrit