julia - "Base"关键字在 Julia 中是什么意思?

标签 julia

我看到了this example在 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; 

最佳答案

Base是一个模块,它定义了 Julia 语言中使用的许多函数、类型和宏。您可以查看文件中包含的所有内容here或调用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只是一个名字。我们可以自由地将顶级范围内的名称重新绑定(bind)到我们喜欢的任何内容。例如 start = 0会将名称 'start' 重新绑定(bind)到整数 0(这样它就不再引用 Base.start )。

如果我们简单地写start(::Squares) = 1,现在专注于文档中的特定示例。 ,然后我们发现我们用 1 个方法创建了一个新函数:
Julia> start
start (generic function with 1 method)

但是 Julia 的迭代器接口(interface)(使用 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 来代替函数,迭代器接口(interface)可以使用Squares的方法类型和迭代将按照我们的预期工作(只要 Base.doneBase.next 也为这种类型扩展)。

关于julia - "Base"关键字在 Julia 中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42053946/

相关文章:

julia - 如何在特定模式下打开 Julia repl

file - 写入文件? Julia 语言

sorting - Julia 中的矩阵 - 排序和排序排列

visual-studio-code - 如何使用 Julia 作为解释器在 VS Code 中运行 Jupyter Notebooks?在添加的变量资源管理器/检查器中?

arrays - 在 Julia 中按多个键对 Dict 数组进行排序

arrays - Julia:函数参数 - 数组的类型规范

parsing - 是否有将位串转换为整数的 Julia 函数?

dataframe - 将 Symbol 参数传递给 @where 以使用 Julia 选择 DataFrame 的行

julia - Julia 中的类型化任务

jupyter-notebook - Julia Pro : import Jupiter notebook