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)
當定義一個方法時,沒有考慮塊的類型簽名是什麼原因?天真地說,我認爲它是函數類型簽名的一部分,就像其他參數一樣。 –
因爲當你傳遞一個塊時,你不會給出參數的類型,你只需使用'| a,b,c |'。這意味着要計算出要調用的重載,您需要知道a,b和c的類型,但要鍵入它們,您需要知道您調用的是哪種方法。這是一個遞歸查找,因此不可能。 – RX14