Stellen Sie sich vor Octave lässt Variablen nicht die gleiche Funktion haben. Sie schreiben ein Programm in Octave und Sie haben eine Variable mit dem Namen total
, die keine Funktion ist. Alles ist gut. Eine neue Octave-Version kommt heraus und fügt eine Funktion namens total
hinzu. Ihr Programm würde nicht mehr funktionieren und Sie müssten Ihre Variablen umbenennen. Das Niveau der Rückwärtsinkompatibilität wäre schlechter. Und das Problem wäre nicht auf neue Octave-Versionen beschränkt. Vielleicht entscheiden Sie später, dass Sie ein Octave-Paket verwenden möchten, das eine ganze Reihe neuer Funktionen enthält, von denen eine mit Ihren Variablen kollidieren könnte.
In der kommenden Version von Octave geben Fehler außerhalb der Grenzen jedoch einen Hinweis darauf, dass der Variablenname eine Funktion beschattet. In 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
Während in 4.3.0+ (die ein Tag 4.4 werden wird):
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)
jedoch das eigentliche Problem ist nicht, dass Variablen Schatten kann Funktionen. Das eigentliche Problem besteht darin, dass die Syntax es nicht erlaubt, zwischen einer Variablen und einer Funktion zu unterscheiden. Sowohl Variablenindexierung als auch Funktionsaufruf verwendet die gleichen Klammern ()
(andere Sprachen verwenden normalerweise ()
für Funktionen und []
für Indexvariablen). Und selbst wenn Sie ohne Argumente eine Funktion aufrufen, die Klammern sind optional:
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
Diese Syntax hauptsächlich für Matlab Kompatibilität erforderlich ist, die eines der Ziele der GNU Octave ist.
um diesen Mangel zu umgehen, Octave Code-Richtlinien (für Code erforderlich Richtlinien Octave beigetragen Der Octave-Parser kümmert sich nicht wirklich.) Erfordert Funktionen immer Klammern verwenden, um und einen Raum zwischen ihnen und dem Funktionsnamen hat:
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
Matlab macht es so ....Du kannst sogar 'min = @max; min ([2 3 4 5]) 'was nun 'ans = 5' ausgibt – Andy