Ruby簡(jiǎn)明入門(mén)和提高

重要說(shuō)明,推薦學(xué)習(xí)Elixir語(yǔ)言,很容易學(xué)習(xí),期待它把函數(shù)式編程帶入主流開(kāi)發(fā)影暴。這個(gè)文檔以后不再更新了。2016-11-29

Ruby語(yǔ)言簡(jiǎn)明入門(mén)與提高

作者:chenge

聯(lián)系方式:

目錄

第一章 簡(jiǎn)介

第二章 初級(jí):類(lèi)和對(duì)象

第三章 塊

第四章 模塊

第五章 中級(jí):?jiǎn)卧獪y(cè)試


<h1 id='c1'>第一章 簡(jiǎn)介</h1>


內(nèi)容簡(jiǎn)介

目標(biāo)讀者:

  • 初次編程者
  • 初次學(xué)習(xí)Ruby的程序員

Ruby是適合于初學(xué)者的探赫,即使是從未寫(xiě)過(guò)程序的人來(lái)學(xué)型宙,我相信初級(jí)部分一天就能學(xué)完。

為了幫助你學(xué)習(xí)更輕松些期吓,我盡量選擇了簡(jiǎn)單的內(nèi)容早歇。

通過(guò)瀏覽目錄,就知道我選擇了一些什么內(nèi)容讨勤。初級(jí)我選擇了三組共四個(gè)概念箭跳,本書(shū)定位初學(xué),所以中高級(jí)只是附帶介紹一下潭千,選擇了介紹單元測(cè)試和DSL谱姓。這些內(nèi)容,特別是初級(jí)部分刨晴,是我根據(jù)我的自學(xué)經(jīng)驗(yàn)屉来,認(rèn)為對(duì)初學(xué)者比較重要的核心的內(nèi)容,不是說(shuō)別的Array狈癞、Hash等不重要茄靠,只是為了簡(jiǎn)明和快速學(xué)習(xí),做了取舍蝶桶。

有了這個(gè)基礎(chǔ)后慨绳,遇到不懂的,查閱下參考書(shū)就可以了真竖。

我會(huì)不定期地修訂脐雪,增加我認(rèn)為不錯(cuò)的材料。

為什么寫(xiě)這個(gè)小書(shū)

我希望用最簡(jiǎn)潔的方式介紹Ruby的要點(diǎn)恢共。

我本身是程序員战秋,05年左右接觸Ruby,我是看鎬頭書(shū)入門(mén)的讨韭,對(duì)Ruby的印象不錯(cuò)脂信,但還是覺(jué)得不得要領(lǐng)癣蟋,覺(jué)得有些復(fù)雜。又過(guò)了幾年狰闪,讀了幾本參考書(shū)才似乎理解了一些梢薪。

類(lèi)似的書(shū)一般都涉及很多細(xì)節(jié),反而讓主干不清晰尝哆,初學(xué)者往往不得要領(lǐng),學(xué)習(xí)負(fù)擔(dān)重甜攀。如果一開(kāi)始讀到本書(shū)這樣的介紹秋泄,我認(rèn)為是有幫助的。

當(dāng)然這只是入門(mén)書(shū)规阀,修行要看你自己了恒序。

學(xué)習(xí)計(jì)劃

建議你分兩步,初級(jí)體驗(yàn)一天谁撼,中級(jí)1-6個(gè)月歧胁。

  1. 先學(xué)習(xí)初初級(jí)部分,感性認(rèn)識(shí)和培養(yǎng)興趣厉碟,參考時(shí)間一天喊巍。
  2. 有興趣繼續(xù)的話(huà)學(xué)中級(jí),可自選書(shū)籍或者參考下面的中英文電子版箍鼓,參考時(shí)間1-6個(gè)月崭参。

實(shí)驗(yàn)

可以網(wǎng)上實(shí)驗(yàn)海洼,或者本機(jī)實(shí)驗(yàn)。

網(wǎng)上實(shí)驗(yàn)

最簡(jiǎn)單的富腊,codepad網(wǎng)站直接運(yùn)行坏逢,代碼復(fù)制過(guò)去,選擇ruby.

另一種稍微復(fù)雜的方式蟹肘,去實(shí)驗(yàn)樓網(wǎng)站词疼,linux環(huán)境下運(yùn)行看結(jié)果,可以在終端Terminal里運(yùn)行:irb帘腹,就可以與ruby對(duì)話(huà)了贰盗。

本機(jī)實(shí)驗(yàn)

linux和蘋(píng)果上一般都安裝好了ruby,運(yùn)行ruby -v可以看是否安裝了阳欲。
如果沒(méi)有的話(huà)舵盈,請(qǐng)參考wiki自行安裝Ruby陋率。windows上也很容易安裝的。

可以嘗試這種現(xiàn)代的交互式自學(xué)方式秽晚。

學(xué)習(xí)社區(qū)

http://exercism.io
是很好的英文的互動(dòng)編程社區(qū)瓦糟。

版本變更

變更:

2015-3-26:高級(jí)部分改用了DSL的例子,更實(shí)用也更容易理解赴蝇。

2015-1-26:改寫(xiě)單元測(cè)試菩浙,更容易理解

2015-1-23:增加了“面試準(zhǔn)備系列”

讀者反饋

希望你寫(xiě)下閱讀的感受和改進(jìn)意見(jiàn)。

<h1 id='c2'>第二章 初級(jí):類(lèi)和對(duì)象</h1>

Ruby的基本設(shè)計(jì)原則

歡迎開(kāi)啟有趣的Ruby之旅!

Ruby語(yǔ)言的作者M(jìn)atz在《代碼之美》一書(shū)中講述了他的設(shè)計(jì)思想句伶,就是簡(jiǎn)潔劲蜻、保守、簡(jiǎn)單考余、靈活性先嬉,以及平衡性等五大原則。

    puts 'hello world'

例子中那一行代碼楚堤,可以說(shuō)明簡(jiǎn)潔疫蔓、保守(puts繼承自C語(yǔ)言)和簡(jiǎn)單。靈活性和平衡性需要在更復(fù)雜的代碼中可以體會(huì)到身冬。

類(lèi)和對(duì)象

分類(lèi)是符合人的思維的衅胀。比如人類(lèi),每個(gè)人就是人類(lèi)的一個(gè)實(shí)例酥筝,約定都翻譯成對(duì)象拗小。

    #注釋?zhuān)憾x類(lèi)
    class Person
      def initialize(name)
         @name = name
      end

      #定義方法
      def show_name
        puts @name
      end
    end

    #創(chuàng)建對(duì)象
    zhao = Person.new 'zhao yun ' 
    qian = Person.new 'qian jin '
    
    #調(diào)用方法
    zhao.show_name
    qian.show_name

簡(jiǎn)單解釋一下:

  • class是定義類(lèi)Person,注意用大寫(xiě)
  • def定義了方法
  • @name是實(shí)例變量的寫(xiě)法
  • new是生成對(duì)象樱哼,兩個(gè)new就生成了兩個(gè)對(duì)象哀九,會(huì)調(diào)用initialize這個(gè)構(gòu)造方法,只能用這個(gè)名字搅幅,name是參數(shù)
  • 最后兩句是調(diào)用方法show_name, puts的意思就是顯示一段文字

如果你第一次編程阅束,也許你對(duì)這些術(shù)語(yǔ)還有些陌生,不要緊茄唐,多看幾次息裸,慢慢就會(huì)熟悉起來(lái)了。

參考資料沪编,初次閱讀可以跳過(guò)呼盆,或者選看感興趣的部分。

英文視頻教程

Learn to program using Ruby

共9部分蚁廓,大約一個(gè)小時(shí)访圃。原youtube網(wǎng)址

我搬運(yùn)了三個(gè)部分到百度,百度云盤(pán)
Part 1- Getting started

Part 8- Blocks

Part 9- Classes and Objects

youtube有字幕相嵌,視頻聽(tīng)不懂問(wèn)題也不大腿时,看演示過(guò)程就可以了况脆,還可以練習(xí)英語(yǔ),一舉兩得批糟。

結(jié)束語(yǔ):類(lèi)和對(duì)象是最基本的格了。

<h1 id='c3'>第三章 塊</h1>

塊是ruby的特色。

      3.times do
        puts 'hello world'
      end
      
      3.times { puts 'one line hi' }

      people = ['zhao', 'qian']
      
      people.each do |x|
        puts x
      end

以上就是兩種塊的寫(xiě)法徽鼎,第一個(gè)是無(wú)參數(shù)盛末,單行的話(huà)用括號(hào)。后一個(gè)帶參數(shù)x否淤,[]是數(shù)組满败。塊可以看成獨(dú)立的函數(shù),與塊前面的方法協(xié)同工作叹括,就像二人轉(zhuǎn)。

參考:

參考部分來(lái)自網(wǎng)上的一些資料宵荒,有些是英文的汁雷,難度大一些,初學(xué)可以跳過(guò)报咳,等有需要再看

5分鐘block(英文)

結(jié)束語(yǔ):塊無(wú)處不在侠讯,兩種形式do和{}

<h1 id='c4'>第四章 模塊</h1>

模塊也是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 #注釋?zhuān)?.14

    Person.new.show_msg #Person
    Desk.new.show_msg   #Desk

主要有兩個(gè)作用暑刃,一個(gè)是作為命名空間厢漩,避免名字沖突,比如例子中的Pi岩臣。另一個(gè)是共享代碼溜嗜,例子中Person和Desk共享Show的代碼。

參考:

看懂這個(gè)視頻(英文版)相當(dāng)于學(xué)會(huì)了一半的 Ruby

結(jié)束語(yǔ):模塊是組織代碼的基本方式架谎。

<h1 id='c5'>第五章 中級(jí):?jiǎn)卧獪y(cè)試</h1>

開(kāi)始本章學(xué)習(xí)炸宵。

補(bǔ)充說(shuō)明一下:如果你不是很有經(jīng)驗(yàn)的話(huà),看這個(gè)單元測(cè)試?yán)訒?huì)有困難谷扣⊥寥可以結(jié)合這個(gè)例子和簡(jiǎn)介里提到的基礎(chǔ)教程來(lái)學(xué)習(xí)。

關(guān)系示意圖如下

--incoming————》測(cè)試對(duì)象---outgoing---》依賴(lài)對(duì)象

主要包括測(cè)試對(duì)象和依賴(lài)對(duì)象会涎。

  • incoming測(cè)試狀態(tài)裹匙。

  • outgoing分command和query,command就是有輸出末秃,query沒(méi)有輸出概页。

    • outgoing command測(cè)試行為,用mock模擬對(duì)象练慕。
    • outgoing query不用測(cè)試绰沥。
 #引用minitest gem篱蝇,可以自己安裝: gem install minitest
require "minitest/autorun"

class Calc
  def initialize(logger)
    @logger = logger
  end

  def add(a, b)
    result = a + b
    r = @logger.log "add #{a}, #"
    result if r
  end
end

 # < 是繼承
class TestCalc < MiniTest::Test
  def test_add
    mock_logger = MiniTest::Mock.new
    #mock return true
    mock_logger.expect(:log, true, ['add 2, 5'])
    calc = Calc.new(mock_logger)
    assert calc.add(2, 5) == 7
    mock_logger.verify
  end
end

參考:
面試準(zhǔn)備系列(英文版)
可以作為學(xué)習(xí)的參考徽曲。

結(jié)束語(yǔ):?jiǎn)卧獪y(cè)試是質(zhì)量的保證零截。

<h1 id='c6'>第六章 高級(jí):元編程和DSL</h1>

DSL是特定領(lǐng)域語(yǔ)言,rails里有很多例子秃臣,rake, rspec, migration等等涧衙。下面這個(gè)例子演示了原理,主要用了method_missing奥此。學(xué)完后弧哎,再看那些rails代碼就比較親切了。

當(dāng)然本書(shū)主要還是入門(mén)書(shū)稚虎,更多的請(qǐng)參考《Ruby元編程》這本書(shū)撤嫩。

class FancyMarkup

  attr_accessor :indents, :html

  def initialize
    @indents = 0
    @html = ""
  end

  # Catch-all method to avoid creating methods
  # for each HTML element.
  def method_missing(m, *args, &block)
    tag(m, args, &block)
  end

  # The first method called when creating an
  # HTML document.
  def document(*args, &block)
    tag(:html, args, &block)
  end

  private

  # Create the HTML tag
  # @param (String|Symbol) HTML tag (ul, li, strong, etc...)
  # @param (Array) Can contain a String of text or a Hash of attributes
  # @param (Block) An optional block which will further nest HTML
  def tag(html_tag, args, &block)
    content = find_content(args)
    options = html_options(find_options(args))

    html << "\n#{indent}<#{html_tag}#{options}>#{content}"
    if block_given?
      @indents += 1
      instance_eval(&block)
      @indents -= 1
      html << "\n#{indent}"
    end
    html << "</#{html_tag}>"
  end

  # Searching the tag arguments, find the text/context element.
  def find_content(args)
    args.select{|arg| arg.is_a? String}.first || nil
  end

  # Searching the tag arguments, find the hash/attributes element
  def find_options(args)
    args.select{|arg| arg.is_a? Hash}.first || {}
  end

  # Indent output number of spaces
  def indent
    "  " * indents
  end

  # Build html options string from Hash
  def html_options(options)
    options.collect{|key, value|
      value = value.to_s.gsub('"', '\"')
      " #{key}=\"#{value}\""
    }.join("")
  end
end

output = FancyMarkup.new.document do
  body do
    div id: "container" do
      ul class: "pretty" do
        li "Item 1", class: :active
        li "Item 2"
      end
    end
  end
end
puts output

會(huì)得到這個(gè)結(jié)果:

<html>
  <body>
    <div id="container">
      <ul class="pretty">
        <li class="active">Item 1</li>
        <li>Item 2</li>
      </ul>
    </div>
  </body>
</html>

本實(shí)例英文原文

<h1 id='tips'>附錄 學(xué)習(xí)Ruby的一些小竅門(mén)</h1>

必備工具

irb

查祖先

1.9.3-p545 :023 > String.ancestors
=> [String, Comparable, Object, Kernel, BasicObject] 

String的前面有四個(gè)上級(jí)

過(guò)濾方法

Ruby的方法非常多,以至于不得不用grep了蠢终。

1.9.3-p545 :049 > [].methods.grep /^me/
=> [:member?, :methods, :method] 

查方法來(lái)源

1.9.3-p545 :018 > {}.method :select
 => #<Method: Hash#select> 
1.9.3-p545 :019 > {}.method :reduce
 => #<Method: Hash(Enumerable)#reduce> 

method方法可以實(shí)現(xiàn)序攘。

文檔

如果找明確的方法,可以用ri寻拂,方便快捷程奠。

ri String.sub

對(duì)象模型

各種對(duì)象語(yǔ)言的原理是類(lèi)似的,但是內(nèi)部實(shí)現(xiàn)模型是不一樣的祭钉。Ruby用起來(lái)簡(jiǎn)單瞄沙,內(nèi)部很復(fù)雜的。

當(dāng)你感覺(jué)Ruby好用的時(shí)候慌核,其實(shí)應(yīng)該感謝Matz的工作距境。

Kernel模塊是核心,很多重要的方法都在里面垮卓。推薦看《Ruby元編程》肮疗,書(shū)中有詳細(xì)介紹。

推薦書(shū)籍網(wǎng)站

入門(mén)

  • Ruby中文官網(wǎng)

  • 《笨辦法學(xué)Ruby》

提高

  • 《Eloquent Ruby》

  • 《Ruby元編程》

  • 《面向?qū)ο笤O(shè)計(jì)實(shí)踐指南:Ruby語(yǔ)言描述》

路線(xiàn)圖

  • 本書(shū)屬于中間區(qū)域扒接,入門(mén)書(shū)籍伪货。


帶有鏈接的圖:https://www.learneroo.com/modules/61/nodes/337

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

告別:


希望這本小書(shū)成為你學(xué)習(xí)Ruby的起點(diǎn),再見(jiàn)钾怔!

[請(qǐng)我喝一杯碱呼,手機(jī)支付寶]

請(qǐng)我喝一杯,手機(jī)支付寶
請(qǐng)我喝一杯宗侦,手機(jī)支付寶

聯(lián)系方式:見(jiàn)目錄前

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末愚臀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子矾利,更是在濱河造成了極大的恐慌姑裂,老刑警劉巖馋袜,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異舶斧,居然都是意外死亡欣鳖,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)茴厉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)泽台,“玉大人,你說(shuō)我怎么就攤上這事矾缓』晨幔” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵嗜闻,是天一觀(guān)的道長(zhǎng)蜕依。 經(jīng)常有香客問(wèn)我,道長(zhǎng)琉雳,這世上最難降的妖魔是什么样眠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮咐吼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘商佑。我一直安慰自己锯茄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布茶没。 她就那樣靜靜地躺著肌幽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抓半。 梳的紋絲不亂的頭發(fā)上喂急,一...
    開(kāi)封第一講書(shū)人閱讀 51,215評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音笛求,去河邊找鬼廊移。 笑死,一個(gè)胖子當(dāng)著我的面吹牛探入,可吹牛的內(nèi)容都是我干的狡孔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蜂嗽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼苗膝!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起植旧,我...
    開(kāi)封第一講書(shū)人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤辱揭,失蹤者是張志新(化名)和其女友劉穎离唐,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體问窃,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亥鬓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了泡躯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贮竟。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖较剃,靈堂內(nèi)的尸體忽然破棺而出咕别,到底是詐尸還是另有隱情,我是刑警寧澤写穴,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布惰拱,位于F島的核電站,受9級(jí)特大地震影響啊送,放射性物質(zhì)發(fā)生泄漏偿短。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一馋没、第九天 我趴在偏房一處隱蔽的房頂上張望昔逗。 院中可真熱鬧,春花似錦篷朵、人聲如沸勾怒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)笔链。三九已至,卻和暖如春腮猖,著一層夾襖步出監(jiān)牢的瞬間鉴扫,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工澈缺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坪创,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓姐赡,卻偏偏與公主長(zhǎng)得像误堡,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雏吭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一锁施、異同對(duì)比選擇1、Python和ruby的相同點(diǎn): * 都強(qiáng)調(diào)語(yǔ)法簡(jiǎn)單,都具有更一般的表達(dá)方式悉抵。python是縮...
    沃倫蓋茨閱讀 4,144評(píng)論 2 24
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,083評(píng)論 25 707
  • 前言:讓有需要的人看一眼,如果能得到一些自己需要的,我將倍感榮幸. 注意### 如果用storyBoard的map...
    Supermannnn閱讀 650評(píng)論 2 1
  • Maven實(shí)戰(zhàn)之聚合 聚合特性 Maven的聚合特性肩狂,指的是把項(xiàng)目中的各個(gè)模塊聚合在一起構(gòu)建,舉個(gè)例子來(lái)說(shuō)姥饰,有多個(gè)...
    顏洛濱閱讀 312評(píng)論 0 1
  • 英文原文:Java Memory Model作者:Jakob Jenkov譯者:張坤原文地址:http://ife...
    IT程序獅閱讀 607評(píng)論 0 5