在Julia中,`(1)(2)`和`x = 1; (x)(2)`有什么区别?

3
下面展示的是(1)(2)x = 1; (x)(2)之间的区别?
(译注:原句为英文,本人将其翻译成中文)
julia> (1)(2)
2

# but
julia> x = 1
1
julia> (x)(2)
ERROR: MethodError: objects of type Int64 are not callable

谢谢。

引用自这里

2个回答

5
Julia的解析器对数字文字的临近放置采取特殊处理,因此类似于2x被解析为2 * x一样,(1)(2)(或等效地1(2))被解析为1 * 2(x)(2)则是普通函数调用语法,就像x(2)一样。如果x是一个数字,则会出现错误,因为Julia中的数字不能被调用。

3

虽然Simeon准确地描述了发生的情况,但请注意,在类似的情况下,您始终可以使用 dump(quote; ...; end) 来获取正在进行的信息:

julia> dump(quote
       (1)(2)
       end)
Expr
  head: Symbol block
  args: Array{Any}((2,))
    1: LineNumberNode
      line: Int64 2
      file: Symbol REPL[2]
    2: Expr
      head: Symbol call
      args: Array{Any}((3,))
        1: Symbol *
        2: Int64 1
        3: Int64 2

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

您可以看到,第一个案例被解析为乘法运算符,而第二个案例则被解析为函数调用。

3
你可以直接调用 Meta.@dump(1)(2),这样也避免了将所有内容包装在 block 表达式中。 - Simeon Schaub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接