可變長度多重傳回值(Variable-length Return Lists)
函數的傳回值亦可指定為不固定的個數,其用法就是在傳回值的部分加入一個 varargout
,此參數與輸入參數的 varargin
一樣是一個巢狀陣列(cell array,請參考巢狀陣列)。例如下面這個函數會將第一個傳回值設為 1
,第二個傳回值設為 2
,以此類推:
function varargout = one_to_n () for i = 1:nargout varargout{i} = i; endfor endfunction
執行此函數
[a, b, c] = one_to_n ()
輸出為
a = 1 b = 2 c = 3
varargout
參數要放在最後一個傳回值時,才有這種特別的作用,若不是放在最後一個,則會視為一般的傳回值。
[r1, r2, ..., rn] = deal (a) [r1, r2, ..., rn] = deal (a1, a2, ..., an)
deal()
函數會將輸入的參數指定為輸出的傳回值,例如:
[a, b, c] = deal (1, 2, 3)
輸出為
a = 1 b = 2 c = 3
若只有一個輸入參數,則會將此參數指定給所有的傳回值,例如:
[a, b, c] = deal (1)
輸出為
a = 1 b = 1 c = 1
函數返回敘述(Returning From a Function)
在 Octave 函數中可以使用 return
敘述跳過之後的程式碼提早離開函數,其使用方式很簡單:
return
Octave 的 return
敘述與 C 語言中的 return
不同,其功能只有離開目前的函數而已,無法傳回任何的值,若需要傳回值必須將要傳回的值指定給傳回值參數。
下面這個範例會檢查一個向量中是否有任何一個元素不為 0
:
function retval = any_nonzero (v) retval = 0; for i = 1:length (v) if (v (i) != 0) retval = 1; return; endif endfor printf ("no nonzero elements found\n"); endfunction
這個函數中若要以 break
敘述來替代 return
敘述,則還要在加入一個判斷式控制最後輸出的訊息。
return
當 Octave 在函數或指令稿中碰到 return
時,會馬上返回;若在最上層執行此敘述則沒有作用。在 Octave 中每一個函數的結尾預設都會執行 return
敘述。
預設參數(Default Arguments)
由於 Octave 支援不固定的輸入參數,若配合設定參數的預設值在許多情況下會非常方便,參數預設值的使用方式為:
function name (arg1 = val1, ...) body endfunction
若是這樣定義此函數,則在 arg1 沒有指定時,其預設值為 val1。例如:
function hello (who = "World") printf ("Hello, %s!\n", who); endfunction
若呼叫 hello()
沒有指定參數時
hello();
則 who
預設為 "World"
,其輸出為
Hello, World!
若有指定參數
hello ("Beautiful World of Free Software");
輸出為
Hello, Beautiful World of Free Software!
若要明確告知 Octave 使用函數預設的參數,可以使用冒號,例如:
hello(:);
輸出為
Hello, World!