可以使用getproperty从结构中获取值。 我对同一件事感兴趣,但对可选参数/默认参数很感兴趣。
我将如何在Julia中实现这一目标?
function foo(a,b,c=1)
...
end
getDefaultArg(foo, c)
=> (c, 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
当然,您希望将其捆绑到具有大量错误检查功能的函数中,以确保该方法实际上只是在调用自身,除了填充最后一个参数之外,没有其他事情发生。