Scala右联想方法

时间:2013-08-01 11:47:31

标签: scala syntax operators identifier associative

我正在学习Scala,并使用正确的关联unapply对象。我知道,如果名称以':'结尾,那么它就变成了正确的关联。但是,命名似乎有一些奇怪的限制

e.g。 这些是无效的

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_:似乎是最接近的,但由于某种原因,标识符不能以':'开头并且有字母数字

1 个答案:

答案 0 :(得分:3)

来自the spec(第1.1节):

  

有三种方法可以形成标识符。首先,标识符可以   以一个字母开头,后面跟着一个任意序列   字母和数字。这可能后跟下划线'_'字符   和另一个由字母和数字组成的字符串   操作员角色。其次,标识符可以从操作员开始   字符后跟任意一系列操作符。   前两个表单称为 plain 标识符。最后,一个   标识符也可以由任意字符串组成   反引号(主机系统可能会对其施加一些限制   字符串对于标识符是合法的)。然后标识符由   除反引号之外的所有字符。

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

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

scala> val x = new X
x: X = X@6a665da6

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

方法名称仍以​​冒号结尾,因此您可以获得正在寻找的正确的关联性。