朱莉娅预定义函数

Har*_*kla 2 julia

我目前正在通过命令行会话编程Julia.

我知道Julia中的预定义函数(例如sqrt)可以采用变量值,但在特定会话中我尝试使用该函数sqrt(25),它给了我5.0但是在我编写的同一个会话中sqrt=9,然后它说

" 错误:无法从模块Main分配变量Base.sqrt "

如果我必须要做到这一点,我必须重新打开一个新的会话,并为sqrt分配一个变量值sqrt=9,当我这样做时再说它

错误:MethodError:Int64类型的对象不可调用

当我尝试使用sqrt作为函数时.

同样的事情发生在pi.

Bog*_*ski 6

你问的话题有点棘手.虽然我同意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.

最后,有一种特殊情况,当您想要将方法添加到另一个模块中定义的函数时 - 根据您在当前范围中引入名称的方式允许或不允许,您可以在此处阅读有关详细信息的详细信息.这个案例.