代码之家  ›  专栏  ›  技术社区  ›  sj95126

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

  •  2
  • sj95126  · 技术社区  · 3 年前

    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
    

    还有别的目的吗 返回() 除了作为创建返回固定结果的函数的快捷方式之外?这个 PDF documentation 无法解释 返回() 完全

    1 回复  |  直到 3 年前
        1
  •  3
  •   Bogumił Kamiński    3 年前

    我发现 Returns 在某些API需要函数,但您需要常量值的情况下非常有用。

    下面是一个与DataFrames.jl结合的例子。让我们取一些数据帧,并在其中添加一个常量列:

    julia> using DataFrames
    
    julia> df = DataFrame(x=1:4)
    4×1 DataFrame
     Row │ x
         │ Int64
    ─────┼───────
       1 │     1
       2 │     2
       3 │     3
       4 │     4
    
    julia> transform(df, Returns(1))
    4×2 DataFrame
     Row │ x      x1
         │ Int64  Int64
    ─────┼──────────────
       1 │     1      1
       2 │     2      1
       3 │     3      1
       4 │     4      1
    

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

    其使用的一个更高级的方面是制作一个闭包:

    julia> x = [1, 2, 3]
    3-element Vector{Int64}:
     1
     2
     3
    
    julia> y = Returns(x)
    Returns{Vector{Int64}}([1, 2, 3])
    
    julia> y()
    3-element Vector{Int64}:
     1
     2
     3
    
    julia> push!(x, 100)
    4-element Vector{Int64}:
       1
       2
       3
     100
    
    julia> y()
    4-element Vector{Int64}:
       1
       2
       3
     100
    

    正如您所看到的 y 如果基础向量绑定到 x 是突变的。请注意,此捕获是类型稳定的。

    另请参阅中的讨论 the PR 介绍了它以及中的一个示例用法 this answer 在SO上。

    推荐文章