Ruby語言簡明入門與提升

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

做者:chengenode

聯繫方式:linux

分割線

第一章 簡介

內容簡介

目標讀者:程序員

  • 初次編程者
  • 初次學習Ruby的程序員

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

爲了幫助你學習更輕鬆些,我儘可能選擇了簡單的內容。面試

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

有了這個基礎後,遇到不懂的,查閱下參考書就能夠了。segmentfault

我會不按期地修訂,增長我認爲不錯的材料。windows

爲何寫這個小書

我但願用最簡潔的方式介紹Ruby的要點。數組

我自己是程序員,05年左右接觸Ruby,我是看鎬頭書入門的,對Ruby的印象不錯,但仍是以爲不得要領,以爲有些複雜。又過了幾年,讀了幾本參考書才彷佛理解了一些。

相似的書通常都涉及不少細節,反而讓主幹不清晰,初學者每每不得要領,學習負擔重。若是一開始讀到本書這樣的介紹,我認爲是有幫助的。

固然這只是入門書,修行要看你本身了。

學習計劃

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

  1. 先學習初初級部分,感性認識和培養興趣,參考時間一天。
  2. 有興趣繼續的話學中級,可自選書籍或者參考下面的中英文電子版,參考時間1-6個月。
  • Ruby in 100 Minutes(有目錄,簡明扼要,介紹了11個經常使用概念,包括有些另類的Symbol類型,:hello)

100分鐘的紅寶石(有道翻譯的中文版,翻譯效果不錯)

實驗

能夠網上實驗,或者本機實驗。

網上實驗

最簡單的,jser在線運行, 或者去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部分,大約一個小時。原youtube網址

我搬運了三個部分到百度,百度雲盤
Part 1- Getting started

Part 8- Blocks

Part 9- Classes and Objects

youtube有字幕,視頻聽不懂問題也不大,看演示過程就能夠了,還能夠練習英語,一箭雙鵰。

結束語:類和對象是最基本的。

分割線

第三章 塊

塊是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不用測試。
#引用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

簡單解釋下例子:

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 元編程》讀書筆記

101 Ruby Code Factoids

固然本書主要仍是入門書,更多的請參考《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語言描述》

路線圖

  • 本書屬於中間區域,入門書籍。

books

帶有連接的圖:https://www.learneroo.com/mod...

原圖:http://www.zappable.com/tag/c...

告別:

但願這本小書成爲你學習Ruby的起點,再見!

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

請我喝一杯,手機支付寶

聯繫方式:見目錄部分

相關文章
相關標籤/搜索