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()没有解释。
我发现Returns当某些 API 需要一个函数但您需要一个常量值时非常有用。
这是与 DataFrames.jl 结合的示例。让我们获取一些数据框并向其中添加一个常量列:
\njulia> 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\nRun Code Online (Sandbox Code Playgroud)\n(还有其他方法可以执行此操作,但这显示了一种有用的情况 - 函数transform需要一个函数)
其使用的一个更高级的方面是进行闭包:
\njulia> 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\nRun Code Online (Sandbox Code Playgroud)\n正如您所看到的,y如果绑定到的基础向量x发生突变,则返回值会更新。请注意,此捕获是类型稳定的。
另请参阅介绍它的PR中的讨论以及此答案中的示例用法。
\n