【Scala之旅】控制结构和注解
for推导式Scala提供了一个轻量级符号 这里给个例子: case class User(val name: String,val age: Int) val userBase = List(new User("Travis",28),new User("Kelly",33),new User("Jennifer",44),new User("Dennis",23)) val twentySomethings = for (user <- userBase if (user.age >=20 && user.age < 30)) yield user.name // i.e. add this to a list twentySomethings.foreach(name => println(name)) // prints Travis Dennis
下面是更加复杂的例子,其使用了两个生成器。它计算在 def foo(n: Int,v: Int) = for (i <- 0 until n; j <- i until n if i + j == v) yield (i,j) foo(10,10) foreach { case (i,j) => print(s"($i,$j) ") // prints (1,9) (2,8) (3,7) (4,6) (5,5) } 这里 (0,0) (0,1) (0,2) (0,3) (0,4) (0,5) (0,6) (0,7) (0,8) (0,9) (1,1) ... 注意,推导式并不局限于列表。每一个支持 你可以在推导式中忽略 def foo(n: Int,v: Int) = for (i <- 0 until n; j <- i until n if i + j == v) print(s"($i,$j)") foo(10,10) 注解注解将元信息与定义关联起来。例如,如果在方法之前有 object DeprecationDemo extends App { @deprecated def hello = "hola" hello } 这段程序将编译,但是编译器会打印警告:“there was one deprecation warning”。 注解子句适用于它后面的第一个定义或声明。多个注解子句可能在定义和声明之前出现。这些子句的顺序无关紧要。 确保编码正确性的注解如果条件不满足,某些注解实际上会导致编译失败。例如, import scala.annotation.tailrec def factorial(x: Int): Int = { @tailrec def factorialHelper(x: Int,accumulator: Int): Int = { if (x == 1) accumulator else factorialHelper(x - 1,accumulator * x) } factorialHelper(x,1) }
import scala.annotation.tailrec def factorial(x: Int): Int = { @tailrec def factorialHelper(x: Int): Int = { if (x == 1) 1 else x * factorialHelper(x - 1) } factorialHelper(x) } 我们会得到一个“Recursive call not in tail position”的消息。 注解代码生成的影响一些注解如 Java注解在编写与 Java 交互的 Scala 代码时,注解语法有一些不同之处。注意:确保使用了 Java 以注解的形式拥有用户定义的元数据。注释的一个关键特征是它们依赖于指定 @interface Source { public String URL(); public String mail(); } 然后把它应用到下面 @Source(URL = "http://coders.com/",mail = "support@coders.com") public class MyClass extends HisClass ... Scala 中的注解应用程序看起来就像是构造函数调用,用于实例化一个 Java 注释,它必须使用命名参数: @Source(URL = "http://coders.com/",mail = "support@coders.com") class MyScalaClass ... 如果注解只包含一个元素(没有默认值),那么这个语法就很麻烦。因此,按照约定,如果名称被指定为 @interface SourceURL { public String value(); public String mail() default ""; } 然后把它应用到下面 @SourceURL("http://coders.com/") public class MyClass extends HisClass ... 在这种情况下,Scala 提供了同样的可能性 @SourceURL("http://coders.com/") class MyScalaClass ...
@SourceURL(value = "http://coders.com/",mail = "support@coders.com") public class MyClass extends HisClass ... Scala在这方面提供了更多的灵活性 @SourceURL("http://coders.com/",mail = "support@coders.com") class MyScalaClass ... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |