为什么在scala中修改了if位置?
发布时间:2020-12-16 18:26:16 所属栏目:安全 来源:网络整理
导读:所以我正在学习 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,并遇到了一些这样的例子:
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(); () } } } 如您所见,编译器创建一个范围从1到10.然后它调用该Range上的withFilter来过滤所有偶数.最后一步是调用map-method,乘以2. 你的第二个例子在语义上是否会有所不同.因为它会在每次迭代中执行循环体而不进行过滤. 这是一个品味问题,但我更喜欢这个: val doubleEven = 1 to 10 filter(_%2==0) map(_*2) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |