如果我打开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
Octave允许我改变“sum”这个词的位置,所以现在它的值不是函数。为什么允许这样做,不应该给我一个警告 - 这不是非常危险吗?
如果我意识到我已经完成了这项工作,我是否会在不关闭八度并删除工作空间的情况下删除引用?
答案 0 :(得分:2)
如果我意识到我已经完成了这项工作,我是否会在不关闭八度并删除工作空间的情况下删除引用?
使用命令clear sum
清除符号sum
的用户定义,这将使其恢复为内置含义。 (也就是说,内置定义将不再被用户定义遮蔽。)
至于为什么Octave以这种方式工作,人们不得不向维护人员询问这个开源项目。也许是因为Matlab以这种方式工作,而Octave努力尽可能兼容。
答案 1 :(得分:2)
想象一下,Octave不允许变量与函数相同。你在Octave编写一个程序,你有一个名为total
的变量,它不是一个函数。一切都好。出现了一个新的Octave版本,并添加了一个名为total
的函数。您的程序将停止工作,您必须重命名变量。这种向后不兼容的程度会更糟。问题不仅限于新的Octave版本。也许你后来决定要使用Octave包,它带来了一整套新功能,其中一个可能会与你的变量冲突。
但是,在即将发布的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 Octave的目标之一。
要解决这个问题,Octave编码指南(代码对Octave有所贡献的指导.Octave解析器并不关心)要求函数总是使用括号并在它们和函数名之间留一个空格:
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