Ruby map with if next
混用 map if next時造成的bug 今天文章好像寫太多了品質不佳,但這又最重要,決定簡單扼要講
下午都在抓一個奇怪的bug
發現array 經過一個map後會變成空陣列
抓來抓去發現是這個:
["one", 2, "three"].map {|s|
if s.is_a? String
next
end
s*2
}
原本期望這種結果
["one", 4, "three"]
但實際上,map是把整個block執行的結果配到對應的陣列中 next會把剩下的block跳過,結果變成沒有回傳值 所以真正的結果是:
[nil, 4, nil]
如果想要期待的結果,應該在next後加上你想要填的東西
["one", 2, "three"].map {|s|
if s.is_a? String
next s
end
s*2
}
這樣會正確得到:
["one", 4, "three"]
更多例子:
[1, 2, 3].map {|n| next if n.even?; n*2} # => [2, nil, 6]
[1, 2, 3].map {|n| next nil if n.even?; n*2} # => [2, nil, 6]
[1, 2, 3].map {|n| next "skipped" if n.even?; n*2} # => [2, "skipped", 6]
留言