朱莉娅函数返回匿名函数

时间:2020-05-26 08:27:03

标签: julia

我试图理解一段相对简单的代码,但是我无法完全推断出发生了什么(我是来自Python / Matlab背景的Julia新手)。

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是指 anonymous 函数本身,而第二行中的匿名函数是使用参数50来调用的,它应该执行以下操作:丢弃50,并返回包含定义数据的元组。

我不知道我该怎么做:

julia> n4.square
(::var"#square#11"{Int64}) (generic function with 1 method)

julia> n4.square()
16

引用匿名函数的n4具有 child 对象n4.numbern4.doublen4.square这一事实令我感到惊讶。 n4的行为好像是一个结构吗?进行n4(*)[2]()来获得8的答案很有意义,但是当fieldnames(n4)失败时,在幕后发生了一些我不知道如何使n4.double()工作的事情。在.之后使用n4来获取功能/数据的机制是什么?什么机制?

1 个答案:

答案 0 :(得分:7)

在Julia中,所有泛型函数(即,所有常规的Julia定义函数)都是结构。可以在Julia中将任何结构设为可调用的,因此默认情况下,正常函数只是可调用的零域结构(单例)。换句话说,做

foo(x) = x+1

类似于

struct Foo end
const foo = Foo()
(::Foo)(x) = x + 1

这对于正常功能非常有用,但是对于匿名功能,这可能会导致创建大量新类型。例如,您可以这样做: functions = [x -> x+i for i in 1:1000]

Julia在这里创建了一个包含i作为字段和1000个实例的单一类型,而不是创建1000个新类型,每个类型的新值均为i

在您的情况下,它不会myfunc为每次调用返回一个新类型并返回该类型的单例实例,而是返回一个具有字段number,{{1} }和double

此外,您可以完全调用字段名称,只需要以square类型调用它即可。

这只是一种优化,对于您的代码依赖于内存中函数表示方式的内部而言,这有点奇怪。您可能不应该这样做。

相关问题