LoginSignup
0
0

More than 5 years have passed since last update.

練習寫個簡單的 Block

Posted at

碰到 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

過程

  1. 從 method 裡面傳個值 1 出來
  2. do ... end scope 裡面用 value 把這個參數接住
  3. 對 value + 1 ,因為是在 scope 裡面的最後一行會自動回傳
  4. 在 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?

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0