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 项目 - 最佳实践建议

notepad++ 关联右键

使用 Scala 解析器的运算符关联性

pyspark vs scala中的FPgrowth计算关联

kmplayer卸载后怎么去掉右键菜单的关联

数据库之左关联右关联等值关联