2015-05-21 86 views
4

更新:感謝@ 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定義的錯誤。那麼如何在運行時檢測給定類型的方法是否存在?

+3

有趣的是,'a rickhg12hs

+0

@ rickhg12s非常有趣,非常感謝。所以也許我偶然發現了一個bug。你在v0.4嗎?我在v0.3.x上,所以我不想提出問題,除非我能確認這在v0.4上仍然存在問題。 –

+1

是的,我在Github主分支的頭上。 – rickhg12hs

回答

6

事實證明method_exists(當前)檢查是否存在特定類型的方法的最佳方法,但需要非常小心。我上面的例子恰巧偶然發現了朱莉婭內部工作中的一些輕微混淆(但內在一致)的行爲。如果你仍然感興趣,請繼續閱讀。

@ rickhg12s在評論到method_exists(<, (MyType, MyType))正在恢復truemethod_exists(isless, (MyType, MyType))在返回false的提問時指出。

聽起來像一個錯誤嗎?我提交an issue,朱莉婭開發者證實,觀察到的行爲雖然令人困惑,但內部一致。

<isless是兩種不同的方法。重要的是,對於<未定義明確方法的情況,<具有默認行爲。該行爲是將參數傳遞給isless函數。這種行爲的後果是,<被隱含地定義爲類型,甚至是剛創建的全新類型類型。所以method_exists(<, (MyType, MyType))應該返回true。另一方面,isless是鏈中的「最低」 - 沒有其他函數可以傳遞給它,所以如果isless沒有被明確地擴展到新類型,如果你試圖使用它,Julia會返回一個錯誤,和method_exists(isless, (MyType, MyType))將正確返回false

現在已經指出,我可以看到這背後的邏輯。但暗示method_exists的用戶需要小心,他們將其應用於鏈中「最低」的功能。

+0

是否有像method_exists這樣的函數也檢查函數的返回類型?像'method_exists(name,args,return_type)' – Nozdrum

+1

@Nozdrum不是我知道的,而且這樣的函數會是難以編寫,因爲一些Julia函數具有多種返回類型。我知道提取這些信息的唯一方式是通過[@code_warntype](https://docs.julialang.org/en/stable/manual/performance-tips /#code-warntype),這對靜態分析很有用,但在運行時動態使用會非常棘手。 –

相關問題