Soru Bir argümanın fonksiyon çağrısında sağlanıp sağlanmadığı nasıl kontrol edilir?


Benim bir fonksiyonum olduğunu söyle dummy2 argüman ile. Argümanlar, işlev çağrısında verilmediğinde varsayılan değerlere sahip olabilir. Ama nasıl bir argüman verilmediğini biliyorum?

Biliyorum kullanabiliyorum nargin, bunun gibi

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

Argüman ismine göre argümanların sağlanıp sağlanmadığını kontrol edip edemeyeceğimi bilmek istiyorum. Gibi bir şey supplied(arg2) == false.

Bunu soruyorum çünkü bazen argüman listesinin önüne yeni argümanlar eklemek istiyorum (varsayılan değere sahip olmayabilir) ve sonra tüm if nargin .... Eğer isimle kontrol edebilirsem, hiçbir şeyin değiştirilmesi gerekmiyor.


32
2017-12-21 13:22


Menşei




Cevaplar:


Ben her zaman böyle yaparım:

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

@Andrey tarafından söylendiği gibi, bu çözümle, kodu değiştirmeden işlevin argümanlarının sayısını / sırasını değiştirebilirsiniz. Durum böyle değil nargin çözüm.

@Yuk tarafından söylendiği gibi, bağımsız değişkenleri atlamak için izin vermek isterseniz şunları yapabilirsiniz:

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

53
2017-12-21 13:48



Bu, nargin'den çok daha iyidir, çünkü işlevdeki parametrelerin sırasını hiç değiştirdiğinizde kodu değiştirmeniz gerekmez. - Andrey Rubshtein
Ben de ekledim ... | isempty(arg1), bu yüzden kullanıcı atlayabilir arg1ama tedarik arg2. Tabi eğer arg1 boş olamaz. - yuk
Olumsuzca, ama soruyu gerçekten cevaplamadığını düşündüm. Her neyse, cevabı düzenledim, ayrıca kullanman gerektiğini düşünüyorum || (Kısa Devre Operatörü) arg1 bulunmuyor. - Oli
@yuk, iyi biri! Hiç düşünmemiştim. - Andrey Rubshtein
Burada atlamanın tedarik anlamına geldiğini unutmayın. [] veya {} argüman yerine, Visual Basic / VBScript stili atlama değil, bu gibi birden fazla virgül yerleştirir f(,,a,,,a). - Evgeni Sergeev