我在Julia语言文档中看到了这个例子.它使用了一些东西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;
Run Code Online (Sandbox Code Playgroud)
Base是一个模块,它定义了Julia语言中使用的许多函数,类型和宏.您可以在此处查看其中包含的所有内容的文件,也可以调用whos(Base)打印列表.
事实上,这些功能和类型(其中包括像sum和Int)是如此重要,他们都默认包含在朱莉娅的顶级范围的语言.
这意味着我们可以使用sum而不是Base.sum每次我们想要使用该特定功能.这两个名字都指的是同一件事:
Julia> sum === Base.sum
true
Julia> @which sum # show where the name is defined
Base
Run Code Online (Sandbox Code Playgroud)
那么,你可能会问,为什么有必要写一些Base.start不是简单的东西start?
关键是这start只是一个名字.我们可以自由地将顶级范围内的名称重新绑定到我们喜欢的任何名称.例如,start = 0将名称'start'重新绑定为整数0(以便它不再引用Base.start).
现在集中讨论文档中的具体示例,如果我们只是简单地编写start(::Squares) = 1,那么我们发现我们已经使用1个方法创建了一个新函数:
Julia> start
start (generic function with 1 method)
Run Code Online (Sandbox Code Playgroud)
但是Julia的迭代器接口(使用for循环调用)要求我们添加新方法Base.start!我们还没有这样做,所以如果我们尝试迭代,我们会收到错误:
julia> for i in Squares(7)
println(i)
end
ERROR: MethodError: no method matching start(::Squares)
Run Code Online (Sandbox Code Playgroud)
通过Base.start写入来更新函数Base.start(::Squares) = 1,迭代器接口可以使用Squares类型的方法,并且迭代将按照我们的预期工作(只要Base.done并且Base.next也针对此类型进行扩展).
小智 6
我会批准那些非常重要的东西,解释在文档中埋没了一点点,但是http://docs.julialang.org/en/release-0.4/manual/modules/#standard-modules描述了这个:
有三个重要的标准模块:Main,Core和Base.
Base是标准库(base /的内容).所有模块都隐含地包含使用Base,因为在绝大多数情况下都需要这样做.