gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:59:14 26 4
gpt4 key购买 nike

我知道它保证在 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 规范的保证?

最佳答案

评估顺序在6.6 "Function Applications"中描述.基本上,它与 Java 中的相同:

Evaluation of f(e1,…,en) usually entails evaluation of f and e1,…,en in that order.

也就是说,

({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 }
)

将打印 "b" before 它打印 "a",即使 a 出现在 之前>bfoo 的参数列表中。确切的规则在 6.6.1 "Named and default arguments" 中描述。 .

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

关于scala - 参数评估顺序是否在 Scala 中得到保证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50801338/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com