我该如何声明一个 Julia 函数,使其返回具有特定签名的函数?例如,我想要返回一个接受 Int 类型参数并返回 Int 类型值的函数:
function buildfunc()::?????
mult(x::Int) = x * 2
return mult
end
这个问号应该用什么替换?
Function
类型来实现这一目的。引自Julia文档:
Function
是所有函数的抽象类型。
function b(c::Int64)::Int64
return c+2;
end
function a()::Function
return b;
end
这将打印:
julia> println(a()(2));
4
Julia会对Float64输入抛出异常。
julia> println(a()(2.0));
错误: MethodError: 没有与 b(::Float64) 匹配的方法
最接近的候选方法是: b(::Int64)
需要明确一点。在返回的参数上添加类型声明只是一种断言,而不是函数定义的一部分。要了解正在发生的情况,请查看函数的降级代码(这是一种预编译阶段):
julia> f(a::Int)::Int = 2a
f (generic function with 1 method)
julia> @code_lowered f(5)
CodeInfo(
1 ─ %1 = Main.Int
│ %2 = 2 * a
│ %3 = Base.convert(%1, %2)
│ %4 = Core.typeassert(%3, %1)
└── return %4
)
@code_native f(5)
查看自己)。@generated
宏。请注意:元编程通常是解决任何Julia相关问题的杀鸡焉用之策。@generated function f2(x)
if x <: Int
quote
2x
end
else
quote
10x
end
end
end
现在我们有一个名为 f2
的函数,其中 f2
的源代码将依赖于参数类型:
julia> f2(3)
6
julia> f2(3.)
30.0
julia> @code_lowered f2(2)
CodeInfo(
@ REPL[34]:1 within `f2'
┌ @ REPL[34]:4 within `macro expansion'
1 ─│ %1 = 2 * x
└──│ return %1
└
)