你问的话题有点棘手.虽然我同意PilouPili的一般建议,但有时并不那么明显.
您的问题可以分解为两个问题:
ERROR:MethodError: objects of type Int64 are not callable
我猜这个非常清楚,如果你有其他编程语言的经验,应该可以预料到.情况是sqrt当前范围中的名称绑定到值9,而类型的对象Int64不可调用.
另一个错误
"Error: cannot assign variable Base.sqrt from module Main"
更复杂,可能不明显.sqrt在调用或引用sqrt函数之前,您可以在当前作用域中为自己的变量使用name .只有在这样的操作之后,才能sqrt在当前作用域中解析绑定(最近只有一些与解析绑定时相关的角落错误修复了https://github.com/JuliaLang/julia/issues/30234).从这一刻起,您不能更改值,sqrt因为Julia不允许为从其他模块导入的变量赋值.
Julia手册的相关段落是(https://docs.julialang.org/en/latest/manual/modules/):
该语句
using Lib意味着调用的模块Lib可用于根据需要解析名称.当遇到在当前模块中没有定义的全局变量时,系统将在导出的变量中搜索它,Lib如果在那里找到它,则导入它.这意味着当前模块中对全局的所有使用将解析为该变量的定义Lib.
和
通过
using或使变量可见后import,模块可能无法创建具有相同名称的变量.导入的变量是只读的; 分配给全局变量始终会影响当前模块拥有的变量,否则会引发错误.
为了更好地理解这些规则意味着什么,我认为最好用一个例子来说明它们:
julia> module A
export x, y
x = 10
y = 100
end
Main.A
julia> using .A
julia> x = 1000
1000
julia> y
100
julia> y = 1000
ERROR: cannot assign variable A.y from module Main
Run Code Online (Sandbox Code Playgroud)
另一方面,通过import显式调用而不是using立即解析绑定:
julia> module A
export x, y
x = 10
y = 100
end
Main.A
julia> import .A: x, y
julia> x = 1000
ERROR: cannot assign variable A.x from module Main
Run Code Online (Sandbox Code Playgroud)
你可以看到它不是特定的Base或功能,而是任何模块和任何变量.这实际上就是你在实践中可能会遇到这个问题的情况,因为很明显这sqrt是一个预定义的函数,但是你SOME_CONSTANT可能会调用或者可能不会被你调用的模块定义和导出,using而Julia代码的行为将会首次分配到SOME_CONSTANT全局范围和首次阅读时的情况有所不同SOME_CONSTANT.
最后,有一种特殊情况,当您想要将方法添加到另一个模块中定义的函数时 - 根据您在当前范围中引入名称的方式允许或不允许,您可以在此处阅读有关详细信息的详细信息.这个案例.