Scala 右关联方法
Posted
技术标签:
【中文标题】Scala 右关联方法【英文标题】:Scala right associative methods 【发布时间】:2013-08-02 07:48:48 【问题描述】:我正在学习 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_:
似乎是最接近的,但由于某种原因,标识符不能以 ':' 开头并且包含字母数字
【问题讨论】:
【参考方案1】:来自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
方法名称仍以冒号结尾,因此您可以获得所需的正确关联性。
【讨论】:
太棒了!我不知道使用反引号来允许任意标识符。谢谢 最后一个字符不是反引号,而是冒号。带引号的标识符中的引号字符不再成为标识符的一部分,就像字符串文字中的引号字符一样。由字符串文字"Hello"
表示的字符串的最后一个字符不是"
,而是o
。
@JörgWMittag:哇,这对我来说是一个令人难以置信的误读——“排除”就在那里。在我的辩护中,现在还早,我对this 仍然有点苦涩。我已经编辑以消除我对反引号方法有效的惊讶。以上是关于Scala 右关联方法的主要内容,如果未能解决你的问题,请参考以下文章
组织多个 scala 相互关联的 sbt 和 git 项目 - 最佳实践建议