Julia中“#数字”是如何表示函数的?

这是我正在研究的一段代码,testfunc(nm)这行的作用不是很懂
我将其内容print出来后,如图所示


显然,此处的井号加数字代表一个函数
新手对julia不是很熟悉,
请问这是指针(指向函数)的表示吗?

for (datafile, taskvec) in tasks
    @info "  Loading $datafile ..."
    method = models[datafile]

    println("\n\n method  ",method)
    println("\n\n interface   ",HopTB.Interface)
    println("\n\n interface_field:   ",getfield(HopTB.Interface, Symbol(:createmodel, method)))
    nm = getfield(HopTB.Interface, Symbol(:createmodel, method))("test/data/" * datafile)# 
    
    # println(nm)
    for (sourcefilename, testfunc) in taskvec
        @info "    Running test in $sourcefilename ..."
        println("testfunc & nm ", testfunc ," &&&& ", nm)
        testfunc(nm)
    end
    GC.gc()
end
1 个赞

这里的 testfunc 是一个 匿名函数,因为没有名字,所以在打印的时候,用的是 #数字 这种模式。
比如你可以在 REPL 里随便创建一个类似的函数:

julia> () -> nothing
#1 (generic function with 1 method)

julia> "testfunc $ans"
"testfunc #1"

姑且可以这么理解(?)

2 个赞

明白了,这解决了我的问题
谢谢!

老哥是在研究HopTB.jl嘛。。有什么心得吗 :kissing_heart:

严格来说,这个符号是这个匿名函数类型的一部分。
类型和函数名在当前上下文(world)中都保持唯一。
这也是为什么函数的编号每次增长2.(注意这是实现细节,之后不做保证)

我感觉更像个顺序号,和指针还是有点区别的。

julia> () -> 1
#23 (generic function with 1 method)

julia> () -> 1
#25 (generic function with 1 method)

julia> typeof( () -> 1 )
var"#27#28"

julia> typeof( () -> 1 )
var"#29#30"

julia> fn = () -> 1
#31 (generic function with 1 method)

julia> typeof(fn)
var"#31#32"

julia> typeof(fn).name.mt.name
Symbol("#31")

为什么不显示原始的匿名函数定义,是因为目前尚未实现从 AST 中提取出源代码的函数。
参考:

1 个赞