2013-08-01 33 views
4

我正在学习斯卡拉,并与右联想不适用对象玩。我知道如果名字以':'结尾,那么它就成为正确的联想。然而,似乎有一些奇怪的限制,例如命名为斯卡拉右联想方法

例如, 这些都是无效

object cons: { def unapply(value: String): Option[(Char, List[Char])] = ??? } 
object :_cons_: { def unapply(value: String): Option[(Char, List[Char])] = ??? } 

这些都是有效的

object cons_: { def unapply(value: String): Option[(Char, List[Char])] = ??? } 
object >>: { def unapply(value: String): Option[(Char, List[Char])] = ??? } 

所以人们似乎约在标识符混合字母数字字符和符号的一些怪事。所以基本上,我想要一个描述性的名字,即'cons',并且仍然有正确的结合性。此外,我希望我的操作员为美学原因是对称的:-),所以我不太喜欢cons_:
有没有办法使某些东西在不使用冒号的情况下进行关联?或者其他任何建议来实现这一目标?

:_cons_:似乎是最接近的,但是,出于某种原因的标识不能用“:”开始,并有字母数字

回答

3

the spec(1.1节):

有三种方式以形成标识符。首先,标识符 以字母开头,后面可以跟随任意字母和数字的序列。这后面可以加下划线'_'字符 和另一个由字母和数字组成的字符串或 运算符字符。其次,标识符可以从操作符 字符开始,后面跟随任意的操作符字符序列。 上述两种形式被称为明文标识符。最后, 标识符也可以通过反向引号之间的任意字符串形成(主机系统可能对字符串对于标识符合法的字符串施加一些限制)。然后标识符由 组成,除了反引号本身之外的所有字符。

所以看起来你运气不好 - 如果你的标识符以:开头,它不能包含非运算符字符。但是请注意,你可以以下(这是不打算做任何有意义,只是为了演示的语法):

scala> class X { def `:cons:`(i: Int) = i } 
defined class X 

scala> val x = new X 
x: X = [email protected] 

scala> 1 `:cons:` x 
res1: Int = 1 

方法名仍然以冒号结尾,让您得到你正在寻找的正确的相关性。

+0

太棒了!我不知道如何使用back tick来允许任意标识符。谢谢 – ekj

+0

最后一个字符不是反引号,它是冒号。带引号的标识符中的引号字符不再成为标识符的一部分,而不是字符串字面值中的引号字符。字符串“”Hello“'表示的字符串的最后一个字符不是''',它是'o'。 –

+0

@JörgWMittag:哇,这是我的一些令人难以置信的误读 - ”排除“就在那里。在我的辩护中,它早在这里,对于[this](http://stackoverflow.com/q/17863794/334519)我仍然有点bit I。我编辑了这个令我意外的反拨法。 –