我正在学习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_:
似乎是最接近的,但由于某种原因,标识符不能以':'开头并且有字母数字
答案 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
方法名称仍以冒号结尾,因此您可以获得正在寻找的正确的关联性。