代码之家  ›  专栏  ›  技术社区  ›  thatismatt

中缀运算符上的scala匹配分解

  •  9
  • thatismatt  · 技术社区  · 16 年前

    我试图理解 List 在斯卡拉。特别是,我想了解一下如何使用中缀运算符编写匹配表达式,例如:

    a match {
      case Nil => "An empty list"
      case x :: Nil => "A list without a tail"
      case x :: xs => "A list with a tail"
    }
    

    match表达式如何被允许 x :: xs 而不是 List(x, xs) ?

    3 回复  |  直到 7 年前
        1
  •  13
  •   Guillaume Massé    7 年前

    杰伊·康拉德的回答几乎是对的。重要的是 在某处 有一个名为 :: 它实现了 unapply 方法,返回类型 Option[(A, List[A])] . 因此:

    object :: {
      def unapply[A](ls: List[A]): Option[(A, A)] = {
        if (ls.empty) None
        else Some((ls.head, ls.tail))
      }
    }
    
    // case objects get unapply for free
    case object Nil extends List[Nothing]
    

    在情况下 :: List ,这个物体恰好来自这样一个事实 :: 是一个case类,它扩展了 特质。但是,正如上面的示例所示,它没有 成为一个案例类。

        2
  •  7
  •   Verbeia pjb3    14 年前

    我相信 :: is actually a class (这是列表的一个子类),所以说 x :: xs 主要相当于 List(x, xs) .

    您可以对其他具有运算符名称的case类执行此操作。例如:

    case class %%%(x: Int, y: Int)
    
    a match {
      case x %%% y => x + y
    }
    
        3
  •  2
  •   Community Mohan Dere    9 年前

    如何允许匹配表达式是x::xs而不是list(x,xs)?

    要回答此问题:

    当被视为 模式 一个中缀 操作,如 P OP Q 等效 到 运算(p,q) . 也就是说,中缀 运算符op被视为 构造器模式 .

    (斯卡拉编程,第1版,第331页)

    也见 scala case classes questions

    推荐文章