Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Julia中的任何函数重置为其原始状态?_Julia - Fatal编程技术网

如何将Julia中的任何函数重置为其原始状态?

如何将Julia中的任何函数重置为其原始状态?,julia,Julia,我在学习朱莉娅,有件事我想不通 案例1:我启动了Julia控制台,并用数字10覆盖了默认的sqrt函数。所以现在这个函数不起作用了。对于来自R的我来说,这有点令人惊讶,在R中,通常即使我们重写了一个函数,它也会因为方法分派而工作。很明显,茱莉亚做这件事的方式不同,这没关系。但现在我无法恢复到它的自然状态。我必须重新启动Julia才能让它重新工作 julia> sqrt = 10 10 julia> sqrt(5) ERROR: MethodError: objects of typ

我在学习朱莉娅,有件事我想不通

案例1:我启动了Julia控制台,并用数字10覆盖了默认的sqrt函数。所以现在这个函数不起作用了。对于来自R的我来说,这有点令人惊讶,在R中,通常即使我们重写了一个函数,它也会因为方法分派而工作。很明显,茱莉亚做这件事的方式不同,这没关系。但现在我无法恢复到它的自然状态。我必须重新启动Julia才能让它重新工作

julia> sqrt = 10
10

julia> sqrt(5)
ERROR: MethodError: objects of type Int64 are not callable
Stacktrace:
 [1] top-level scope at REPL[2]:1

julia> sqrt = Nothing
Nothing

julia> sqrt(5)
ERROR: MethodError: no method matching Nothing(::Int64)
Closest candidates are:
  Nothing() at boot.jl:324
Stacktrace:
 [1] top-level scope at REPL[4]:1
案例2:我启动了Julia控制台,并使用sqrt函数来计算东西,它成功了。但是现在如果我试图重置为一个常数,它就不起作用了。我假设它是因为它已编译,因此无法重写

julia> sqrt(7)
2.6457513110645907

julia> sqrt = 10
ERROR: cannot assign a value to variable Base.sqrt from module Main
Stacktrace:
 [1] top-level scope at REPL[2]:1
我的问题是:

有没有办法在不重新启动的情况下将函数重置为原始状态? 我对案例2的假设是否正确


我不确定它是否已经在某个地方得到了答复。我试着找到它,但是找不到。我还在读这件事。但如果有人知道这一点,请寻求帮助。提前感谢。

AFAIU,此行为的基本原理如下:

当您在程序中运行sqrt5时,这意味着您了解sqrt函数。如果稍后尝试为sqrt分配新值,Julia会禁止您这样做,因为程序中的sqrt实际上引用了Base.sqrt函数,它是一个常量。请注意,您正在使用的包导出的任何函数也是如此;这里没有与Base相关的特殊性,只是您不必显式地使用Base来调用它定义的函数

如果不首先将sqrt用作函数,Julia就不能假定您了解Base.sqrt。因此,如果在您的程序中第一次提到sqrt是赋值,它将很高兴地创建一个同名的新变量。这使得Julia更能证明未来:假设您编写了一个声明并使用名为foo的变量的程序。截至Julia 1.5.3,不存在Base.foo函数。但是现在假设Julia 1.6引入了Base.foo函数。我们不希望这样的更改破坏您现有的代码,这些代码应该继续使用较新的版本。因此,在本例中,安全的选择是允许您自由声明变量foo,而不必担心与Base.foo的名称冲突

现在,如果您在交互式会话中意外创建了与现有函数冲突的全局变量,那么一个简单的解决方案就是从基函数或原始函数来自的任何模块将变量重新分配给函数:

julia> sqrt = 1
1

# Oops, looks like I made a mistake
julia> sqrt(2)
ERROR: MethodError: objects of type Int64 are not callable
Stacktrace:
 [1] top-level scope at REPL[2]:1

# Let's try and fix it
julia> sqrt = Base.sqrt
sqrt (generic function with 20 methods)

julia> sqrt(2)
1.4142135623730951

AFAIU,这种行为的基本原理如下:

当您在程序中运行sqrt5时,这意味着您了解sqrt函数。如果稍后尝试为sqrt分配新值,Julia会禁止您这样做,因为程序中的sqrt实际上引用了Base.sqrt函数,它是一个常量。请注意,您正在使用的包导出的任何函数也是如此;这里没有与Base相关的特殊性,只是您不必显式地使用Base来调用它定义的函数

如果不首先将sqrt用作函数,Julia就不能假定您了解Base.sqrt。因此,如果在您的程序中第一次提到sqrt是赋值,它将很高兴地创建一个同名的新变量。这使得Julia更能证明未来:假设您编写了一个声明并使用名为foo的变量的程序。截至Julia 1.5.3,不存在Base.foo函数。但是现在假设Julia 1.6引入了Base.foo函数。我们不希望这样的更改破坏您现有的代码,这些代码应该继续使用较新的版本。因此,在本例中,安全的选择是允许您自由声明变量foo,而不必担心与Base.foo的名称冲突

现在,如果您在交互式会话中意外创建了与现有函数冲突的全局变量,那么一个简单的解决方案就是从基函数或原始函数来自的任何模块将变量重新分配给函数:

julia> sqrt = 1
1

# Oops, looks like I made a mistake
julia> sqrt(2)
ERROR: MethodError: objects of type Int64 are not callable
Stacktrace:
 [1] top-level scope at REPL[2]:1

# Let's try and fix it
julia> sqrt = Base.sqrt
sqrt (generic function with 20 methods)

julia> sqrt(2)
1.4142135623730951

您使用的是哪个版本?我的Julia告诉我错误:无法从模块Main为变量Base.sqrt赋值。对于图像,我很抱歉。我会在某个时候把它修好。我使用的是Julia 1.5,您使用的是哪个版本?我的Julia告诉我错误:无法从模块Main为变量Base.sqrt赋值。对于图像,我很抱歉。我会在某个时候把它修好。我正在使用Julia 1.5非常感谢您的解释,也非常感谢您的编辑。非常感谢您的解释,也非常感谢您的编辑。