Ruby語言簡明入門與提高

henglau 8年前發布 | 36K 次閱讀 Ruby開發

來自: http://segmentfault.com/a/1190000004349506


rails請參考我寫的簡明Ruby系列:rails簡明實用入門指南

本書其他版本:

作者:chenge

聯系方式:

第一章 簡介

內容簡介

目標讀者:

  • 初次編程者

  • 初次學習Ruby的程序員

Ruby是適合于初學者的,即使是從未寫過程序的人來學,我相信初級部分一天就能學完。

為了幫助你學習更輕松些,我盡量選擇了簡單的內容。

通過瀏覽目錄,就知道我選擇了一些什么內容。初級我選擇了三組共四個概念,本書定位初學,所以中高級只是附帶介紹一下,選擇了介紹單元測試和DSL。這些內容,特別是初級部分,是我根據我的自學經驗,認為對初學者比較重要的核心的內容,不是說別的Array、Hash等不重要,只是為了簡明和快速學習,做了取舍。

有了這個基礎后,遇到不懂的,查閱下參考書就可以了。

我會不定期地修訂,增加我認為不錯的材料。

為什么寫這個小書

我希望用最簡潔的方式介紹Ruby的要點。

我本身是程序員,05年左右接觸Ruby,我是看鎬頭書入門的,對Ruby的印象不錯,但還是覺得不得要領,覺得有些復雜。又過了幾年,讀了幾本參考書才似乎理解了一些。

類似的書一般都涉及很多細節,反而讓主干不清晰,初學者往往不得要領,學習負擔重。如果一開始讀到本書這樣的介紹,我認為是有幫助的。

當然這只是入門書,修行要看你自己了。

學習計劃

建議你分兩步,初級體驗一天,中級1-6個月。

  1. 先學習初初級部分,感性認識和培養興趣,參考時間一天。

  2. 有興趣繼續的話學中級,可自選書籍或者參考下面的中英文電子版,參考時間1-6個月。

實驗

可以網上實驗,或者本機實驗。

網上實驗

最簡單的,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

Part 8- Blocks

Part 9- Classes and Objects

油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,[]是數組。塊可以看成獨立的函數,與塊前面的方法協同工作,就像二人轉。

參考:

參考部分來自網上的一些資料,有些是英文的,難度大一些,初學可以跳過,等有需要再看

5分鐘block(英文)

結束語:塊無處不在,兩種形式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的代碼。

參考:

看懂這個視頻(英文版)相當于學會了一半的 Ruby

結束語:模塊是組織代碼的基本方式。

第五章 中級:單元測試

開始本章學習。

補充說明一下:如果你不是很有經驗的話,看這個單元測試例子會有困難。可以結合這個例子和簡介里提到的基礎教程來學習。

轉:不懂Ruby的程序員,如何快速讀懂Ruby代碼

關系示意圖如下

--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代碼就比較親切了。

      101 Ruby Code Factoids

      實例參考這篇英文博客
      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的起點,再見!

        [請我喝一杯,手機支付寶]

        聯系方式:見目錄部分

 本文由用戶 henglau 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!