为什么Scala中的print()方法有副作用?它只是阅读,而不是写。换句话说,print()不会改变任何东西。
我似乎是一个"愚蠢的"问题,但有时小事会导致大动作。
答案 0 :(得分:6)
对函数没有副作用意味着可以用它的返回值替换对它的调用。 print
不返回任何值,因此如果它是纯的(它没有副作用),它可以被NOT-OPERATION替换。
但是,正如您在终端中看到的,当您致电print
时会发生某些事情:某些文字会在屏幕上打印出来。那是不 NOT-OPERATION,因此,print
会产生副作用。
答案 1 :(得分:2)
正如@lyjackal完美地说print()
会改变System.out
。
例如这两个定义
def sumA = {
val x = foo
val y = bar
val z = baz
x + y + z
}
def sumB = {
val x = foo
val z = baz
val y = bar
x + y + z
}
如果foo
和bar
没有副作用 ,应该相同
所以行
println(s"By the way your result is $sumA")
和
println(s"By the way your result is $sumB")
应该从技术和用户角度定义相同的行为
但考虑这些函数的定义
def foo = {
println("Good to see you sir!")
1
}
def bar = {
println("I hate you")
2
}
def baz = {
println("Just joking")
3
}
现在可以从用户角度看这些行为是否相同?
答案 2 :(得分:0)
该程序的输出可以连接到火箭发射器,火箭发射器了解以下命令:
LAUNCH ROCKETS 1,7,13
现在,你会说打印LAUNCH ROCKETS 1,7,13
没有副作用吗?如果我告诉你火箭13是针对你的房子怎么办?