Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
参数评估顺序是否在scala中得到保证?_Scala_Function_Parameter Passing - Fatal编程技术网

参数评估顺序是否在scala中得到保证?

参数评估顺序是否在scala中得到保证?,scala,function,parameter-passing,Scala,Function,Parameter Passing,我知道它保证在Java中从左到右执行,但是Scala呢?我有一个接受数组和可读字节限制的方法: def scanArray(limit: Int, ba: Array[Byte]) = { } 我还有一个方法,它接受数组,用一些数据填充它,并返回它填充的字节数: def fillArray(ba: Array[Byte]): Int = {...} 问题是是否可以按如下方式调用scanArray: val ba = new Array[Byte](16) scanArray(fillArra

我知道它保证在Java中从左到右执行,但是Scala呢?我有一个接受数组和可读字节限制的方法:

def scanArray(limit: Int, ba: Array[Byte]) = { }
我还有一个方法,它接受数组,用一些数据填充它,并返回它填充的字节数:

def fillArray(ba: Array[Byte]): Int = {...}
问题是是否可以按如下方式调用
scanArray

val ba = new Array[Byte](16)
scanArray(fillArray(ba), ba)

行为有保证吗?或者Scala规范不保证这一点?

中描述了评估顺序。基本上,它与Java中的相同:

对f(e1,…,en)的评估通常需要按照该顺序对f和e1,…,en进行评估

就是

({println("f"); (_: Int) + (_: Int)})(
  {println("e1"); 40},
  {println("e2"); 2}
)
将首先打印
“f”
,然后打印
“e1”
,然后打印
“e2”
,最后计算
f(e1,e2)
,即
42

不过,这个简单的基本规则并不适用于所有情况。例如,如果使用命名参数并更改这些参数的顺序,那么重要的不是方法定义中的顺序,而是在调用站点传递命名参数的顺序。比如说,

def foo(a: Int, b: Int): Unit = {}

foo(
  b = { println("b"); 1 },
  a = { println("a"); 2 }
)
即使在
foo
的参数列表中
a
位于
b
之前,也会在打印
“a”之前打印
“b”
。具体规则如中所述

要回答有关具体示例的问题:
fillArray(ba)
保证在
ba
之前进行评估,因此您的代码看起来还可以。实际上,在您的特定示例中,这并不重要,因为无论如何,
ba
是一个
val
。它在调用
fillArray
前后指向同一个数组