let 块中的 julia 全局变量定义
julia global variable definition in let block
我有以下 julia 函数
function fakeseq()
let; global f(x)=unshift!(push!(x, 35) , 1);end; # not working
#let; global f; f=x->unshift!(push!(x, 35) , 1);end; # works fine
s1 = [rand(1:34) for i in 1:12];
s2 = [rand(1:34) for i in 1:7]
data = map(x->f(x), [s1, s2])
end
当我 运行 该代码时,出现以下错误:
julia> fakeseq()
ERROR: MethodError: no method matching f(::Array{Int64,1})
The applicable method may be too new: running in world age 21823, while current world is 21824.
Closest candidates are: f(::Any) at REPL[1]:2 (method too new to be called from this world context.)
Stacktrace:
[1] _collect(::Array{Array{Int64,1},1},
::Base.Generator{Array{Array{Int64,1},1},##3#6}, ::Base.EltypeUnknown,
::Base.HasShape) at ./array.jl:488
[2] fakeseq() at ./REPL[1]:6
然而,用 # works fine
注释表示的 f 的第二个定义有效。我无法得到它们之间的确切区别,为什么会这样?
正如@AlexanderMorley 所指出的,您需要通读
https://docs.julialang.org/en/latest/manual/methods.html#Redefining-Methods-1
或观看 Jameson 的 Youtube 视频:
https://www.youtube.com/watch?v=7KGZ_9D_DbI
泛型函数在 Julia 中的处理方式与匿名函数有所不同。在通用函数的情况下,发生的事情是这样的,程序编译知道全局函数 table 中的 f
是什么,您修改 f
,但是调用函数已经编译为调用不再是正确的函数,因此会出错。错误是停止Issue #265。匿名函数是不同的。在匿名函数的情况下,调用函数被设置为调用该变量指向的任何函数。在那种情况下,它知道它也是一个全局变量,所以它是安全的并且不会内联它或类似的东西,所以它是成功的。
我有以下 julia 函数
function fakeseq()
let; global f(x)=unshift!(push!(x, 35) , 1);end; # not working
#let; global f; f=x->unshift!(push!(x, 35) , 1);end; # works fine
s1 = [rand(1:34) for i in 1:12];
s2 = [rand(1:34) for i in 1:7]
data = map(x->f(x), [s1, s2])
end
当我 运行 该代码时,出现以下错误:
julia> fakeseq()
ERROR: MethodError: no method matching f(::Array{Int64,1})
The applicable method may be too new: running in world age 21823, while current world is 21824.
Closest candidates are: f(::Any) at REPL[1]:2 (method too new to be called from this world context.)
Stacktrace:
[1] _collect(::Array{Array{Int64,1},1},
::Base.Generator{Array{Array{Int64,1},1},##3#6}, ::Base.EltypeUnknown,
::Base.HasShape) at ./array.jl:488
[2] fakeseq() at ./REPL[1]:6
然而,用 # works fine
注释表示的 f 的第二个定义有效。我无法得到它们之间的确切区别,为什么会这样?
正如@AlexanderMorley 所指出的,您需要通读
https://docs.julialang.org/en/latest/manual/methods.html#Redefining-Methods-1
或观看 Jameson 的 Youtube 视频:
https://www.youtube.com/watch?v=7KGZ_9D_DbI
泛型函数在 Julia 中的处理方式与匿名函数有所不同。在通用函数的情况下,发生的事情是这样的,程序编译知道全局函数 table 中的 f
是什么,您修改 f
,但是调用函数已经编译为调用不再是正确的函数,因此会出错。错误是停止Issue #265。匿名函数是不同的。在匿名函数的情况下,调用函数被设置为调用该变量指向的任何函数。在那种情况下,它知道它也是一个全局变量,所以它是安全的并且不会内联它或类似的东西,所以它是成功的。