首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >参数评估顺序是否在scala中得到了保证?

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

Stack Overflow用户
提问于 2018-06-11 15:32:10
回答 1查看 445关注 0票数 3

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

代码语言:javascript
运行
复制
def scanArray(limit: Int, ba: Array[Byte]) = { }

我还有一个方法,它接受一个数组,用一些数据填充它,并返回它填充的字节数:

代码语言:javascript
运行
复制
def fillArray(ba: Array[Byte]): Int = {...}

问题是按以下方式调用scanArray是否可以:

代码语言:javascript
运行
复制
val ba = new Array[Byte](16)
scanArray(fillArray(ba), ba)

行为有保证吗?或者它没有得到Scala规范的保证?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-11 15:56:57

评价顺序用6.6“功能应用”描述。基本上,它与Java中的相同:

f(e1,…)的评价,en)通常包含f和e1、…的评估。,按顺序排列。

那是,

代码语言:javascript
运行
复制
({println("f"); (_: Int) + (_: Int)})(
  {println("e1"); 40},
  {println("e2"); 2}
)

首先打印"f",然后打印"e1",然后打印"e2",最后打印f(e1, e2),即42

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

代码语言:javascript
运行
复制
def foo(a: Int, b: Int): Unit = {}

foo(
  b = { println("b"); 1 },
  a = { println("a"); 2 }
)

将在打印"b"之前打印"a",即使afoo的参数列表中位于b前面。确切的规则在6.6.1“命名和默认参数”中描述。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50801338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档