2017-02-05 3 views
3

Я видел this example в документации на Юлию. Он использует что-то под названием Base. Что это такое Base?Что означает ключевое слово Base в Юлии?

immutable Squares  
    count::Int  
end 

Base.start(::Squares) = 1 
Base.next(S::Squares, state) = (state*state, state+1) 
Base.done(S::Squares, s) = s > S.count; 
Base.eltype(::Type{Squares}) = Int # Note that this is defined for the type 
Base.length(S::Squares) = S.count; 
+1

'Base' можно рассматривать как стандартную библиотеку Julia. –

ответ

8

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 также распространяются на этот тип).

+0

Спасибо за отличную экспланацию. Еще один вопрос: что означает Base.start (:: Squares)? –

+0

Нет проблем! Это подпись для метода для функции Base.start, которая будет использоваться с типом Squares. Джулия отправляет методы на основе типов, поэтому это код, который он будет выполнять для итерации по квадратам (7) и т. Д. –

6

Я допускаю, что для чего-то настолько фундаментальной, объяснение похоронен немного далеко вниз в документации, но http://docs.julialang.org/en/release-0.4/manual/modules/#standard-modules описывает это:

Есть три важных стандартных модулей: Основные, Core , и Base.

База - это стандартная библиотека (содержимое базы /). Все модули неявно содержат использование Base, так как это необходимо в огромных случаях.