在Julia中,“Base”关键字是什么意思?

3

我在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; 

1
“Base” 可以被看作是 Julia 的标准库。 - David P. Sanders
2个回答

8
Base是一个模块,定义了Julia语言中许多函数、类型和宏。您可以在此处查看包含的所有内容的文件,或调用whos(Base)以打印列表。
事实上,这些函数和类型(包括sumInt等)对于语言来说是如此基础,以至于它们默认包含在Julia的顶级作用域中。
这意味着我们可以每次使用该特定函数时仅使用sum而不是Base.sum。两个名称都指向同一件事情:
Julia> sum === Base.sum
true

Julia> @which sum # show where the name is defined
Base

因此,你可能会问,为什么需要编写像Base.start而不是简单的start这样的内容呢?
关键在于start只是一个名称。我们可以自由地将顶层范围内的名称重新绑定到任何我们喜欢的东西。例如,start = 0将重新绑定名称“start”到整数0(因此它不再引用Base.start)。
现在集中精力介绍文档中的具体示例,如果我们仅仅写start(::Squares) = 1,那么我们发现已经创建了一个具有1个方法的新函数
Julia> start
start (generic function with 1 method)

然而,Julia的迭代器接口(使用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.doneBase.next 也为该类型进行扩展)。

谢谢您的详细解释。还有一个问题 - Base.start(::Squares) 是什么意思? - Abhishek Kishore
没问题!这是用于Squares类型与Base.start函数配合使用的方法签名。Julia会根据类型来调度方法,所以这就是在Squares(7)迭代时它将执行的代码。 - Alex Riley

6
我承认对于如此基础的内容,解释有点深埋在文档中,但是http://docs.julialang.org/en/release-0.4/manual/modules/#standard-modules描述了以下内容:

有三个重要的标准模块:Main、Core和Base。

Base 是标准库(即 base/ 目录下的内容)。所有模块都隐式地包含 using Base,因为在绝大多数情况下这是必需的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接