Поиск в документации Scala для #::
Я пытаюсь найти документацию для метода оператора Scala #::
, Я считаю, что это определено в Stream
класс из-за примера, который я нашел, который использует его.
Мой вопрос не относится к этому методу (хотя я хотел бы знать, где находятся документы), а как вообще искать документы Scala. Я пытался войти #::
в окне поиска в левом верхнем углу страницы документации (2.8.1), но ничего не нашел.
5 ответов
Я предлагаю использовать Справочный индекс - он разработан специально для поиска любого вида символа (класс, признаки, методы, значения, переменные) независимо от его иерархической позиции - в отличие от левого индекса Скаладока, который не показывает внутренние классы, признаки или объекты.
К сожалению, это доступно только в ночное время. Вы можете увидеть все это в ночном Скаладоке. Обратите внимание на верхнюю рамку в левой рамке над индексом.
Надеюсь, это будет в комплекте с Scala 2.9.0.
Редактировать Начиная с версии 2.9.0, индекс ссылки начал объединяться со Scaladoc. Не нужно идти к ночным документам сейчас.
Как уже упоминали другие, #::
определяется на scala.collection.immutable.Stream.ConsWrapper
, Я просто хотел уделить минуту, чтобы понять, почему это так.
В общем, для вызова оператора на объекте этот объект должен существовать. Тем не менее, идея с потоком является хвостом потока не оценивается, пока он не должен быть. Итак, рассмотрим следующий поток:
def fibs(a:Int,b:Int):Stream[Int] = a #:: fibs(b,a+b)
Обычно нам нужно оценить рекурсивный fibs
позвонить, чтобы мы могли позвонить #::
оператор на это. Это привело бы к безудержной рекурсии. Это НЕ то, что мы хотим. Мы хотим, чтобы получатель был по имени Stream
, Следовательно ConsWrapper
:
Конструктор для ConsWrapper
является class ConsWrapper[T](tail: => Stream[T])
принимая имя Stream
, и он создается путем неявного преобразования Stream.consWrapper[T](stream: => Stream[T])
, который также принимает имя Stream
,
Следовательно, мы выполнили неявное преобразование результата функции, которая еще не была вызвана, и мы имитировали эффект вызова #::
с именем this
ссылка.
Проблема здесь заключается в том, что поиск по скаладоку не позволяет вам искать внутренний класс / объект (то есть, чей родитель не является пакетом). Декларация #::
либо Stream.#::
или же Stream.ConsWrapper.#::
:
object Stream {
//STUFF
/** An extractor that allows to pattern match streams with `#::`.
*/
object #:: {
def unapply[A](xs: Stream[A]): Option[(A, Stream[A])] =
if (xs.isEmpty) None
else Some((xs.head, xs.tail))
}
class ConsWrapper[A](tl: => Stream[A]) {
def #::(hd: A): Stream[A] = new Stream.Cons(hd, tl)
def #:::(prefix: Stream[A]): Stream[A] = prefix append tl
}
//MORE STUFF
}
Вы можете запросить это как RFE для инструмента scaladoc в trac.
В плагине Scala IntelliJ IDEA вы могли бы использовать поиск символов (CTRL+ ALT+SHIFT+N) и набрать #::
и это вызвало бы обе декларации #::
немедленно.
Этот конкретный метод определен во вложенном классе внутри Stream
, называется scala.collection.immutable.Stream.ConsWrapper
,
И нет, я понятия не имею, как можно найти его. Я только случайно наткнулся на него. И хотя я знал, где его найти сейчас, когда я хотел опубликовать ссылку на класс здесь, в своем ответе, я все еще не мог найти ее с первой (и даже со второй и третьей) попытки.
Ну, нормально, если мы увидим
foo bar baz
затем bar - это метод, определенный для foo, поэтому сначала мы смотрим в определение класса / объекта foo, затем дерево наследования / признака вверх (+ в неявных преобразованиях в и из foo, в текущий файл и в (непосредственно) включенные файлы).
За исключением того, что "бар" оканчивается двоеточием, как здесь. Тогда это должно быть прочитано в обратном порядке -
foo bar: baz
не является
foo.bar: (baz)
, но
baz.bar: (foo)
Поэтому мы должны искать способ, описанный выше, но не для foo, а для baz.