我正在尝试理解一段相对简单的代码,但我并不能完全理解正在发生什么(我是一个Julia新手,来自Python / Matlab背景)。
function myfunc(number::Integer)
double() = 2*number
square() = number^2
return _ -> (number, double, square)
end
我理解myfunc
会返回一个匿名函数,该函数不关心传递给它的值。因此,以下情况对我来说是有意义的:
julia> n4 = myfunc(4)
#9 (generic function with 1 method)
julia> n4(50)
(4, var"#double#10"{Int64}(4), var"#square#11"{Int64}(4))
在第一行中,
n4
指的是匿名函数本身,而在第二行中,使用参数 50
调用了该匿名函数并完成了它应该完成的任务:丢弃 50 并返回包含定义数据的元组。 我不理解的是我如何能够执行以下操作:julia> n4.square
(::var"#square#11"{Int64}) (generic function with 1 method)
julia> n4.square()
16
n4
代表一个匿名函数,但它拥有n4.number
、n4.double
和n4.square
等子对象,对此感到惊讶。为什么n4
的行为表现得像一个结构体呢?执行n4(*)[2]()
以获得8作为答案是有意义的,但当fieldnames(n4)
失败时,我不理解在背后发生了什么使n4.double()
能够工作。我能够使用n4
之后的.
来获取函数/数据,这种机制是如何运作的?
Meta.@lower 函数 myfunc()...
。如果你习惯于阅读降低后的代码,那么这将告诉你关于细节方面的几乎一切内容。 - phipsgabler