如何检查特定类型是否存在方法?

时间:2015-05-21 01:08:08

标签: julia

更新:感谢@ rickhg12s指出看起来我可能偶然发现了一个错误。 method_exists(<, (MyType, MyType))正在返回truemethod_exists(isless, (MyType, MyType))正在返回false。我在v0.3.x但是@ rickhg12s是在v0.4的每晚构建,所以我会提出一个问题。

如何检查特定类型的方法是否存在?

我以为我可以使用,例如:

method_exists(<, (Int, Int))

将返回true,因为为两个整数定义了小于比较。但是,当我定义自己的类型时:

type MyType; end

然后尝试:

method_exists(<, (MyType, MyType))

它返回true。但我认为它会返回false,因为:

a = MyType()
a < a

因为<未定义MyType而引发错误。那么如何在运行时检测是否存在给定类型的方法?

1 个答案:

答案 0 :(得分:6)

事实证明,method_exists (当前)是检查特定类型是否存在方法的最佳方法,但需要非常小心。我上面的例子碰巧偶然发现朱莉娅的内部运作中有些令人困惑(但内部一致)的行为。请继续阅读,如果您仍然感兴趣的话。

@ rickhg12s在method_exists(<, (MyType, MyType))返回true的问题的评论中指出method_exists(isless, (MyType, MyType))正在返回false

听起来像个错误吗?我提交了an issue并且julia开发者证实,观察到的行为虽然令人困惑,但在内部是一致的。

<isless是两种不同的方法。重要的是,<对于未定义<的显式方法的情况具有默认行为。这种行为是将参数传递给isless函数。这种行为的后果是<被隐式定义为每个类型,甚至是刚刚创建的全新类型。因此method_exists(<, (MyType, MyType)) 应该返回true。另一方面,isless是最低的&#34;在链中 - 没有其他功能可以将内容传递到其中,因此如果isless未显式扩展到新类型,则Julia会在您尝试使用它时返回错误,method_exists(isless, (MyType, MyType))将会正确返回false

现在已经向我指出,我可以看到这背后的逻辑。但这意味着method_exists的用户需要小心他们将其应用于最低&#34;的功能。在链中。