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`,`<hello>`都是合法的。这种标识符其中一个用法是和其他语言交互的时候,如果碰到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


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

更多讨论请见 [url]http://groups.google.com/group/scalacn/t/908c379132da18e1[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值