[英]Why Ruby .map doesn't work with if statement
我在.map
使用if
獲得了意外的結果:
a = [1,2,3,4,5]
a.map do |item|
item + 10 if item < 4
item + 9 if item > 4
end
我預期: [11,12,13,13,14]
...但是我卻得到: [nil, nil, nil, nil, 14]
為什么?
其次,我知道最后一個表達式是方法的返回值那么if語句是否正確? 最后一個表達式是if語句的返回值。
謝謝!
對於小於4的元素, item + 10 if item < 4
確實返回期望值,則item + 10 if item < 4
。 但是隨后第二條語句執行,並且map返回該值。 對於項<4, item + 9 if item > 4
返回nil
。
您的地圖應如下所示:
a.map do |item|
if item < 4 then
item + 10
else
item + 9
end
end
如果項== 4,該怎么辦?
我們可以通過將塊作為方法來演示您遇到的問題:
def test_map(item)
item + 10 if item < 4
item + 9 if item > 4
end
test_map 3
# => nil
test_map 5
# => 14
這里會發生什么? 對於item=3
,第一行返回13
,但這不是方法返回的內容-該方法繼續到下一行,其評估為nil
...
為了根據多個條件返回單個值,可以使用if..elsif..else
構造,或case..when
構造:
def test_map2(item)
case item
when 0..4
item + 10
when 4..10
item + 9
else
item
end
end
test_map2 3
# => 13
test_map2 5
# => 14
case..when
返回第一個 when
子句之后的塊,該子句的值為true。
這是因為,如果使用map
,則會創建一個數組,其中包含從傳遞給map
方法的塊中求值的值。 因此,在這種情況下, item + 9 if item > 4
, item + 9 if item > 4
在前4個元素中求值的最后一個值為item + 9 if item > 4
,它返回nil
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.