我想定义一个函数f(x, t::Type)
根据 isa(x, t)
是否执行不同的行为.假设我想调用b1(x)
如果是,b2(x)
除此以外。
我知道我可以像这样在运行时进行动态检查:
function f(x, t::Type)
if isa(x, t)
b1(x)
else
b2(x)
end
end
但是,有没有办法纯粹通过参数方法调度来做到这一点?例如,如果我定义
f{T}(x::T, t::Type{T}) = b1(x)
f(x, t::Type) = b2(x)
对于
f(1, Int)
和 f(1.0, Int)
调用正确的行为。但我希望这也适用于 t
的所有子类型:f(1, Number)
这实际上调用了
b2
因为f
的第一个签名不匹配。有趣的是,f(x::Number, t::Type{Number}) = b1(x)
在这种情况下会匹配。我在这里遗漏了一些明显的东西吗?
这显然是一个错误,并在 0.4 中修复。
问题:
f{T}(x::T, t::Type{T})
不匹配 f(1, Number)
, 即使有 T
的类型替换( Number
) 那会匹配吗? f{T2, T1 <: T2}(x::T1, t::Type{T2})
或类似的东西不起作用,因为似乎所有静态参数只有在完整的静态参数列表关闭后才进入范围。为什么? t
到一个局部变量,像这样:function f(x, t::Type); g(x::t) = b1(x); g(x) = b2(x); g(x) end
这行得通,但性能成本是多少?
(我在 0.3.2 上试过这个。)
最佳答案
要回答您的问题:
isa(x, t)
在编译时并消除分支。但是,仍有一些可能的方法使用 isa
可能不是最理想的:isa(x, t)
之前。被制成一个常数。 (这可能代价高昂;下面其他可能的去优化可能没什么大不了的。)isa
相同的性能问题。和更多。从 Julia 0.5 开始,在这种情况下,内部函数应该与顶级函数一样高效。 isa
只要它不会导致类型推断问题,这不是一个坏方法。 关于julia - 在 Julia 中,如何正确地对调用者提供的(超)类型的参数进行方法分派(dispatch)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26847790/