Syntax f(s::String)和f(::String)之间的差异
以下两个功能之间有什么区别Syntax f(s::String)和f(::String)之间的差异,syntax,julia,Syntax,Julia,以下两个功能之间有什么区别 julia> one(s::String) = return 1 one (generic function with 1 method) julia> one(::String) = return 1 one (generic function with 1 method) 两者似乎都是被允许的,它们之间似乎没有区别。我想不包含v可能会向编译器发出信号,表明未使用参数的值,但这也是编译器可以理解的,对吗?(免责声明:我不知道编译器是如何工作的)如果不
julia> one(s::String) = return 1
one (generic function with 1 method)
julia> one(::String) = return 1
one (generic function with 1 method)
两者似乎都是被允许的,它们之间似乎没有区别。我想不包含
v
可能会向编译器发出信号,表明未使用参数的值,但这也是编译器可以理解的,对吗?(免责声明:我不知道编译器是如何工作的)如果不使用参数,则没有区别,是的,对于编译器来说,这应该是微不足道的
但是,您可以将\uu
用作实际的“放弃参数”,解析器将阻止您使用它:
julia> f(_) = _ + 1
ERROR: syntax: all-underscore identifier used as rvalue around REPL[9]:1
这在某些情况下很有用:
julia> _, _, z = (1,2,3)
(1, 2, 3)
julia> z
3
julia> _
ERROR: all-underscore identifier used as rvalue
当
这有点令人困惑
更多技术细节 IR中存在未使用的参数,但:
julia> one(::String) = return 1
one (generic function with 1 method)
julia> one2(s::String) = return 1
one2 (generic function with 1 method)
julia> ir = @code_lowered one("sdf")
CodeInfo(
1 ─ return 1
)
julia> ir.slotnames
2-element Array{Symbol,1}:
Symbol("#self#")
Symbol("#unused#")
julia> ir2 = @code_lowered one2("sdf")
CodeInfo(
1 ─ return 1
)
julia> ir2.slotnames
2-element Array{Symbol,1}:
Symbol("#self#")
:s
如果你关心插槽名称。我无法想象这将如何改变进一步的编译,但它可能是元编程中的一个极端情况。实际上,例如Pipe.jl利用了
\uucode>是只写的这一事实。
julia> one(::String) = return 1
one (generic function with 1 method)
julia> one2(s::String) = return 1
one2 (generic function with 1 method)
julia> ir = @code_lowered one("sdf")
CodeInfo(
1 ─ return 1
)
julia> ir.slotnames
2-element Array{Symbol,1}:
Symbol("#self#")
Symbol("#unused#")
julia> ir2 = @code_lowered one2("sdf")
CodeInfo(
1 ─ return 1
)
julia> ir2.slotnames
2-element Array{Symbol,1}:
Symbol("#self#")
:s