2017-10-07 55 views
2

是否可以在具有多個允許特徵的方法內捕獲塊?捕獲具有多個允許類型/特徵的塊

alias IoBlockFormatter = Severity, Time, String, String, IO -> Nil 
alias StringBlockFormatter = Severity, Time, String, String -> String 

class Formatter 
    def initialize(@io : IO, &@block : IoBlockFormatter | StringBlockFormatter) 
    end 
end 

在這個例子中,我定義兩種不同類型的功能,我想,讓我Formatter類可以接受是兩種類型的塊。我的第一次嘗試嘗試使用這兩種類型的聯合,但編譯器抱怨期待函數類型,而不是兩個Proc類型的聯合。

expected block type to be a function type, not (Proc(Severity, Time, String, String, IO, Nil) | Proc(Severity, Time, String, String, String)) 

    def initialize(@io : IO, &@block : IoBlockFormatter | StringBlockFormatter) 

回答

3

您不能讓一個方法採用多個塊類型,因爲塊是從方法簽名中鍵入的,而不是其他方式。一旦找到正確的方法,塊參數的類型將從yield中推導出來,帶有未捕獲的塊,以及來自捕獲參數中的&block的類型。您也不能有兩個具有相同參數和塊的重載,即使該塊由於類似的原因而被不同地使用。

+0

當定義一個方法時,沒有考慮塊的類型簽名是什麼原因?天真地說,我認爲它是函數類型簽名的一部分,就像其他參數一樣。 –

+0

因爲當你傳遞一個塊時,你不會給出參數的類型,你只需使用'| a,b,c |'。這意味着要計算出要調用的重載,您需要知道a,b和c的類型,但要鍵入它們,您需要知道您調用的是哪種方法。這是一個遞歸查找,因此不可能。 – RX14

相關問題