let块中的julia全局变量定义
我有下面的julia函数let块中的julia全局变量定义,julia,let,Julia,Let,我有下面的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] d
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
然而,用
#表示的f的第二个定义可以很好地使用注释。我无法得到它们之间的确切区别,为什么会发生这种情况?正如@AlexanderMorley所指出的,你需要仔细看看
或者观看詹姆逊的Youtube视频:
在Julia中,泛型函数的处理方式与匿名函数有所不同。在通用函数的情况下,所发生的事情是这样的,程序编译时知道全局函数表中的f
是什么,您修改了f
,但是调用函数已经编译为调用不再正确的函数,因此它会出错。错误在于停止。不过匿名函数是不同的。在匿名函数的情况下,调用函数被设置为调用该变量指向的任何函数。在这种情况下,它也知道它是一个全局变量,因此它是安全的,并且不内联它或类似的东西,因此它是成功的。看看上面的julia文档。另外,我希望您将根据a)运行上述定义的顺序得到不同的结果(确保在新的julia会话中开始)。您是否使用julia v0.6?我不希望它能让你重新定义f
句号…@Alexander Morley我使用的是julia v0.6.2。当问这个问题时,我的意思是我在新的julia会话中只使用了上面的一个let块。