【发布时间】:2012-03-21 02:31:35
【问题描述】:
编辑:我一直在这里获得支持。只是为了记录,我不再认为这很重要。自从我发布后我就不需要它了。
我想在 Scala 中进行以下操作...
def save(srcPath: String, destPath: String) {
if (!destPath.endsWith('/'))
destPath += '/'
// do something
}
...但我不能因为destPath 是一个val。有没有办法将destPath 声明为var?
注意:有类似的问题,但在所有问题中,OP 只是想修改数组。
请不要建议以下内容:
改变输入参数通常被视为不好的风格,并使其 更难推理代码。
我认为它在命令式编程中是有效的(Scala 允许两者,对吗?)并且添加类似 tmpDestPath 的内容只会增加混乱。
编辑:不要误解。我知道字符串不是可变的,我不想引用引用,因为我不想修改调用者的数据。我只想修改调用者用我的字符串给我的字符串的本地引用(例如,orig + '/')。我只想在当前方法的范围内修改该值。看,这在 Java 中是完全有效的:
void printPlusOne(int i) {
i++;
System.out.println("i is: " + i);
System.out.println("and now it's same: " + i);
}
我不必创建新变量,也不必计算 i+1 两次。
【问题讨论】:
-
澄清后的答案是:不能。
-
这就是我的怀疑。我要把它发布到 scala-debate 上。
-
好吧,Scala 社区实际上并不赞成能够直接修改函数参数,无论是通过值还是通过引用。原因与为什么 Scala 还缺少您的示例中的其他内容的原因相同:用于数字类型的一元
++运算符。这样的事情散发出一种非功能性、面向副作用的编程风格,这是 Scala 通常鼓励您避免的。就目前而言,如果你想重复改变一个函数参数,你必须先将它存储到一个var,这样你的意图就更清楚了,无论如何! -
@Destin 实际上,这根本不是缺少
++的原因。++的问题在于它不能作为类的方法来实现——它必须是编译器中内置的语言特性,并且特定于某些类型。 -
如果你在想,“我希望我的编程语言可以改变参数”,那么问题不在于编程语言。
标签: scala variables methods parameters