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

Col*_*ers 4 julia

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

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

我以为我可以这样做,例如:

method_exists(<, (Int, Int))
Run Code Online (Sandbox Code Playgroud)

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

type MyType; end
Run Code Online (Sandbox Code Playgroud)

然后尝试:

method_exists(<, (MyType, MyType))
Run Code Online (Sandbox Code Playgroud)

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

a = MyType()
a < a
Run Code Online (Sandbox Code Playgroud)

抛出错误,因为<没有定义MyType.那么如何在运行时检测是否存在给定类型的方法?

Col*_*ers 6

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

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

听起来像个错吧?我提出了一个问题,并且julia开发者证实,所观察到的行为虽然令人困惑,但在内部是一致的.

<并且isless是两种不同的方法.重要的是,<对于<未定义显式方法的情况,具有默认行为.这种行为是将参数传递给isless函数.这种行为的后果<是为每种类型隐式定义,甚至是刚刚创建的全新类型.所以method_exists(<, (MyType, MyType)) 应该回来true.isless另一方面,它是链中的"最低" - 没有其他功能可以传递给它,所以如果isless没有明确地扩展到新类型,Julia如果你试图使用它method_exists(isless, (MyType, MyType))会返回错误,并且会正确回归false.

现在已经向我指出了,我可以看到这背后的逻辑.但其含义是,用户method_exists需要小心他们将其应用于链中"最低"的功能.