2011-12-21 30 views
31

Giả sử tôi có một hàm, dummy, với 2 đối số. Các đối số có thể có các giá trị mặc định khi không được cung cấp trong cuộc gọi hàm. Nhưng làm thế nào để tôi biết là một đối số không được cung cấp?Làm thế nào để kiểm tra xem một đối số được cung cấp trong cuộc gọi chức năng?

Tôi biết tôi có thể sử dụng nargin, như thế này

function dummy(arg1, arg2) 
if nargin < 2 
    arg2 = 0; 
end 
if nargin < 1 
    arg1 = 0; 
end 
% function body 

Tôi muốn biết liệu tôi có thể kiểm tra xem một đối số được cung cấp dựa trên tên lập luận? Một cái gì đó như supplied(arg2) == false.

Tôi hỏi điều này bởi vì, đôi khi tôi muốn thêm đối số mới ở phía trước danh sách đối số (vì nó có thể không có giá trị mặc định), và sau đó tôi phải thay đổi tất cả if nargin .... Nếu tôi có thể kiểm tra theo tên, không có gì phải được thay đổi.

Trả lời

52

tôi luôn luôn làm như thế:

if ~exist('arg1','var') 
    arg1=0; 
end 

Như đã nói bởi @Andrey, với giải pháp này bạn có thể thay đổi số/thứ tự của các đối số của hàm, mà không thay đổi mã. Đây không phải là trường hợp với giải pháp nargin.

Như đã nói bởi @yuk, nếu bạn muốn cho phép bỏ qua đối số bạn có thể làm:

if ~exist('arg1','var') || isempty(arg1) 
    arg1=arg1DefaultValue; 
end 
+1

này là tốt hơn nhiều so với nargin, bởi vì bạn không cần phải thay đổi mã trong trường hợp bạn đã bao giờ thay đổi thứ tự của các tham số trong hàm. –

+1

Tôi cũng thường thêm '... | isempty (arg1) ', vì vậy người dùng có thể bỏ qua' arg1', nhưng cung cấp 'arg2'. Tất nhiên nếu 'arg1' không thể trống. – yuk

+2

Một cách phi thường, nhưng tôi nghĩ nó không thực sự trả lời câu hỏi. Dù sao, tôi chỉnh sửa câu trả lời, Ngoài ra tôi nghĩ rằng bạn phải sử dụng '||' (Short-Circuit Operator) để đảm bảo không có lỗi nếu 'arg1' không tồn tại. – Oli

Các vấn đề liên quan