gpt4 book ai didi

scala - 为什么在scala中修改了if位置?

转载 作者:行者123 更新时间:2023-12-03 18:18:25 25 4
gpt4 key购买 nike

所以我正在学习 Scala 并遇到了一些这样的例子:

val doubleEven = for (i <- 1 to 10; if i % 2 == 0)
yield i * 2

现在,将这种特殊语法内置到 for 循环中而不是由来已久的语法有什么额外的好处?
val doubleEven = for(i <- 1 to 10){
if(i % 2 == 0)
yield i*2
}

风格如果?

编辑:当然,后一个例子实际上不起作用。但我很好奇为什么 Scala 人决定使用单独的语法。

最佳答案

文件内容 A.scala :

object A {
val doubleEven1 = for (i <- 1 to 10; if i % 2 == 0) yield i * 2
}
scalac -Xprint:jvm A.scala 的输出:
[[syntax trees at end of jvm]]// Scala source: A.scala
package <empty> {
final class A extends java.lang.Object with ScalaObject {
private[this] val doubleEven1: scala.collection.immutable.IndexedSeq = _;
<stable> <accessor> def doubleEven1(): scala.collection.immutable.IndexedSeq = A.this.doubleEven1;
def this(): object A = {
A.super.this();
A.this.doubleEven1 = scala.this.Predef.intWrapper(1).to(10).withFilter({
(new A$$anonfun$1(): Function1)
}).map({
(new A$$anonfun$2(): Function1)
}, immutable.this.IndexedSeq.canBuildFrom()).$asInstanceOf[scala.collection.immutable.IndexedSeq]();
()
}
};
@SerialVersionUID(0) @serializable final <synthetic> class A$$anonfun$1 extends scala.runtime.AbstractFunction1$mcZI$sp {
final def apply(i: Int): Boolean = A$$anonfun$1.this.apply$mcZI$sp(i);
<specialized> def apply$mcZI$sp(v1: Int): Boolean = v1.%(2).==(0);
final <bridge> def apply(v1: java.lang.Object): java.lang.Object = scala.Boolean.box(A$$anonfun$1.this.apply(scala.Int.unbox(v1)));
def this(): A$$anonfun$1 = {
A$$anonfun$1.super.this();
()
}
};
@SerialVersionUID(0) @serializable final <synthetic> class A$$anonfun$2 extends scala.runtime.AbstractFunction1$mcII$sp {
final def apply(i: Int): Int = A$$anonfun$2.this.apply$mcII$sp(i);
<specialized> def apply$mcII$sp(v1: Int): Int = v1.*(2);
final <bridge> def apply(v1: java.lang.Object): java.lang.Object = scala.Int.box(A$$anonfun$2.this.apply(scala.Int.unbox(v1)));
def this(): A$$anonfun$2 = {
A$$anonfun$2.super.this();
()
}
}
}

如您所见,编译器创建了一个 Range从 1 到 10。然后它调用 withFilter在那 Range过滤所有偶数。最后一步是 map的调用- 与 2 相乘的方法。

你的第二个例子是否工作语义会有点不同。因为它会在没有过滤的情况下在每次迭代中执行循环体。

这是一个品味问题,但我更喜欢这个:
val doubleEven = 1 to 10 filter(_%2==0) map(_*2)

关于scala - 为什么在scala中修改了if位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3201060/

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