如何获取可选参数julia的默认值?

时间:2019-06-25 17:31:28

标签: reflection julia

可以使用getproperty从结构中获取值。 我对同一件事感兴趣,但对可选参数/默认参数很感兴趣。

我将如何在Julia中实现这一目标?

function foo(a,b,c=1)
...
end
getDefaultArg(foo, c)
=> (c, 1)

1 个答案:

答案 0 :(得分:2)

当您编写foo(a,b,c=42) = a*b*c时,Julia仅定义了两种方法:

foo(a, b) = foo(a, b, 42)
foo(a, b, c) = a*b*c

您可以通过向Julia询问方法来查看此信息:

julia> foo(a, b, c=42) = a*b*c
foo (generic function with 2 methods)

julia> methods(foo)
# 2 methods for generic function "foo":
[1] foo(a, b) in Main at REPL[120]:1
[2] foo(a, b, c) in Main at REPL[120]:1

这就是一个可选的(位置)参数。实际上,有时您希望可选参数出现在第一个参数处,但这不是受支持的语法。因此,您可以手动执行以下操作:

print(x) = print(stdout, x)
print(io, x) = # actually print to the io

以这种方式,io与示例中的c一样是参数的“可选”。当然,我希望您能看到这如何使这里的思考变得非常棘手。一种可能的途径是询问两个参数foo的作用:

julia> code_lowered(foo, Tuple{Any,Any})
1-element Array{Core.CodeInfo,1}:
 CodeInfo(
1 ─ %1 = (#self#)(a, b, 42)
└──      return %1
)

因此可以构建一个潜在的“类似于反射”的实用程序来对此IR进行自省:

julia> c = code_lowered(foo, Tuple{Any,Any})
1-element Array{Core.CodeInfo,1}:
 CodeInfo(
1 ─ %1 = (#self#)(a, b, 42)
└──      return %1
)

julia> c[1].code[1].args[end]
42

当然,您希望将其捆绑到具有大量错误检查功能的函数中,以确保该方法实际上只是在调用自身,除了填充最后一个参数之外,没有其他事情发生。