Ruby Block 理解
ruby中的block是比較難理解的一個概念,但是如果你懂得了什麼是回撥函式。那麼其實block的作用和回撥函式是一樣的。
我們先看一個沒帶引數的例子:
def say
yield
yield
end
我們先看單行的block。
say{puts("hello world")}
輸出的結果為:
hello world
hello world
block就象是一個沒有名稱的函式,執行到yield就呼叫block中的程式碼執行。
如果block是多行的,那麼就應該是這樣:
say do
puts("hello world")
puts("ni hao");
end
輸出結果:
hello world
ni hao
hello world
ni hao
每一個yield就是執行完block中所有的程式碼。
接下去我們看看帶有引數的block。
def add
puts(yield(1,2))
puts(yield(5,6))
end
add{|a,b| a+b}
輸出的結果:
3
11
block中的a,b就是這個block的引數,yield(1,3)就是呼叫這個block,並把1,3賦給a和b。
Ruby中方法和塊的關係就是一對協同例程,互相轉換程式的控制執行權,當方法中遇到yield語句,就轉到塊裡執行,塊執行完畢後,將返回到方法體中,繼續執行方法yield語句後面的程式碼。yield可以帶引數到塊中,塊也是有返回值,返回到方法體中。
方法和塊的一個作用,就是實現了操作和處理的分離,比如:File.open {...},File.open負責開啟檔案(即是操作),然後呢,如何處理呢,交給了塊。Ruby創立者這種思想,深刻地理解了,如何更貼近自然的語 言,更加深入的物件導向,更加的靈活(比如Array.each方法,只是負責取出陣列中的每個元素,具體要幹什麼,塊可以自由的設定)。
方法可以通過 if 語句加上 block_given? 條件,來判斷方法在執行的時候,是否有塊在後面,如果有,就執行if語句,再根據yield呼叫塊,如果後面沒有塊,就繼續執行if後面的程式碼。
塊只是接過方法交過來的執行權,繼續執行塊的程式碼,它不是一個結構,不是迴圈。
下面是個例子,File.open方法後跟塊的時候,可以在結束塊時,自動關閉檔案,完善了File.new方法。
class File
def File.open(*args) #將File.new方法需要的一籃子引數放到*args陣列裡
r=f=File.new(*args) #將陣列*args分散開並傳給File.new ,為什麼這裡要把控制程式碼給兩個值?
if block_given? #block_given?方法屬於Kernel模組,而此模組包含在Object中,
begin #定義一個begin結構,以便即使有錯誤,也可以執行ensure語句
r=yiled f # f傳遞到塊中,r接受了塊的返回值。
ensure
f.close #不管有沒有錯誤,都會在退出塊時,關閉檔案,關閉檔案,
end #可以確保快取的東西都寫入檔案,並且可以交出佔用的資源。
end
return r #如果不存在塊,直接返回r
end
end
相關文章
- 理解 Ruby 裡的 blockBloC
- [讀書筆記] Ruby 中的 Block 和 Iterator筆記BloC
- 深入理解Block之Block的型別BloC型別
- 理解 Block 實現原理BloC
- block/extent/segment的理解BloC
- ruby on rails筆記和理解AI筆記
- 【Ruby on Rails全棧課程】2.7 塊(Block)和迭代器AI全棧BloC
- Block 我所理解的回撥BloC
- ruby中迭代器列舉器的理解
- oracle 塊延遲清除(delayed block cleanout) 理解OracleBloC
- 讀<<programming ruby>> 7.6節 flip-flop 理解
- Ruby:Hash(雜湊)學習,你可以理解為字典
- Objective-C基礎之四(深入理解Block)ObjectBloC
- ruby關於flip-flop理解上一個注意點
- __weak與__block區別,深層理解兩者區別BloC
- 對'Consistent Gets',''Physical Reads'和'DB Block Gets'的理解BloC
- consistent gets、db block gets的簡單精闢的理解BloC
- Ruby 札記 - 淺嘗 Ruby 特性
- Swift與OC真正去理解Block解決迴圈引用的技巧SwiftBloC
- Ruby 札記 - 淺談和配置 Ruby
- Ruby己死?NodeJS能否取代Ruby?NodeJS
- Block學習①--block的本質BloC
- 解析Ruby
- Ruby 3.0.0釋出:Ruby3將比Ruby2快3倍
- 對'Consistent Gets',''Physical Reads'和'DB Block Gets'的理解和解釋BloC
- rails on ruby,ruby on rails 之程式碼塊(二)AI
- Ruby Profiler詳解之ruby-prof(I)
- iOS中Block的用法,示例,應用場景,與底層原理解析(這可能是最詳細的Block解析)iOSBloC
- oracle block phisical address to block#OracleBloC
- iOS block巢狀block中weakify的使用iOSBloC巢狀
- Unused Block Compression和Null Block CompressionBloCNull
- Block學習②--block的變數捕獲BloC變數
- Ruby Struct EqualStruct
- Ruby loop 方法OOP
- JavaScript and Ruby in ABAPJavaScript
- Ruby初學
- Ruby語言
- Ruby Code & Style