【问题标题】:Scala right associative methodsScala 右关联方法
【发布时间】: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_: 似乎是最接近的,但由于某种原因,标识符不能以 ':' 开头并且包含字母数字

【问题讨论】:

    标签: scala syntax operators identifier associative


    【解决方案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 仍然有点苦涩。我已经编辑以消除我对反引号方法有效的惊讶。
    猜你喜欢
    • 2010-11-12
    • 2015-05-09
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多