Base
- это модуль, который определяет многие функции, типы и макросы, используемые на языке Юлии. Вы можете просмотреть файлы для всего, что содержит here, или позвонить whos(Base)
, чтобы распечатать список.
Фактически, эти функции и типы (включая такие вещи, как sum
и Int
) являются настолько фундаментальными для языка, что они включены в область верхнего уровня Юлии по умолчанию.
Это означает, что мы можем использовать sum
вместо Base.sum
каждый раз, когда хотим использовать эту функцию. Оба названия относятся к одной и той же вещи:
Julia> sum === Base.sum
true
Julia> @which sum # show where the name is defined
Base
Так почему же, вы можете спросить, нужно ли это писать такие вещи, как Base.start
вместо того, чтобы просто start
?
Дело в том, что start
- это просто имя. Мы можем переписывать имена в области верхнего уровня на все, что нам нравится. Например, start = 0
будет переписывать имя «начало» в целое число 0 (так что оно больше не относится к Base.start
).
Сосредоточение теперь на конкретном примере в документации, если мы просто писали start(::Squares) = 1
, то мы обнаружим, что мы создали новую функцию с 1 методом:
Julia> start
start (generic function with 1 method)
Но итератор Джулии (вызывается с помощью for
) требует от нас добавления нового метода до Base.start
! Мы еще не сделали этого, и таким образом мы получаем ошибку, если мы попытаемся итерация:
julia> for i in Squares(7)
println(i)
end
ERROR: MethodError: no method matching start(::Squares)
Обновляя функцию Base.start
вместо записи Base.start(::Squares) = 1
, интерфейс итератора можно использовать метод для Squares
типа и итерации будут работать как мы ожидаем (до тех пор, пока Base.done
и Base.next
также распространяются на этот тип).
'Base' можно рассматривать как стандартную библиотеку Julia. –