亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

鴨子打字是什么?

鴨子打字是什么?

鴨子打字是什么?我碰到了這個詞鴨型在網上閱讀隨機話題時,并沒有完全理解它。什么是“鴨子打字”?
查看完整描述

3 回答

?
慕尼黑8549860

TA貢獻1818條經驗 獲得超11個贊

鴨型意味著一個操作未正式指明它的操作數必須滿足的要求,但是試試看得到了什么。

與其他人所說的不同,這不一定與動態語言或繼承問題有關。

示例任務:調用某種方法Quack在物體上。

使用鴨子類型,一個函數f執行此任務必須事先指定其參數必須支持某些方法。Quack..一個常見的方法是使用接口。

interface IQuack { 
    void Quack();
}

void f(IQuack x) { 
    x.Quack(); 
}

呼叫f(42)失敗了,但是f(donald)工作時間只要donaldIQuack-亞型。

另一種方法是結構分型-但同樣,方法Quack()正式指定任何不能證明這一點的東西。quack提前將導致編譯器失敗。

def f(x : { def Quack() : Unit }) = x.Quack()

我們甚至可以寫

f :: Quackable a => a -> IO ()
f = quack

在哈斯克爾Quackable類型化確保了我們方法的存在。



所以怎么鴨型改變這個?


嗯,就像我說過的,鴨子打字系統沒有指定要求,但是只要試一試就行了.

因此,Python的動態類型系統總是使用鴨子類型:

def f(x):
    x.Quack()

如果f獲取一個x支持Quack(),一切都很好,如果不是,它將在運行時崩潰。

但是鴨子類型并不意味著動態輸入-事實上,有一種非常流行但完全靜態的鴨子類型方法,它也沒有給出任何要求:

template <typename T>
void f(T x) { x.Quack(); }

這個函數沒有以任何方式表明它想要一些xQuack,所以它只是嘗試編譯時如果一切順利的話,一切都會好起來的。


查看完整回答
反對 回復 2019-07-11
?
慕少森

TA貢獻2019條經驗 獲得超9個贊

簡單解釋(沒有代碼)

對這個問題的語義的討論是相當細微的(而且非常學術性的),但是這里有一個總的想法:

鴨型

(“如果它走路像鴨子,叫起來像鴨子,那它就是鴨子?!?-是!但這是什么意思?!最好的例子是:

示例:動態類型語言

想象一下我有一根魔杖。它有特殊的力量。如果我揮動魔杖說“開車!”去一輛車,好吧,它會開車的!

它對其他事情有用嗎?不確定:所以我在卡車上試了一下。哇-它也會開車!然后我在飛機,火車和1伍茲(他們是一種高爾夫球俱樂部,人們用來“駕駛”高爾夫球)。他們都開車!

但是它能用在一個茶杯上嗎?錯誤:KAAAA-BOOOOOOM!結果不太好。=>茶杯不能開!?。??

這基本上就是鴨子輸入的概念。是個試著先買然后再買系統。如果成功了,一切都會好起來的。但如果失敗了,它會在你臉上炸開的。

換句話說,我們感興趣的是能行,而不是和物體是什么.

示例:靜態類型化語言

如果我們關心的是目標到底是什么,然后我們的魔術將只適用于預置,授權類型-在這種情況下,汽車,但是將在其他可以驅動的對象上失敗。:卡車,輕便摩托車,突克-土豆泥等,因為我們的魔杖期待著它不能在卡車上使用。只在汽車上工作.

換句話說,在這個場景中,魔杖非常仔細地查看對象(這是一輛車嗎?)而不是對象能行(例如汽車、卡車等是否能駕駛)。

你能得到一輛卡車的唯一方法就是你能得到魔法棒來期待這兩輛卡車。CARS(也許是通過“實現公共接口”來實現的)。如果你不知道這意味著什么,那就暫時忽略它。

摘要:關鍵退出

鴨子類型中最重要的是對象實際上可以做,而不是對象.


查看完整回答
反對 回復 2019-07-11
  • 3 回答
  • 0 關注
  • 850 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號