Som*_*ame 3 scala function parameter-passing
我知道它保证在 Java 中从左到右执行,但是 Scala 怎么样?我有一个接受数组和可读字节限制的方法:
def scanArray(limit: Int, ba: Array[Byte]) = { }
Run Code Online (Sandbox Code Playgroud)
我还有一个方法,它接受一个数组,用一些数据填充它并返回它填充的字节数:
def fillArray(ba: Array[Byte]): Int = {...}
Run Code Online (Sandbox Code Playgroud)
问题是这样调用是否可以scanArray:
val ba = new Array[Byte](16)
scanArray(fillArray(ba), ba)
Run Code Online (Sandbox Code Playgroud)
行为有保障吗?还是 Scala 规范不保证?
求值顺序在第6.6 节“函数应用”中描述。基本上,它与 Java 中的相同:
对 f(e1,…,en) 的求值通常需要按顺序对 f 和 e1,…,en 求值。
那是,
({println("f"); (_: Int) + (_: Int)})(
{println("e1"); 40},
{println("e2"); 2}
)
Run Code Online (Sandbox Code Playgroud)
将首先打印"f",然后"e1",然后"e2",最后计算f(e1, e2),即42.
但是,这个简单的基本规则并不适用于所有情况。例如,如果您使用命名参数并更改这些参数的顺序,那么重要的不是方法定义中的顺序,而是您在调用站点传递命名参数的顺序。例如,
def foo(a: Int, b: Int): Unit = {}
foo(
b = { println("b"); 1 },
a = { println("a"); 2 }
)
Run Code Online (Sandbox Code Playgroud)
将打印"b" 之前它打印"a",即使a到来之前b中的参数列表foo。确切的规则在6.6.1 “命名和默认参数”中描述。
回答有关您的具体示例的问题:fillArray(ba)保证在 之前进行评估ba,因此您的代码似乎没问题。其实,在你的具体的例子,它不会真的重要,因为ba是val反正。它在调用之前和之后指向同一个数组fillArray。
| 归档时间: |
|
| 查看次数: |
295 次 |
| 最近记录: |