`yield`是什么特性?

13 views
Skip to first unread message

Xuefeng Wu

unread,
Feb 6, 2010, 3:15:15 AM2/6/10
to ScalaCn
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



--
Scala中文社区:  http://groups.google.com/group/scalacn

Ford Guo

unread,
Feb 6, 2010, 3:53:40 AM2/6/10
to sca...@googlegroups.com
此处yield是变量名吧,因此在scala中yield是关键字,所以要定义这些关键只能用``引起来

Ford Guo


2010/2/6 Xuefeng Wu <ben...@gmail.com>
--
您收到此邮件是因为您订阅了 Google 网上论坛的“Scala中文社区”论坛。
要向此网上论坛发帖,请发送电子邮件至 sca...@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 scalacn+u...@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/scalacn?hl=zh-CN 访问此网上论坛。

Xuefeng Wu

unread,
Feb 6, 2010, 5:14:47 AM2/6/10
to scalacn
如果改成一般变量名就没这个效果了
scala> def f(dd : Int) = 5 match { case dd => "yup"; case _ => "nope"}
<console>:4: error: unreachable code
       def f(dd : Int) = 5 match { case dd => "yup"; case _ => "nope"}
                                                               ^
def f(`dd` : Int) = 5 match { case `dd` => "yup"; case _ => "nope"}
也是有效的



2010/2/6 Ford Guo <agil...@gmail.com>

Ford Guo

unread,
Feb 6, 2010, 5:17:51 AM2/6/10
to sca...@googlegroups.com
应该是 case dd:Int=>吧

Ford Guo

unread,
Feb 6, 2010, 5:18:47 AM2/6/10
to sca...@googlegroups.com
or dd match {case 5=>.....
Ford Guo


2010/2/6 Ford Guo <agil...@gmail.com>

Xuefeng Wu

unread,
Feb 6, 2010, 5:20:43 AM2/6/10
to scalacn
def f(`dd` : Int) = 5 match { case `dd` => "yup"; case _ => "nope"}
这样也是可以的,所以`dd`应该是一个特性

2010/2/6 Ford Guo <agil...@gmail.com>

Caoyuan

unread,
Feb 6, 2010, 5:28:37 AM2/6/10
to sca...@googlegroups.com
在pattern match时,如果pattern中的变量名是首字母大写(通常是一个Object),表示需要用相等来match,如果是首字母是小写,表示赋值给这个变量,但是,如果将这个变量名用反单引号括起来,则表示用相等来match。

比如:

var a = 2

var v = 1

v match {
case a => println(a) // 输出 1
}

v match {
case `a` => true // 匹配不成功, 因为 a != v
}

2010/2/6 Xuefeng Wu <ben...@gmail.com>:

Xuefeng Wu

unread,
Feb 6, 2010, 5:28:59 AM2/6/10
to scalacn
`dd` 把dd当作一个标识符(identifier)了
也就是说开发人员可以自己定义标识符

但这个特性怎么用呢?




2010/2/6 Xuefeng Wu <ben...@gmail.com>

Xuefeng Wu

unread,
Feb 6, 2010, 5:35:02 AM2/6/10
to scalacn
scala> val a = 2
a: Int = 2

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

这样就明白了


def f(`dd` : Int) = 5 match { case `dd` => "yup"; case _ => "nope"}
这里用`dd`和直接用dd效果是一样的。是不是用了Scala2.8的传名(by-name)特性啊?

2010/2/6 Caoyuan <dcao...@gmail.com>

linjie nie

unread,
Feb 6, 2010, 5:39:54 AM2/6/10
to sca...@googlegroups.com
第一个`yield`只是定义了一个变量(或者参数),因为yield是关键字,所以不能直接用,只能用``包起来。第二个`yield`是match的语法,就是用``包起来的就直接取变量的值相当于
2 match { case x if x==dd=>.....

Xuefeng Wu

unread,
Feb 6, 2010, 5:42:14 AM2/6/10
to scalacn
Thank you!

2010/2/6 linjie nie <niel...@gmail.com>



--
Scala中文社区:  http://groups.google.com/group/scalacn
Reply all
Reply to author
Forward
0 new messages