我看到了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)
打印列表。
事实上,这些函数和类型(包括 sum
和 Int
之类的东西)对于语言来说是如此基础,以至于它们默认包含在 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.done
和 Base.next
也为这种类型扩展)。
关于julia - "Base"关键字在 Julia 中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42053946/