Ruby語言簡明入門與提高
來自: http://segmentfault.com/a/1190000004349506
rails請參考我寫的簡明Ruby系列:rails簡明實用入門指南
本書其他版本:
csdn version(有目錄)
作者:chenge
聯系方式:
郵件:chenge3k at qq.com
第一章 簡介
內容簡介
目標讀者:
初次編程者
初次學習Ruby的程序員
Ruby是適合于初學者的,即使是從未寫過程序的人來學,我相信初級部分一天就能學完。
為了幫助你學習更輕松些,我盡量選擇了簡單的內容。
通過瀏覽目錄,就知道我選擇了一些什么內容。初級我選擇了三組共四個概念,本書定位初學,所以中高級只是附帶介紹一下,選擇了介紹單元測試和DSL。這些內容,特別是初級部分,是我根據我的自學經驗,認為對初學者比較重要的核心的內容,不是說別的Array、Hash等不重要,只是為了簡明和快速學習,做了取舍。
有了這個基礎后,遇到不懂的,查閱下參考書就可以了。
我會不定期地修訂,增加我認為不錯的材料。
為什么寫這個小書
我希望用最簡潔的方式介紹Ruby的要點。
我本身是程序員,05年左右接觸Ruby,我是看鎬頭書入門的,對Ruby的印象不錯,但還是覺得不得要領,覺得有些復雜。又過了幾年,讀了幾本參考書才似乎理解了一些。
類似的書一般都涉及很多細節,反而讓主干不清晰,初學者往往不得要領,學習負擔重。如果一開始讀到本書這樣的介紹,我認為是有幫助的。
當然這只是入門書,修行要看你自己了。
學習計劃
建議你分兩步,初級體驗一天,中級1-6個月。
先學習初初級部分,感性認識和培養興趣,參考時間一天。
有興趣繼續的話學中級,可自選書籍或者參考下面的中英文電子版,參考時間1-6個月。
Ruby in 100 Minutes(有目錄,簡明扼要,介紹了11個常用概念,包括有些另類的Symbol類型,:hello)
100分鐘的紅寶石(有道翻譯的中文版,翻譯效果不錯)
實驗
可以網上實驗,或者本機實驗。
網上實驗
最簡單的,codepad網站直接運行,代碼復制過去,選擇ruby.
另一種稍微復雜的方式,去實驗樓網站,linux環境下運行看結果,可以在終端Terminal里運行:irb,就可以與ruby對話了。
本機實驗
linux和蘋果上一般都安裝好了ruby,運行ruby -v可以看是否安裝了。
如果沒有的話,請參考wiki自行安裝Ruby。windows上也很容易安裝的。
可以嘗試這種現代的交互式自學方式。
學習社區
http://exercism.io
是很好的英文的互動編程社區。
版本變更
變更:
2015-3-26:高級部分改用了DSL的例子,更實用也更容易理解。
2015-1-26:改寫單元測試,更容易理解
2015-1-23:增加了“面試準備系列”
讀者反饋
希望你寫下閱讀的感受和改進意見。
第二章 初級:類和對象
Ruby的基本設計原則
歡迎開啟有趣的Ruby之旅!
Ruby語言的作者Matz在《代碼之美》一書中講述了他的設計思想,就是簡潔、保守、簡單、靈活性,以及平衡性等五大原則。
puts 'hello world'
例子中那一行代碼,可以說明簡潔、保守(puts繼承自C語言)和簡單。靈活性和平衡性需要在更復雜的代碼中可以體會到。
類和對象
分類是符合人的思維的。比如人類,每個人就是人類的一個實例,約定都翻譯成對象。
#注釋:定義類 class Person def initialize(name) @name = name end #定義方法 def show_name puts @name end end #創建對象 zhao = Person.new 'zhao yun ' qian = Person.new 'qian wei ' #調用方法 zhao.show_name qian.show_name
簡單解釋一下:
class是定義類Person,注意用大寫
def定義了方法
@name是實例變量的寫法
new是生成對象,兩個new就生成了兩個對象,會調用initialize這個構造方法,只能用這個名字,name是參數
最后兩句是調用方法show_name, puts的意思就是顯示一段文字
如果你第一次編程,也許你對這些術語還有些陌生,不要緊,多看幾次,慢慢就會熟悉起來了。
參考資料,初次閱讀可以跳過,或者選看感興趣的部分。
英文視頻:Learn to program using Ruby
共9部分,大約一個小時。原油Tube網址
我搬運了三個部分到百度,百度云盤
Part 1- Getting started油Tube有字幕,視頻聽不懂問題也不大,看演示過程就可以了,還可以練習英語,一舉兩得。
結束語:類和對象是最基本的。
第三章 塊
塊是ruby的特色。
3.times do puts 'hello world' end 3.times { puts 'one line hi' } people = ['zhao', 'qian'] people.each do |x| puts x end
以上就是兩種塊的寫法,第一個是無參數,單行的話用括號。后一個帶參數x,[]是數組。塊可以看成獨立的函數,與塊前面的方法協同工作,就像二人轉。
參考:
參考部分來自網上的一些資料,有些是英文的,難度大一些,初學可以跳過,等有需要再看
結束語:塊無處不在,兩種形式do和{}
第四章 模塊
模塊也是Ruby的特色。
module Show def show_msg puts self.class end Pi = 3.14 end class Person include Show end class Desk include Show end Pi = 2 puts Show::Pi #注釋:3.14 Person.new.show_msg #Person Desk.new.show_msg #Desk
主要有兩個作用,一個是作為命名空間,避免名字沖突,比如例子中的Pi。另一個是共享代碼,例子中Person和Desk共享Show的代碼。
參考:
結束語:模塊是組織代碼的基本方式。
第五章 中級:單元測試
開始本章學習。
補充說明一下:如果你不是很有經驗的話,看這個單元測試例子會有困難。可以結合這個例子和簡介里提到的基礎教程來學習。
關系示意圖如下
--incoming————》測試對象---outgoing---》依賴對象
主要包括測試對象和依賴對象。
incoming測試狀態。
-
outgoing分command和query,command就是有輸出,query沒有輸出。
outgoing command測試行為,用mock模擬對象。
outgoing query不用測試。
</ul> </li> </ul>
#引用minitest gem,可以自己安裝: gem install minitest require "minitest/autorun"
class Calc def initialize(logger=nil) @logger = logger end
def add(a, b) a + b end
def add2(a, b) @logger.log "add2 #{a}, #{b}" a + b end end
< 是繼承
class TestCalc < MiniTest::Test
def test_add calc = Calc.new assert calc.add(2, 5) == 7 end
def test_add2 mock_logger = MiniTest::Mock.new mock_logger.expect(:log, nil, ['add2 2, 5'])
calc = Calc.new(mock_logger) assert calc.add2(2, 5) == 7 mock_logger.verify
end end</pre>
簡單解釋下例子:
Calc是被測試的功能代碼,TestCalc是測試代碼,測試的目的是驗證功能代碼是否正確。
兩個測試方法,其中test_add比較簡單。
第二個test_add2用到了mock模擬對象,稍微復雜一些。除了驗證基本的計算外,還驗證了是否執行了log操作。操作如下
先運行一次,正確的話會顯示兩個點:‘..’。
可以故意把Calc改錯,比如改為a-b, 或者把那個log代碼注釋掉,再運行看是否能測試出來。
練習題
寫一個減法功能和測試
寫一個帶有日志功能的減法和測試
自己構思一個小的功能和測試
參考:
面試準備系列(英文版)
可以作為學習的參考。結束語:單元測試是質量的保證。
第六章 高級:元編程和DSL
DSL是特定領域語言,rails里有很多例子,rake, rspec, migration等等。下面這個例子演示了原理,主要用了method_missing。學完后,再看那些rails代碼就比較親切了。
實例參考這篇英文博客
Metaprogramming in Ruby: Part 1
Metaprogramming in Ruby: Part 2
《Ruby 元編程》讀書筆記當然本書主要還是入門書,更多的請參考《Ruby元編程》這本書。
附錄 學習Ruby的一些小竅門
必備工具
irb是自帶的.
pry更好用一些,可以這樣:
ls Object
像目錄操作一樣。
編輯器
sublime和開源的atom都不錯。
SublimeCodeIntel插件可以提供Ruby代碼提示。查祖先
1.9.3-p545 :023 > String.ancestors => [String, Comparable, Object, Kernel, BasicObject]
String的前面有四個上級
過濾方法
Ruby的方法非常多,以至于不得不用grep了。
1.9.3-p545 :049 > [].methods.grep /^me/ => [:member?, :methods, :method]
查方法來源
1.9.3-p545 :018 > {}.method :select => #<Method: Hash#select> 1.9.3-p545 :019 > {}.method :reduce => #<Method: Hash(Enumerable)#reduce>
method方法可以實現。
文檔
如果找明確的方法,可以用ri,方便快捷。
ri String.sub
不過這種方式似乎不好用。有一個專門的dash軟件,很好用。似乎是只支持mac。
對象模型
各種對象語言的原理是類似的,但是內部實現模型是不一樣的。Ruby用起來簡單,內部很復雜的。
當你感覺Ruby好用的時候,其實應該感謝Matz的工作。
Kernel模塊是核心,很多重要的方法都在里面。推薦看《Ruby元編程》,書中有詳細介紹。
推薦書籍網站
入門
Ruby中文官網
《笨辦法學Ruby》
提高
《Eloquent Ruby》
《松本行弘的程序世界》(教主作品,粉絲必讀)
《Ruby元編程》
《面向對象設計實踐指南:Ruby語言描述》
</ul>
本書屬于中間區域,入門書籍。
路線圖
帶有鏈接的圖:https://www.learneroo.com/modules/61/nodes/337
原圖:http://www.zappable.com/tag/chart/
告別:
希望這本小書成為你學習Ruby的起點,再見!
[請我喝一杯,手機支付寶]
聯系方式:見目錄部分