Julia 关键字参数-函数

Julia 关键字参数-函数,julia,Julia,我是茱莉亚的初学者 如何创建带有参数关键字的函数,而不必在函数中初始化这些参数 一个非常简单的例子: function f(;a = 1, b = 2) a+b end 我想: function f(;a, b) a+b end 致以最诚挚的问候。这是0.7版中的一项新功能,您可以随心所欲地编写它 Julia在0.6和更早版本上的语法要求您为其提供默认值,但由于该默认值是在调用时计算的,因此您实际上可以使用错误函数来要求它们: julia> function f(;a=error(

我是茱莉亚的初学者

如何创建带有参数关键字的函数,而不必在函数中初始化这些参数

一个非常简单的例子

function f(;a = 1, b = 2)
 a+b
end
我想:

function f(;a, b)
 a+b
end

致以最诚挚的问候。

这是0.7版中的一项新功能,您可以随心所欲地编写它

Julia在0.6和更早版本上的语法要求您为其提供默认值,但由于该默认值是在调用时计算的,因此您实际上可以使用错误函数来要求它们:

julia> function f(;a=error("a not provided"), b=error("b not provided"))
        a+b
       end
f (generic function with 1 method)

julia> f()
ERROR: a not provided
Stacktrace:
 [1] f() at ./REPL[1]:2

julia> f(a=2)
ERROR: b not provided
Stacktrace:
 [1] (::#kw##f)(::Array{Any,1}, ::#f) at ./<missing>:0

julia> f(a=2, b=3)
5
julia>函数f(;a=错误(“未提供”),b=错误(“未提供”))
a+b
结束
f(带1方法的泛型函数)
julia>f()
错误:未提供
堆栈跟踪:
[1] f()at./REPL[1]:2
julia>f(a=2)
错误:未提供b
堆栈跟踪:
[1] (::#kw#f)(::数组{Any,1},:::#f)at./:0
julia>f(a=2,b=3)
5.

这是0.7版中的一项新功能-您可以按照自己的意愿编写它

Julia在0.6和更早版本上的语法要求您为其提供默认值,但由于该默认值是在调用时计算的,因此您实际上可以使用错误函数来要求它们:

julia> function f(;a=error("a not provided"), b=error("b not provided"))
        a+b
       end
f (generic function with 1 method)

julia> f()
ERROR: a not provided
Stacktrace:
 [1] f() at ./REPL[1]:2

julia> f(a=2)
ERROR: b not provided
Stacktrace:
 [1] (::#kw##f)(::Array{Any,1}, ::#f) at ./<missing>:0

julia> f(a=2, b=3)
5
julia>函数f(;a=错误(“未提供”),b=错误(“未提供”))
a+b
结束
f(带1方法的泛型函数)
julia>f()
错误:未提供
堆栈跟踪:
[1] f()at./REPL[1]:2
julia>f(a=2)
错误:未提供b
堆栈跟踪:
[1] (::#kw#f)(::数组{Any,1},:::#f)at./:0
julia>f(a=2,b=3)
5.

这是Julia 0.7行的内容:

关键字参数可能是必需的:如果省略了默认值,那么如果调用方没有为关键字分配值(),则会引发异常

因此:

将成为:

function f(;a = throw(UndefKeywordError(:a)), b = throw(UndefKeywordError(:b)))
    a+b
end

这是Julia 0.7行中的内容:

关键字参数可能是必需的:如果省略了默认值,那么如果调用方没有为关键字分配值(),则会引发异常

因此:

将成为:

function f(;a = throw(UndefKeywordError(:a)), b = throw(UndefKeywordError(:b)))
    a+b
end

另一个解决方法是创建一个带有可变关键字参数的函数,并将对预期关键字输入的任何要求作为断言留在代码中。例如

函数f(;kwargs…)
V=Dict(kwargs)
尝试断言(haskey(V,:a));断言(haskey(V,:b))
捕获e;抛出(断言错误(“KWargs需要是a和b”))
结束
V[:a]+V[:b]
结束
f(a=1,b=2)#>3
f(a=1,c=2)#>错误:断言错误:KWargs必须是a和b
甚至简单到:

函数f(;kwargs…)
V=Dict(kwargs)
a=V[:a]
b=V[:b]
a+b
结束
f(a=1,c=2)#>错误:key错误:找不到key:b

免责声明:我不推荐这一点,我只是说这是另一个需要考虑的功能,取决于你的头脑中的功能。

< P>另一个解决方法是创建一个具有可变关键字参数的函数,并在代码中的断言中保留对预期关键字输入的任何要求。例如

函数f(;kwargs…)
V=Dict(kwargs)
尝试断言(haskey(V,:a));断言(haskey(V,:b))
捕获e;抛出(断言错误(“KWargs需要是a和b”))
结束
V[:a]+V[:b]
结束
f(a=1,b=2)#>3
f(a=1,c=2)#>错误:断言错误:KWargs必须是a和b
甚至简单到:

函数f(;kwargs…)
V=Dict(kwargs)
a=V[:a]
b=V[:b]
a+b
结束
f(a=1,c=2)#>错误:key错误:找不到key:b

免责声明:我不推荐这一点,我只是说这是另一个需要考虑的因素,取决于你的功能。

非常感谢你的帮助。非常感谢你的帮助。非常感谢你的帮助。对于科学计算来说,我相信允许在参数中输入名称而不需要初始化它们将是一个非常可行的收益。我喜欢这个解决方案。非常感谢你的帮助。对于科学计算来说,我相信允许在参数中输入名称而不需要初始化它们将是一个非常可行的收益。我喜欢这个解决方案。它似乎是最快的解决方案。我希望在一个接近富鲁托的地方也能有其他的形式。非常感谢。这似乎是最快的解决方案。我希望在一个接近富鲁托的地方也能有其他的形式。非常感谢你。