Julia 中 Returns() 函数的用途是什么?

sj9*_*126 5 julia

Julia 1.7 添加了Returns()如下功能:

创建一个可调用的f这样的f(args...; kw...) === value内容。

但是,您可以使用接受任何参数的常规函数​​获得相同的结果:

f1 = Returns(99)
f2(args... ; kwargs...) = return 99
f1() === f2()                                       # true
f1("this", 1) === f2("that", 2)                     # true
Run Code Online (Sandbox Code Playgroud)

Returns()除了作为创建返回固定结果的函数的快捷方式之外,还有其他目的吗?PDF文档根本Returns()没有解释。

Bog*_*ski 3

我发现Returns当某些 API 需要一个函数但您需要一个常量值时非常有用。

\n

这是与 DataFrames.jl 结合的示例。让我们获取一些数据框并向其中添加一个常量列:

\n
julia> using DataFrames\n\njulia> df = DataFrame(x=1:4)\n4\xc3\x971 DataFrame\n Row \xe2\x94\x82 x\n     \xe2\x94\x82 Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82     1\n   2 \xe2\x94\x82     2\n   3 \xe2\x94\x82     3\n   4 \xe2\x94\x82     4\n\njulia> transform(df, Returns(1))\n4\xc3\x972 DataFrame\n Row \xe2\x94\x82 x      x1\n     \xe2\x94\x82 Int64  Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82     1      1\n   2 \xe2\x94\x82     2      1\n   3 \xe2\x94\x82     3      1\n   4 \xe2\x94\x82     4      1\n
Run Code Online (Sandbox Code Playgroud)\n

(还有其他方法可以执行此操作,但这显示了一种有用的情况 - 函数transform需要一个函数)

\n

其使用的一个更高级的方面是进行闭包:

\n
julia> x = [1, 2, 3]\n3-element Vector{Int64}:\n 1\n 2\n 3\n\njulia> y = Returns(x)\nReturns{Vector{Int64}}([1, 2, 3])\n\njulia> y()\n3-element Vector{Int64}:\n 1\n 2\n 3\n\njulia> push!(x, 100)\n4-element Vector{Int64}:\n   1\n   2\n   3\n 100\n\njulia> y()\n4-element Vector{Int64}:\n   1\n   2\n   3\n 100\n
Run Code Online (Sandbox Code Playgroud)\n

正如您所看到的,y如果绑定到的基础向量x发生突变,则返回值会更新。请注意,此捕获是类型稳定的。

\n

另请参阅介绍它的PR中的讨论以及此答案中的示例用法。

\n