这有效:
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属性中不允许使用默认参数或关键字参数吗?
答案 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中修复。