了解Scala表示法语法

时间:2016-10-26 18:55:34

标签: scala

我有以下代码:

abstract class AList {
  def head:Int
  def tail:AList
  def isEmpty:Boolean
  def ::(n: Int): AList = SimpleList(n, Empty)
}

object Empty extends AList {

  def head = throw new Exception("Undefined")

  def tail = throw new Exception("Undefined")

  def isEmpty = true

}

case class SimpleList(head: Int, tail: AList = Empty) extends AList {

  def isEmpty = false

}

1 :: 2 :: Empty

我想知道最后一行是如何运作的。没有从Int到SimpleList的隐式转换。因此我不理解方法调用机制。

  

的object.method(精氨酸)

我在这里看不到那种模式。我认为澄清scala表示法(中缀,后缀,后缀等)会有所帮助。我想要理解语法糖。

由于

2 个答案:

答案 0 :(得分:8)

在Scala中,方法名以冒号结尾..

  • 形成右关联表达式
  • 是右操作数上的附加调用。

所以1 :: 2 :: Empty实际上是Empty.::(2).::(1)

答案 1 :(得分:5)

::是右操作数的方法。在scala中,如果方法名称以冒号结尾,则在右操作数上调用该方法。 因此1 :: 2 :: Empty实际上是Empty.::(2),它返回SimpleList

一旦您了解1 :: <the-new-simple-list>是右操作数的方法,后续的::就很容易理解。