2017-04-20 32 views
1

如果我開八度,做:爲什麼Octave允許重命名函數?

a = 1:10; 
sum(a) 

ans = 55 

但如果我那麼做:

sum = 30; 
sum(a) 

我得到一個錯誤:

error: A(I): index out of bounds; value 10 out of bound 1 

八度已經讓我改變這裏所說的「總和」指出現在它的價值不是一個函數。爲什麼這是允許的,不應該給我一個警告 - 這是不是非常危險?

如果我意識到我已經完成了這個操作,那麼我是否刪除了引用而沒有關閉八度並丟失了我的工作空間?

+0

Matlab通過這種方式實現....你甚至可以做'min = @max; min([2 3 4 5])'現在將輸出'ans = 5' – Andy

回答

2

想象一下Octave不允許變量具有相同的功能。你用Octave編寫一個程序,並且你有一個名爲total的變量,這不是函數。一切安好。一個新的Octave版本出來並增加了一個名爲total的函數。你的程序將停止工作,你將不得不重新命名你的變量。這種向後不相容的程度會更糟。這個問題不會侷限於新的八度版本。也許你以後決定要使用一個帶有一整套新功能的Octave軟件包,其中一個可能與你的變量衝突。

但是,在即將發佈的Octave版本中,越界錯誤將提示變量名稱正在映射函數。在八度4.2.1:

octave-cli-4.2.0:1> a = 1:10; 
octave-cli-4.2.0:2> sum = 30; 
octave-cli-4.2.0:3> sum (a) 
error: sum(10): out of bound 1 

雖然在4.3.0+(其中有一天會成爲4.4):

octave-cli-4.3.0+:1> a = 1:10; 
octave-cli-4.3.0+:2> sum = 30; 
octave-cli-4.3.0+:3> sum(a) 
error: sum(10): out of bound 1 (note: variable 'sum' shadows function) 

然而,真正的問題不在於變量可以陰影功能。真正的問題是語法不允許區分變量和函數。變量索引和函數調用都使用相同的括號()(其他語言通常對功能使用(),對索引變量使用[])。而且,即使你調用一個函數不帶任何參數,括號是可選的:

foo(1) # 1st element of foo? Or is foo a function? 
foo  # Is this a variable or a function call without any arguments? 
foo() # idem 

這句法的要求主要是針對Matlab的兼容性是GNU八度的目標之一。

要解決這方面的不足,八度編碼準則(代碼所需的指導原則促成了八度八度分析器並不真正關心。)要求總是使用括號,並讓他們與函數名之間的空間功能:

foo (x, y); # there is a space after foo so it must be a function 
foo(x, y); # there is no space, it is indexing a matrix 
foo   # this is a variable 
foo();  # this is a function 
+0

第一段有趣的合理化。最後有趣的編碼風格信息。我知道你想解釋爲什麼錯誤信息是「Index out of bounds」而不是「試圖調用某些功能」。您可能需要重新考慮用於描述基礎語言屬性的貶義詞彙(「問題」,「缺陷」)。海事組織減少了你的答案的價值。 –

+0

我認爲成爲一名Octave開發人員可以讓我有足夠的餘地使用任何我想要的詞彙。 – carandraug

2

How, if I realise I've done this, do I remove the reference without closing octave and losing my workspace?

命令clear sum清除符號sum的用戶定義,將其還原爲內置的意思。 (也就是說,內置的定義將不再受用戶定義的影響。)

至於爲什麼Octave以這種方式工作,人們不得不問這個開源項目的維護者。也許是因爲Matlab以這種方式工作,Octave努力盡可能兼容。

相關問題