Coursera課程 Programming Languages, Part C 總結

碎言碎語

  • 和前面的 ML 和 Racket 感覺明顯不一樣了,一邊學著一邊覺得這真是一門奇怪的語言,有著各種奇怪的語法,不過真的算是一個奇妙的體驗(相比前面的兩門語言,Ruby 的學習資源多了不少)。
  • week 1 的作業直接就是給出一份 Ruby 源碼的俄羅斯方塊游戲,而任務就是給這個游戲添加功能,趣味性不用多說,也能很好的考察到閱讀代碼、應用已有代碼的能力。不得不再次感嘆作業真的用心。
  • week 2 首先就是比較,OOP vs FP,大量的代碼示例以及詳細的講解,但絕不是為了告訴我們用什么而不用什么,而是在什么時候該用什么,使用的優缺點。而作業則涉及了 SML 和 Ruby 兩門語言,我們嘗試去用這兩門編程語言去完成同一件事情。

筆記

1. Ruby is a pure object-oriented language, which means all values in the language are objects.

2. 動態的類定義

即使我們得到了一個類實例化后的對象,在后面我們去修改這個類的方法(只需要重寫這個類中的那個我們需要修改的方法),之前的對象的方法也會改變,那么就會有一個問題。

class Adef q03enddef q1q0 + 12end
enda = A.newputs a.q1class Adef q0"as"end
endputs a.q1

此時就會報錯:TypeError: no implicit conversion of Fixnum into String

然后我們可以有一個操作:

class Fixnumdef +1end
end

將上面的代碼復制到 1.rb 文件并保存。
在 REPL 中輸入 load "1.rb"
REPL直接崩潰了,報錯:in '+': wrong number of arguments (1 for 0) (ArgumentError)

3. Ruby 中的 Blocks 和 Proc Class

在 Ruby 中 Blocks 很類似于函數式編程語言中的閉包(closures),或者說功能上很類似匿名函數,可以傳遞給一個函數,在函數內部執行,或者結合數組自帶的那些方法使用(類似于函數式編程語言中的高階函數)。

比如可以這樣:

10.times { puts "HI" }

10 是一個 Fixnum 類實例化后的對象,它自帶 times 方法,功能么就是執行后面的 Blocks 里面的代碼 10 次。

但是 Blocks 并不是對象,當然你也不能辨別它屬于哪個類,所以它無法賦值給一個變量,或者放到一個數組里,或者作為參數傳遞給一個函數。這個時候就需要 Proc 類。
它實例化后的對象就是lambda {}

lambda {}.class # Proc
lambda do end.class # Proc

這里 lambda {} 是一個整體,{ ... }可以替換成do ... end

lambda 在函數編程語言中很熟悉了,在 Ruby 中我們也幾乎可以那么用。

通過調用 call 方法去執行這個“函數”。

q = lambda { |x| x * x }
q.call 3 # 9

更詳細的話這個帖子講的不錯:聊聊 Ruby 中的 block, proc 和 lambda。

4. Dynamic Dispatch

class Adef even xif x == 0trueelseputs "odd"odd(x - 1)endenddef odd xif x == 0falseelseputs "even"even(x - 1)endend
endclass B < Adef even xx % 2 == 0end
end

B 是 A 的子類,B 中重寫了 even 方法,也可以是使用 odd 方法,但是在調用 odd 方法的時候,odd 方法中使用的實際是 B 類中重寫的 even 方法。

b = B.new
b.odd 9

只會打印一個 even 字符串。

實際上 A 類中在調用方法的時候省略了 self ,實際上應該是 self.odd(x - 1) self.even(x - 1)

那么實際去調用哪個方法,取決于 self 是什么,這里使用 B 的實例 b 去調用這個方法,self 就是 b 這個實例。

5. Multimethods

  • Multiple dispatch
  • What is the difference between multiple dispatch and method overloading?
  • Overloading in Java and multiple dispatch

Multiple dispatch 中在運行時才決定具體去調用哪個同名函數,而 Method overloading 在編譯時已經確定了類型。

比方說 Java 多態的應用中,父類引用子類對象,在編譯期間確定類型就會導致不符合期望的調用。

轉載于:https://www.cnblogs.com/ftae/p/8305635.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453007.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453007.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453007.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何判斷網絡是否進入擁塞狀態

通過觀察網絡的吞吐量與網絡負載間的關系 如果隨著網絡負載的增加&#xff0c;網絡的吞吐量明顯小于正常的吞吐量&#xff0c;那么網絡就進入例如輕度擁塞的狀況。 如果網絡得吞吐量隨著網絡負載的增大反而下降&#xff0c;那么網絡就可能進入擁塞狀態。 如果網絡的負載繼續…

如何拷貝工程_如何將premiere的工程及素材文件打包?

我們在剪輯視頻的時候經常會遇到素材丟失的情況&#xff0c;或者說需要換地方或換電腦繼續剪輯。特別是以前做的視頻現在需要修改一些地方&#xff0c;然后打開工程文件會發現素材丟失&#xff0c;如圖&#xff1a;這種情況要不就是素材已經刪除&#xff0c;要不就是素材改變了…

邁出從3K到1W的重要一步——掌握設計模式

IT職場的小菜經常有這樣的疑問&#xff1a; 為什么一個相似的功能&#xff0c;大牛一會兒就搞定&#xff0c;然后悠閑地品著下午茶逛淘寶&#xff1b;而自己加班加點搞到天亮還做不完。 為什么用戶提出需求變更后&#xff0c;大牛只需瀟灑地敲敲鍵盤&#xff0c;改改配置&#…

使用pip安裝virtualenv時出現問題

使用pip出現問題 fxd0ubuntu:~$ sudo pip install virtualenv [sudo] password for fxd0: env: ‘pip’: No such file or directory fxd0ubuntu:~$ pip insatall virtualenv Command pip not found, but can be installed with: sudo apt install python-pip 安裝pip fxd0…

jquery 獲取 outerHtml 包含當前節點本身的代碼

在開發過程中&#xff0c;jQuery.html() 是獲取當前節點下的html代碼&#xff0c;并不包含當前節點本身的代碼&#xff0c;然后我們有時候確需要&#xff0c;找遍jQuery api文檔也沒有任何方法可以拿到。 看到有的人通過parent().html()&#xff0c;如果當前元素沒有兄弟元素還…

擁塞控制中的開環和閉環控制

擁塞控制是很難設計的&#xff0c;因為它是一個動態的問題&#xff0c;許多情況下&#xff0c;甚至正式擁塞控制機制本身成為引起網絡性能惡化甚至死鎖的原因。從控制理論的角度來看擁塞控制這個問題&#xff0c;可以分為開環控制和閉環控制兩種方法。開環控制就是在設計網絡時…

c語言編寫一個菜單系統_一招教你,輕松解決C語言編寫一個正整數的所有因子!...

這個實例是一個能提高分析能力的實例&#xff0c;這個實例主要用到for語句&#xff0c;關鍵是如何確定其中變量的范圍。求一個正整數的所有因子先來看看編程結果演示&#xff1a;編程演示輸出結果編程如下:#include/*引用預處理命令&#xff0c;預處理包含stdio.h的頭文件*/mai…

【簡明筆記】循環條件的優化

[javascript] view plaincopy/* * 優化循環 */ //優化前 for(var i0; i < items.length; i){ //判斷條件&#xff1a;(1)i<items.length; (2)i<items.length true; process(items[i]); } //優化后 var count items.length; //把length屬性放在局…

ubuntu18.04安裝mysql數據庫

mysql安裝參考&#xff1a; https://www.cnblogs.com/opsprobe/p/9126864.html 文中寫的很詳細&#xff0c;但是未進行初始密碼的修改&#xff0c;初始密碼修改參考文章&#xff1a; https://blog.csdn.net/qq_38737992/article/details/81090373

第四次Scrum編碼沖刺!!!!

第四次Scrum編碼沖刺&#xff01;&#xff01;&#xff01;&#xff01; 一、總體任務&#xff1a; 本次沖刺是完成對圖書館管理系統的最后三個功能的實現------管理員對用戶授權、用戶注銷和用戶查詢 二、個人任務及完成情況&#xff1a; 本人本次的任務是實現對刪除用戶功能以…

Spring Cloud Edgware新特性之八:Zuul回退的改進

為什么80%的碼農都做不了架構師&#xff1f;>>> Spring Cloud Edgware對Hystrix回退的邏輯進行了一些改進。本文將信息探討新舊版本的回退操作&#xff0c;并分析的原因及改進后的優勢。 Dalston及更低版本 對于Dalston及更低版本&#xff0c;要想為Zuul提供回退&a…

因特網 以太網 互聯網的含義及區別

互聯網是Internet的意譯&#xff0c;因特網是Internet的音譯&#xff0c;兩者是等同的&#xff0c;是一個全世界范圍的廣域網。目前應用最為廣泛的一類局域網是總線局域網-以太網。以太網的核心技術是它的隨機爭用型介質訪問控制方法&#xff0c;即帶有沖突檢測的載波偵聽多路訪…

idea插件導出_Intellij IDEA 中我一直在用的幾個插件

提前聲明一下&#xff0c;今天這篇文章是在我家的那臺 Mac 機子上寫的&#xff0c;但是文中使用的快捷鍵還是主要針對于 Windows 平臺「由于我的大多數讀者在使用該系統&#xff0c;我是有多么愛你們&#xff5e;&#xff5e;&#xff5e;」。接上一篇《談談我與 Intellij IDEA…

打開.md格式文件的方式

我們平常偶爾會收到后綴為*.md的文件&#xff0c; md是簡稱&#xff0c;它的全名為MARKDOWN。MARKDOWN是一種標記語言軟件&#xff0c;下載安裝MarkdownPad2即可打開。 具體安裝參考文章&#xff1a;MarkdownPad2安裝漢化與注冊碼 https://blog.csdn.net/weixin_40612082/art…

吃透理財三句話人人都能成百萬富翁

財專家告訴我們&#xff1a;理財的最佳方式并非追求高超的金融投資技巧&#xff0c;只要你掌握正確的理財觀念&#xff0c;并且持之以恒&#xff0c;若干年之后——人人都能成為百萬富翁。我每月到企業舉辦一小時的免費“理財講座”&#xff0c;一直都很受員工們的歡迎。講座內…

Apache - Storm

一、Apache Storm Storm是一個分布式的&#xff0c;可靠的&#xff0c;容錯的數據流處理系統。Storm集群的輸入流由一個被稱作spout的組件管理&#xff0c;spout把數據傳遞給bolt&#xff0c;bolt要么把數據保存到某種存儲器&#xff0c;要么把數據傳遞給其它的bolt。一個Stor…

Python基礎學習五 內置模塊

time 模塊 1 >>> import time2 >>> time.time()3 1491064723.8086694 >>> # time.time()返回當前時間的時間戳timestamp(定義為從格林威治時間1970年01月01日00時00分00秒起至現在的總秒數)的方法,無參數5 >>> time.asctime()6 Sun Apr 2…

如何在windows上將本地項目上傳到Github

詳細步驟參考&#xff1a; https://www.cnblogs.com/smfx1314/p/8426115.html 感謝作者分享&#xff01;

Sublime Text3使用Package Control 報錯There Are No Packages Available For Installation

在使用sublime時&#xff0c;有時候我們希望將代碼復制出來后仍然是高亮顯示&#xff0c;這樣我們便需要安裝SublimeHighLight插件&#xff0c;在安裝SublimeHighLight插件之前&#xff0c;我們應該先安裝Package Control插件&#xff01; 1、Package Control插件作用&#xff…