Прочитав эту ветку, я запутался в цепочке прототипов JavaScript, а затем нашел эти диаграммы
http://iwiki.readthedocs.org/en/latest/javascript/js_core.html# наследование
это четкая диаграмма, показывающая наследование JavaScript по цепочке прототипов
и
http : //www.javascriptbank.com/javascript/article/JavaScript_Classical_Inheritance/
, который содержит пример с кодом и несколько симпатичных диаграмм.
цепочка прототипов в конечном итоге возвращается к Object.prototype.
Цепочка прототипов может быть технически расширена так долго, как вы захотите, каждый раз, устанавливая прототип подкласса равным объекту родительского класса.
Надеюсь, вам также полезно понять цепь прототипов JavaScript.
Ответ Джея Конрада почти верен. Важно то, что где-то есть объект с именем ::
, который реализует метод 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.
Я считаю, что :: на самом деле является классом (который является подклассом List), поэтому утверждение x :: xs
в основном эквивалентно List (x, xs)
.
Вы можете сделать это с другими классами case, имеющими имена операторов. Например:
case class %%%(x: Int, y: Int)
a match {
case x %%% y => x + y
}