这有效:

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 属性中是否不允许使用默认参数或关键字参数?

最佳答案

这里的问题不是您将函数分配给某个类型的字段,而是 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 的函数通常从类型外部定义并使用 multiple dispatch 。这是风格的变化,但我强烈推荐 embracing it
dude.say_something = function(whats::AbstractString...)
    length(whats) < 2 || error("too many arguments")
    what = isempty(whats) ? "hi" : whats[1]
    print(what)
end

关于julia - 类型的 Function 属性中的默认参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36069299/

10-13 09:29
查看更多