代码如下:
fun main(args: Array<String>){
val items = listOf(1, 2, 3, 4)
items.first()
items.last()
items.filter { it % 2 == 0 }
}
我有一些扩展方法,例如 first()
和 last()
- 但它们没有执行任何操作(没有分配给任何变量)。这是否意味着编译器只是跳过它们并且不执行任何操作?
最佳答案
but they arn't doing anything (not being a assigned to a variable of anything)
据编译器所知,它们可能会产生副作用(例如打印某些内容或设置字段),在这种情况下它们必须被执行。如果他们是inline
,编译器可能会在内联后消除它们,正如 Josh 的回答提到的那样。但它们不是,因此编译器不能依赖它们的定义(而不是签名):在运行时可能有一个不同的 JAR 包含这些方法并用副作用定义它们。
但是,如果您运行此代码足够长的时间,JIT 很可能会内联它们,然后消除它们;只是不是立即。
原则上可能有contracts将这些方法声明为纯方法,然后编译器可以消除它们。但据我所知,当前的契约(Contract)不支持这一点。
关于java - void 函数/属性调用在哪里执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54837419/