programming-languages - 明确函数可以修改其参数

标签 programming-languages function language-design

为什么如此多的编程语言使得函数可以修改作为参数传递给它的对象,而无需某种语法来让调用者清楚地了解这一点。例如考虑:

SomeObject A(15), B
B = DoSomething(A)
print(A + " " + B + "\n)

阅读该代码,您会期望输出类似于“15 75”,即 A 是您构造它的结果。然而,大多数语言都允许 DoSomething 更改 A 的值。在 C++ 中,您可以通过查看 DoSomething 的声明来判断其是否可能,例如通过查看参数是否定义为非常量引用。然而,在许多语言中,例如 Python,如果不通读函数代码以确保它永远不会改变,就没有办法判断 A。

我已经被这个问题困扰过几次,特别是当尝试使用其他人的代码时,这些代码使用了这种行为,并且通常会导致逐行检查整个代码段以尝试找到正在更改参数的内容。 .

为什么语言通常不需要一些显式的语法来调用“是的,这个对象可以修改”,例如“B = DoSomething(inout A)”?

除了“永远不要修改传递给函数的参数”之外,是否有任何编码标准可以帮助防止问题发生?

最佳答案

如果你看看Java,方法并不能真正改变参数(Java只有输入参数)。但参数通常只是对某个要使用的对象的引用,这意味着该方法可以以任何可能的方式更改该对象。这使得推理语义(不查看文档)变得困难,与函数编程完全相反。

你说得对,这是不可取的,但在短期内它让事情变得更容易。不幸的是,大多数情况下,重要的是短期,因此我们仍在使用支持隐藏副作用的语言......

关于programming-languages - 明确函数可以修改其参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1141826/

相关文章:

groovy - 格鲁维怎么了?

programming-languages - 为什么禁止嵌套评论?

c - 当非静态函数声明跟在静态函数声明之后会发生什么?

c# - 方法作用域中的命名冲突

java - Java 是否需要重新启动?

php循环抛硬币直到出现2个正面,然后停止

php - 我可以/如何...在 PHP 的类之外调用 protected 函数

java - 为什么我不能创建泛型数组?

language-agnostic - 当速记列表和方法签名覆盖可用时用于变量 args 语法

haskell - 有没有简单的方法可以用 monad 类型扩展简单类型的 lambda 演算?