4

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

例如,这些是无效的

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

4

1 回答 1

3

规范(第 1.1 节):

有三种方法可以形成标识符。首先,标识符可以以字母开头,后面可以跟任意的字母和数字序列。后面可以跟下划线“_”字符和另一个由字母和数字或运算符字符组成的字符串。其次,标识符可以以运算符字符开头,后跟任意序列的运算符字符。前两种形式称为普通标识符。最后,标识符也可以由反引号之间的任意字符串形成(主机系统可能会对标识符合法的字符串施加一些限制)。然后,标识符由除反引号本身之外的所有字符组成。

所以看起来你很不走运——如果你的标识符以 a 开头,:它不能包含非运算符字符。但是请注意,您可以编写以下代码(这并不是为了做任何有意义的事情——只是为了演示语法):

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

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

于 2013-08-01T11:59:31.647 回答