重要說(shuō)明,推薦學(xué)習(xí)Elixir語(yǔ)言,很容易學(xué)習(xí),期待它把函數(shù)式編程帶入主流開(kāi)發(fā)影暴。這個(gè)文檔以后不再更新了。2016-11-29
Ruby語(yǔ)言簡(jiǎn)明入門(mén)與提高
作者:chenge
聯(lián)系方式:
- 郵件:chenge3k at qq.com
- chenge微博談
目錄
<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è)月歧胁。
- 先學(xué)習(xí)初初級(jí)部分,感性認(rèn)識(shí)和培養(yǎng)興趣厉碟,參考時(shí)間一天喊巍。
- 有興趣繼續(xù)的話(huà)學(xué)中級(jí),可自選書(shū)籍或者參考下面的中英文電子版箍鼓,參考時(shí)間1-6個(gè)月崭参。
-
Ruby in 100 Minutes(有目錄,簡(jiǎn)明扼要款咖,介紹了11個(gè)常用概念何暮,包括有些另類(lèi)的Symbol類(lèi)型,:hello)
100分鐘的紅寶石(有道翻譯的中文版铐殃,翻譯效果不錯(cuò)) - 20分鐘體驗(yàn) Ruby
實(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
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ò)报咳,等有需要再看
結(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的代碼。
參考:
結(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>
<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ī)支付寶]
聯(lián)系方式:見(jiàn)目錄前