簡體   English   中英

為什么Ruby .map無法與if語句一起使用

[英]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 > 4item + 9 if item > 4在前4個元素中求值的最后一個值為item + 9 if item > 4 ,它返回nil

Ruby 2.7以上

現在有解決方案!

Ruby 2.7為此引入了filter_map 它是慣用語言和高性能,我希望它很快會成為標准。

例如:

numbers = [1, 2, 5, 8, 10, 13]
enum.filter_map { |i| i * 2 if i.even? }
# => [4, 16, 20]

這是關於這個主題好讀物

希望對某人有用!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM