我正在學習Ruby,我有一個關於打字的重大概念問題。請允許我詳細說明爲什麼我不瞭解範式。如何使用Ruby Duck Typing
假設我是Ruby中的簡潔代碼的方法鏈接。我必須精確地知道鏈中每個方法調用的返回類型,否則我不知道下一個鏈接上有哪些方法可用。我每次都必須檢查方法文檔嗎?我遇到了這個不斷運行的教程練習。看來我堅持一個參考過程,推斷,運行,失敗,修復,重複以獲得代碼運行,而不是知道我在編碼期間正在處理的內容。這在Ruby的直覺性承諾面前飛來飛去。
說我正在使用第三方庫,我再一次需要知道哪些類型允許傳遞參數,否則我會失敗。我可以看看代碼,但是可能會有也可能沒有任何關於該方法所期待的類型的評論或聲明。我理解你基於方法的代碼是可用的對象,而不是類型。但是,我必須確定無論我傳遞的參數是否具有庫所需的所有方法,所以我仍然需要進行類型檢查。我是否希望並祈禱一切都在接口上正確記錄,以便我知道是否需要給出字符串,哈希,類等。
如果我查看方法的來源,我可以得到一個被調用的方法列表並推斷出預期的類型,但我必須執行分析。
Ruby and duck typing: design by contract impossible?
在前面的計算器問題的討論沒有真正回答不是「有你必須遵循流程」和這些進程似乎並不爲標準的其它任何東西,每個人都有不同的意見遵循什麼程序,以及該語言的執行力度爲零。方法驗證?測試驅動設計?記錄的API?嚴格的方法命名約定?標準是什麼,誰決定它?我遵循什麼?這些指導方針是否可以解決這個問題https://stackoverflow.com/questions/616037/ruby-coding-style-guidelines?有編輯幫忙嗎?
從概念上講,我也沒有得到好處。您需要知道所調用的任何方法需要哪些方法,因此無論您在編寫任何代碼時都正在輸入內容。除非您決定對其進行記錄,否則您只是沒有明確告知該語言或任何其他人。然後,你被困在做所有類型檢查在運行時而不是在編碼過程中。我已經完成了PHP和Python編程,但我也不明白。
我錯過了什麼或不理解?請幫我理解這個範例。
鴨子打字有一定的優勢,但當然也有缺點。我可以將* any *對象傳遞給一個方法'foo(a)',它只要調用'a.responds_to?(:bar)'就可以調用'a.bar'。這很好。沒有界面,沒有泛型,只需添加一個'bar'方法即可。當然,靜態打字也有很多優點。聽起來你只需要一些Ruby方式的經驗來欣賞兩者。也聽起來像你可能被intellisense(或類似的功能)有點被寵壞了。許多(*許多*)我們必須儘早且經常地檢查文檔。 –
直覺是訓練的結果,所以沒有直覺,直到你訓練自己使用它。 –
這個問題患有「TL; DR」。它會幫助你總結它,並拋棄其他方面,否則它太廣泛了。 「這直接面對Ruby對直覺的承諾。」對誰是直觀的? Matz說,它的設計對他來說很直觀,而且他認爲對於那些已經充分使用它的人來說,這會變得直觀。創建一種立即對所有人都直觀的語言是不可能的,所以他的目標就是點亮。 –