Scala右结合方法

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_:
有没有办法使某些东西与右侧相关而不使用冒号?或者有其他建议来实现这一点吗? :_cons_:似乎最接近,但由于某种原因,标识符不能以':'开头并包含字母数字。
1个回答

3

来自规范(第1.1节):

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

所以看起来你运气不佳——如果你的标识符以:开头,则不能包含非运算符字符。但请注意,您可以编写以下内容(这不打算执行任何有意义的操作,只是演示语法):

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

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

太好了!我不知道可以使用反引号来允许任意标识符。谢谢。 - ekj
最后一个字符不是反引号,而是冒号。在引用标识符中的引号字符不会成为标识符的一部分,就像字符串文字中的引号字符一样。由字符串文字“Hello”表示的字符串的最后一个字符不是“”,而是“o”。 - Jörg W Mittag
@JörgWMittag:哇,我真是太粗心了——“排除”就在那里。为自己辩护,当时还很早,而且我对这个仍然有点不满。我已经编辑过了,删除了我对反引号方法有效的惊讶。 - Travis Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接