碰到 ruby 裡面的 do ... end
這種程式碼片段,其中可以用 |x|
這樣用兩個 pipeline 的方式,傳入值。
例如
使用 ruby iterator - each
這個方法
[1, 2, 3].each do |item|
puts item
end
each
這個迭代器,就可以依序把陣列裡每個元素抓取出來,並透過 item
這個區域變數傳出來。
能這樣傳,就和 Objective-C 幾乎天天在用的 block 是一樣的囉
因為也被問到他到底怎麼傳出來的,所以就自己來寫一個 block 看看。
特性
- 一個 method 只能有一個 block ,而且是在 method 的最後面。
- 並非物件 - 他只是一個程式碼片段,
- 在原本的 method scope 中,用
yeild
把 block 的內容執行出來
來寫 method
定義 method
因此先來定義一個 method
def my_method_with_block
yeild
end
這時候執行這個 method
my_method_with_block do
end
這時候當然不會有什麼事情發生,下一步來傳入參數
從 method 傳入參數
現在來傳入一個字串,接著再執行 method 的時候,在 do ... end
裡面,把字串接到之後,再印出來。
def my_method_with_block
yield "In the Block"
end
my_method_with_block do |string|
puts string
end
執行後,就會印出 "In the Block" 字串
block 中 pipeline 中間的變數名稱則可以自由命名。
回傳值到 method
現在可以把值傳出去,那也可以把運算過後的結果,回傳回到 method 裡
def my_method_with_block
new_value = yield 1
puts new_value
end
my_method_with_block do |value|
value + 1
end
執行完之後,結果就會印出 2
過程
- 從 method 裡面傳個值
1
出來 - 在
do ... end
scope 裡面用 value 把這個參數接住 - 對 value + 1 ,因為是在 scope 裡面的最後一行會自動回傳
- 在 method 裡面,用 new_value 把值接下來並印出來
傳值的數量
最後就是傳值的數量,
在 do ... end
裡的 |value|
裡面可以放多個參數,如果取得的參數的數量,超過 method 傳進 do ... end
的數量,其餘的值就都會是 nil ;少於則沒有關係。
def my_method_with_block
yield 1
end
my_method_with_block do |value1, value2|
p value1
p value2
end
這時候的輸出就會是
1
nil
More Information
Ruby Blocks
What Is the Difference Between a Block, a Proc, and a Lambda in Ruby?