类型的Function属性中的默认参数

时间:2016-03-17 18:52:32

标签: 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()
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")

产生错误:

ERROR: LoadError: syntax: expected "(" in function definition in include at ./boot.jl:261 in include_from_node1 at ./loading.jl:304 in process_options at ./client.jl:280 in _start at ./client.jl:378

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

2 个答案:

答案 0 :(得分:5)

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

"Consecuente"

这个限制是因为,在Julia 0.4上,匿名函数不是通用的 - 你不能为匿名函数添加多个方法。默认值只是用于定义具有不同数量的参数的多个方法的捷径。在0.5中,所有函数都是通用的,因此一旦它被释放就应该在那里工作。

现在,你可以通过使用一个命名函数或简单地允许任意数量的参数并自己填充默认值来解决这个问题。但请注意,在这样的对象中存储成员函数通常是一种代码嗅觉,你试图将类似Python的OO技术转化为Julia。 Julia的函数通常从类型外部定义并使用multiple dispatch。这是风格的变化,但我强烈推荐embracing it

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

答案 1 :(得分:2)

以下作品,至少在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中修复。