2015-04-02 63 views
4

我在MATLAB的情況下我想嘗試一個struct字段分配到一個新的變量,就像這樣:1行的try/catch相當於在MATLAB

swimming = fish.carp; 

但是場可能會或可能不被定義。如果不是有效的字段,有沒有辦法指定默認值?例如,在Perl我會寫

my $swimming = $fish{carp} or my $swimming = 0; 

其中0是默認值和or指定如果分配失敗時要執行的動作。似乎在MATLAB中應該存在類似的東西,但我似乎無法找到任何相關文檔。爲了代碼可讀性,我寧願不使用if語句或try/catch塊,如果我可以幫忙的話。

+6

在Perl倒不如寫'先前定義的默認值我的$游泳= $魚{鯉魚} // 0;'(5.10+)或'我的$游泳= (存在$ fish {carp})? $ fish {carp}:0;'(<5.10)。 – ThisSuitIsBlackNot 2015-04-02 19:43:47

+1

你可能是對的,但那不能回答我的問題(-1)。 – dannyhmg 2015-04-02 19:48:25

+7

這就是爲什麼它是一個評論,而不是一個答案。 – ThisSuitIsBlackNot 2015-04-02 19:50:21

回答

4

你可以使自己的功能來處理這個問題,並保持代碼相當清晰。喜歡的東西:

swimming = get_struct(fish, 'carp', 0); 

function v = get_struct(s, f, d) 

if isfield(s, f) 
    v = s.(f); % Struct value 
else 
    v = d;  % Default value 
end 

最佳,

3

從我所知道的,你不能在MATLAB中的一行中做到這一點。 MATLAB邏輯結構需要明確的if/else語句,並且不能在一行中完成......就像在Perl或Python中一樣。

您可以執行的操作是檢查fish結構是否包含字段。如果不是,則可以將默認值設置爲0.

使用isfield可以幫助您做到這一點。因此:

if isfield(fish, 'carp') 
    swimming = fish.carp; 
else 
    swimming = 0; 
end 

而且,什麼Ratbert說,你可以把它與逗號一條線......但同樣,你仍然需要if/else結構:

if isfield(fish,'carp'), swimming = fish.carp; else, swimming = 0; 

另一種可能解決方法是自己聲明一個自定義函數,該函數需要一個結構和一個字段,並允許它返回該字段的值,即0。

function [out] = get_field(S, field) 
    if isfield(S, field) 
     out = S.(field); 
    else 
     out = 0; 
    end 

然後,你可以這樣做:

swimming = get_field(fish, 'carp'); 

swimming要麼由0或fish.carp。這樣,它不會犧牲代碼可讀性,但您需要創建一個自定義函數來執行您想要的操作。

+0

OP問:「爲了代碼可讀性,我寧願不使用if語句......」 – Ratbert 2015-04-02 19:58:39

+2

@Ratbert - 我知道......並且我告訴OP它不可能是完成....至少不是我能看到的。我正在做一些測試,看看我是否可以在沒有這個的情況下把它煮成一條線。 – rayryeng 2015-04-02 19:59:02

+1

你可以用逗號將它們放在一行中:'if isfield(fish,'carp'),swimming = fish.carp;否則,游泳= 0;結束「,但這不是很有幫助... – Ratbert 2015-04-02 20:00:41

3

如果你不喜歡來定義一個單獨的函數文件的自定義功能 - 這當然是一個不錯的選擇 - 你可以而是在腳本的開頭定義兩個匿名函數

helper = {@(s,f) 0, @(s,f) s.(f)} 
getfieldOrDefault = @(s,f) helper{ isfield(s,f) + 1 }(s,f) 

隨着定義

fish.carp = 42 

和函數調用

a = getfieldOrDefault(fish,'carp') 
b = getfieldOrDefault(fish,'codfish') 

你得到的第一個

a = 42 

和用於第二殼體

b = 0 
+1

所以mindtwisted ...我真的很喜歡它! – Ratbert 2015-04-03 17:24:17