Julia 类型的函数属性中的默认参数

Julia 类型的函数属性中的默认参数,julia,Julia,这项工作: type Dude say_something::Function # constructor function Dude() dude = new() dude.say_something = function(what::AbstractString) print(what) end return dude end end dude = Dude() dud

这项工作:

type Dude
    say_something::Function
    # constructor
    function Dude()
        dude = new()

        dude.say_something = function(what::AbstractString)
            print(what)
        end
        return dude
    end
end

dude = Dude()
dude.say_something("hi")
但是我想要
what
的默认参数。但是,该代码:

type Dude
    say_something::Function
    # constructor
    function Dude()
        dude = new()

        dude.say_something = function(what::AbstractString="hi")
            print(what)
        end
        return dude
    end
end

dude = Dude()
dude.say_something("hello")
产生一个错误:


错误:LoadError:语法:函数定义中应为“(”
包括在./boot.jl:261
在./loading.jl:304处包含来自节点1的
进程中的选项位于./client.jl:280
in_开始于./client.jl:378


类型的函数属性中不允许使用默认参数或关键字参数吗?

这里的问题不是将函数分配给类型的字段,而是Julia 0.4中的匿名函数不支持默认参数:

julia> function(what=1); what; end
ERROR: syntax: expected "(" in function definition

julia> (what=1) -> what
ERROR: syntax: "what=1" is not a valid function argument name
这一限制是因为,在Julia 0.4中,匿名函数不是泛型函数-您不能向匿名函数添加多个方法。默认值只是定义具有不同参数数的多个方法的捷径。在0.5中,所有函数都是泛型函数,因此一旦发布,应该可以在那里使用

目前,您可以通过使用命名函数或简单地允许任意数量的参数并填充自己的默认值来解决此问题。但请注意,在这样的对象中存储成员函数通常是一种代码味道,您试图将类似Python的OO技术引入Julia。Julia的函数通常是在外部定义的rom类型和使用。这是风格上的改变,但我强烈推荐

dude.say\u something=function(whats::AbstractString…)
长度(whats)<2 | |错误(“参数太多”)
what=isempty(whats)?“嗨”:whats[1]
打印(什么)
结束

至少在v0.5上执行以下操作:

julia> type Dude
           say_something::Function
           # constructor
           Dude() = new((what::AbstractString="hi")->(print(what)))
       end

julia> y = Dude()
Dude(#1)

julia> y.say_something()
hi
您还可以(在v0.4.3中)执行以下操作:

julia> type Dude
           say_something::Function
           # constructor
           function Dude()
               function ss(what::AbstractString="hi")
                   print(what)
               end
               new(ss)
           end
       end

julia> y = Dude()
Dude(ss)
julia> y.say_something()
hi

我认为问题(在v0.4.x中)在于匿名函数语法,该语法在v0.5中已经修复。

Matt的答案是在我在v0.4.3上编写和测试我的语法时得出的,在大多数情况下,我也同意没有必要在Julia中做类似Pythonesque的事情。
julia> type Dude
           say_something::Function
           # constructor
           function Dude()
               function ss(what::AbstractString="hi")
                   print(what)
               end
               new(ss)
           end
       end

julia> y = Dude()
Dude(ss)
julia> y.say_something()
hi