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