据我所知,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 tosplat(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/