julia返回值的类型注解 -- 单冒号与双冒号的疑问?



单冒号是返回值的类型注解?不是,但也没报错。
双冒号返回值的类型注解是做convert 。
image
以单冒号做返回值类型注解不起作用。

双冒号做返回值做注解可以发挥作用。

单冒号做返回值注解,无论什么都不报错。
双冒号时做错误注解会报错。

疑问:1.上述单冒号看起来是无意义的,但julia竟然不报错?
2. 返回值的类型注解似乎并不提高性能,反而可能降低性能(多了convert)?

等同这个?
image

只是把第一行写在括号后面了而已

julia> dump(:(
       function f():x
       end))
Expr
  head: Symbol function
  args: Array{Any}((2,))
    1: Expr
      head: Symbol call
      args: Array{Any}((1,))
        1: Symbol f
    2: Expr
      head: Symbol block
      args: Array{Any}((2,))
        1: LineNumberNode
          line: Int64 2
          file: Symbol REPL[1]
        2: QuoteNode
          value: Symbol x

返回值的类型注解似乎并不提高性能,反而可能降低性能(多了convert)?

Julia的函数是泛型的,你不加返回类型的时候根据+(a,b)推断为Int64,你如果要求返回Float64那当然要转换。

推断为Int64,返回注解为Int64,在@code_lowered 的时候也有个convert 过程,这是否会影响性能?

不会。lowering只是脱糖,还不涉及类型和优化,你得看后续步骤。

julia> f(a::Int64,b::Int64)::Int64=a+b
f (generic function with 1 method)

julia> @code_typed f(0,1)
CodeInfo(
1 ─ %1 = Base.add_int(a, b)::Int64
└──      return %1
) => Int64