【问题标题】:julia: how to use optional arguments for an anonymous function朱莉娅:如何为匿名函数使用可选参数
【发布时间】:2026-01-23 01:55:01
【问题描述】:

Here 是 Julia 的文档。

它说我们可以为 Julia 的函数设置可选参数。例如,

function parse(type, num, base=10)
    ###
end

然后我们可以像这样调用函数parse

parse(Int,"12",3)
parse(Int,"12")

我已经对其进行了测试,它确实有效。

现在我想对类型中的函数做同样的事情。这是一个例子,

type MyTest

  testShow::Function

  function MyTest()
    this = new()

    this.testShow = function(p1, p2 = 1, p3 = 2)
    end

    return this
  end

end

但我得到一个错误:

错误:LoadError:语法:“p2=1”不是有效的函数参数名称

【问题讨论】:

    标签: function types julia optional-arguments


    【解决方案1】:

    您似乎在尝试模仿其他面向对象语言(例如 Python)做事的方式。然而,这不是 Julia 的工作方式:方法(函数)存在于 Julia 的类型中。

    相反,方法存在于外部类型。例如:

    type MyTest
        value::Int
    end
    
    function my_show(x::MyTest, p1, p2=1, p3=2)
        x.value * p1 * p2 * p3
    end
    
    x = MyTest(10)
    
    println(my_show(x, 3))
    println(my_show(x, 3, 3, 3))
    

    这是与其他语言不同的范式,试图强迫 Julia 表现得像其他语言是没有意义的。 julia-users 邮件列表上有很多关于此的讨论。

    【讨论】:

    • 感谢您的解释。事实上,我必须强迫 Julia 使用 OOP。这是我发现的东西:thenewphalls.wordpress.com/2014/02/19/…
    • 我必须这样做,因为我的同事在做他的工作时期望一个 OOP 模块。我别无选择。
    • Julia 的 OOP 是 tradicional OOP 的推广,即。在 Python 中:x.foo(y);在朱莉娅foo(x, y)。但是Python实际上也在做foo(x, y),只是在这种情况下使用简单的调度x是特殊的并且拥有方法(x.foo(y)只是语法糖)。由于 Julia 有多次调度,这没有任何意义。
    • 即。在 Python 中, this:"test".upper() # => 'TEST' 是语法糖:upper = str.upper; upper("test") # => 'TEST'
    【解决方案2】:

    匿名函数和命名函数是不同的,例如匿名函数不支持关键字参数,它们是非泛型的。 ref

    julia> (x,y=0)->x
    ERROR: syntax: "y=0" is not a valid function argument name
    

    【讨论】:

    • 正如@David P. Sanders 已经提到的那样,最好不要将 Julia-Lang 类型视为面向对象的类,而且最好不要尝试实现这样的成员函数。
    【解决方案3】:

    正如@Reza 所说,匿名函数不支持关键字参数。所以我尝试这样做:

    type MyTest
    
      testShow::Function
    
      function MyTest()
        this = new()
    
        this.testShow = function tt(p1, p2 = 1, p3 = 2)
        end
    
        return this
      end
    
    end
    

    我为匿名函数设置了一个名称tt。尽管从未使用过tt,但它仍然有效。

    【讨论】: