Scala小布丁: 字符串标识符(literal identifier)

阅读更多
先来看一段Scala代码
scala> def f(`yield` : Int) = 5 match { case `yield` => "yup"; case _ => "nope"}
f: (yield: Int)java.lang.String

scala> f(5)
res1: java.lang.String = yup


这段代码定义了一个函数,包含一个参数,函数主题是Pattern Match.
有趣的地方是参数变量是`yield`,
而且当传入5时,`yield`能match起来。
这是为什么呢?


Scala有相当多的方法表示标识符,如Java的字母和操作符外,有混合型标识符,操作符型标识符,还有字符串标识符。
字符串标识符用``包一个字符串,如`x`,``都是合法的。这种标识符其中一个用法是和其他语言交互的时候,如果碰到Scala保留关键字也不怕。一个典型的情况是需要调用Java的Thread.yield()时,因为yield是Scala保留关键字,所以编译不通过,需要用Thread.`yield`()。

转回来继续看上面的例子,
def f(`yield` : Int)

参数列表中`yield`是参数名,因为yield是保留字,所以用``括起来。

 5 match { case `yield` => "yup"; case _ => "nope"}

这里的`yield`是用了pattern match的一个特性。 pattern match在遇到小写的字母开头时会把它当变量赋予值,这是用得最多的情况;当遇到大小字母开头的变量名时,会试着当常量对待;而当遇到用``时,它会用该变量所含的值去匹配。


scala> val a = 2
a: Int = 2

scala> 2 match {case `a` => println("Yes"); case _ => println("No")}
Yes


所以上面的例子用这样也是一样的效果
scala> def g(x : Int) = 5 match { case `x` => "yup"; case _ => "nope"}
g: (x: Int)java.lang.String

scala> g(5)
res3: java.lang.String = yup


结论
这个小例子含了Scala的两个小布丁,一是用``当做变量名,二是``在模式匹配时的特性,取变量值进行匹配。

更多讨论请见 http://groups.google.com/group/scalacn/t/908c379132da18e1

你可能感兴趣的:(Scala,Java,F#,Google,thread)