首页 > 解决方案 > f(s::String) 和 f(::String) 之间的区别

问题描述

以下两个函数有什么区别?

julia> one(s::String) = return 1
one (generic function with 1 method)

julia> one(::String) = return 1
one (generic function with 1 method)

两者似乎都被允许,并且它们之间似乎没有区别。我想不包括vcan 向编译器发出未使用参数值的信号,但是这又是编译器可以弄清楚的,对吧?(免责声明:我不知道编译器是如何工作的)

标签: syntaxjulia

解决方案


如果您不使用该参数,则没有区别,是的,对于编译器来说,这应该是微不足道的。

不过,您可以将_其用作实际的“丢弃参数”,并且解析器会阻止您使用它:

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

尽管

julia> x, x, z = (1,2,3)
(1, 2, 3)

julia> x
2

有点混乱。


更多技术细节

但是,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 

如果您关心插槽名称。我无法想象这将如何改变进一步的编译,但它可能是元编程中的一个极端情况。


推荐阅读