更新:感谢@ 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.那么如何在运行时检测是否存在给定类型的方法?
原来,method_exists 是(目前),以检查是否存在特定类型的方法的最佳方式,但是需要非常小心.我上面的例子碰巧偶然发现朱莉娅的内部运作中有些令人困惑(但内部一致)的行为.如果您仍然感兴趣,请继续阅读.
@ rickhg12s在评论中指出了method_exists(<, (MyType, MyType))返回true时method_exists(isless, (MyType, MyType))返回的问题false.
听起来像个错吧?我提出了一个问题,并且julia开发者证实,所观察到的行为虽然令人困惑,但在内部是一致的.
<并且isless是两种不同的方法.重要的是,<对于<未定义显式方法的情况,具有默认行为.这种行为是将参数传递给isless函数.这种行为的后果<是为每种类型隐式定义,甚至是刚刚创建的全新类型.所以method_exists(<, (MyType, MyType)) 应该回来true.isless另一方面,它是链中的"最低" - 没有其他功能可以传递给它,所以如果isless没有明确地扩展到新类型,Julia如果你试图使用它method_exists(isless, (MyType, MyType))会返回错误,并且会正确回归false.
现在已经向我指出了,我可以看到这背后的逻辑.但其含义是,用户method_exists需要小心他们将其应用于链中"最低"的功能.