julia - 自定义使用括号,如 NamedTuple

标签 julia

据我所知,Julia 中的括号用于参数类型。
然而,有一个以不同方式使用大括号的示例:

NamedTuple{(:a, :b)}((1, 2))

这将构造 NamedTuple (a=1, b=2),但您可以在括号中传递字段名称。
我认为 NamedTuple 的源代码有点晦涩。

NamedTuple() = NamedTuple{(),Tuple{}}(())

NamedTuple{names}(args::Tuple) where {names} = NamedTuple{names,typeof(args)}(args)

eval(Core, :(NamedTuple{names,T}(args::T) where {names, T <: Tuple} =
             $(Expr(:splatnew, :(NamedTuple{names,T}), :args))))
  • NamedTuple 的创建是否依赖于宏/元编程?
  • :splatnew 的作用是什么?
  • 您将如何自定义使用括号?

最佳答案

There is however one example of curly brackets being used in a different way:

它们的使用方式相同。字段名称是 NamedTuple 的参数。要查看此检查:

julia> typeof((a=1, b=2))
NamedTuple{(:a, :b), Tuple{Int64, Int64}}

唯一的问题是您省略了传递第二个参数,即 Tuple{Int64, Int64}在这种情况下,但 Julia 允许在这种情况下省略传递所有参数。您可以省略它们的原因是在您引用的这段代码中处理的:

NamedTuple{names}(args::Tuple) where {names} = NamedTuple{names,typeof(args)}(args)

它扩展参数以包含元组作为第二个参数。

Does the creation of a NamedTuple rely on macros/metaprogramming?

是的,代码:

eval(Core, :(NamedTuple{names,T}(args::T) where {names, T <: Tuple} =
             $(Expr(:splatnew, :(NamedTuple{names,T}), :args))))

计算 Core 中的表达式模块。这是元编程(但不是宏)。

What does :splatnew do?

正如您可以在 Julia Manual 中读到的那样它是:

Similar to new, except field values are passed as a single tuple. Works similarly to splat(new) if new were a first-class function, hence the name.

所以本质上是 new但接受一个位置参数,该参数是一个被喷溅的元组。

How would you approach making your own custom use of brackets?

这不是括号的自定义使用。语义遵循标准参数类型规则。

关于julia - 自定义使用括号,如 NamedTuple,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76378134/

相关文章:

julia - 使用 Julia 将数据写入 csv 文件的最有效方法

arrays - 为什么[1 :2] ! = 数组[1:2]

memory - 在 Julia 中逐行检查内存分配

csv - Julia Web App 上传 CSV、应用函数、返回输出

parallel-processing - 查找可用于处理的最大核心数

memory - 就地更新矩阵的列

julia - 取决于全局定义位置,执行时间要长几个数量级?

dictionary - Julia double for 循环,遍历字典