Разложение соответствия Scala на инфиксном операторе

Прочитав эту ветку, я запутался в цепочке прототипов JavaScript, а затем нашел эти диаграммы

http://iwiki.readthedocs.org/en/latest/javascript/js_core.html# наследование *[[protytype]]* and <code>prototype</code> property of function objects

это четкая диаграмма, показывающая наследование JavaScript по цепочке прототипов

и

http : //www.javascriptbank.com/javascript/article/JavaScript_Classical_Inheritance/

, который содержит пример с кодом и несколько симпатичных диаграмм.

цепочка прототипов в конечном итоге возвращается к Object.prototype.

Цепочка прототипов может быть технически расширена так долго, как вы захотите, каждый раз, устанавливая прототип подкласса равным объекту родительского класса.

Надеюсь, вам также полезно понять цепь прототипов JavaScript.

9
задан Jon Seigel 7 April 2010 в 02:04
поделиться

2 ответа

Ответ Джея Конрада почти верен. Важно то, что где-то есть объект с именем :: , который реализует метод 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, который расширяет признак Список . Однако, как показано в приведенном выше примере, не имеет как класс case.

13
ответ дан 4 December 2019 в 09:37
поделиться

Я считаю, что :: на самом деле является классом (который является подклассом List), поэтому утверждение x :: xs в основном эквивалентно List (x, xs) .

Вы можете сделать это с другими классами case, имеющими имена операторов. Например:

case class %%%(x: Int, y: Int)

a match {
  case x %%% y => x + y
}
7
ответ дан 4 December 2019 в 09:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: