iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 5
1
自我挑戰組

Ruby菜鳥村村民遊記系列 第 5

遊記ep.5 DoEnd 與 { } 的Ruby村

使用過Ruby方法的村民們一定都知道,舉例來說像是 .map .select .reduce 等方法
後面都會銜接一段 block, block內部會編寫一些邏輯來達到我們希望得到的目的。

2.6.3 :001 > a = [1,2,3,4,5]
 => [1, 2, 3, 4, 5]
2.6.3 :002 > a.select{|x| x < 5}
 => [1, 2, 3, 4]
2.6.3 :003 > a.select do |x|
2.6.3 :004 >     x < 5
2.6.3 :005?>   end
 => [1, 2, 3, 4]

而block的寫法可以使用 do end 或 {} 兩種得到一樣的結果。
一般對我來說,若是可以一行寫完的會選擇使用{},
若遇上比較複雜的判斷就會使用 do end的搭配。

但,難道Ruby村村長是因為無聊才創造出兩種不同寫法但卻完全沒有特異之處嗎?
今天我們就是想討論這個,
兩者的寫法雖大抵情況下可以得到相同的情況,但還是有例外的情況,
那,究竟是差在哪裡呢?
我們先來看看以下程式碼:

2.6.3 :001 > a = [1,2,3,4,5]
 => [1, 2, 3, 4, 5]
2.6.3 :002 > p a.map{|x| x * 2}
[2, 4, 6, 8, 10]
 => [2, 4, 6, 8, 10]
2.6.3 :003 > p a.map do |x| x * 2 end
#<Enumerator: [1, 2, 3, 4, 5]:map>
 => #<Enumerator: [1, 2, 3, 4, 5]:map>

咦,不是說會得到一樣的答案嗎?
原來, do end 跟 {}之間的差異,在於優先順序上會有不同,
簡單來說 今天我們使用p來印出結果的時候
{}看起來像是 p(a.map{|x| x * 2}),待()裡面的運算完成後,才印出得到[2,4,6,8,10];
相反的,do end的情況比較像是 p(a.map)do |x| x * 2 end,
p 先把 a 給印出來了,所以我們得到了[1,2,3,4,5]。
以上,就是今天介紹 do end 與 {} 的差異。


上一篇
遊記ep.4 處處是危機的Ruby村
下一篇
遊記ep.6 Include?!Extend!的Ruby村
系列文
Ruby菜鳥村村民遊記30

尚未有邦友留言

立即登入留言