为什么Ruby.map不';不能使用if语句

为什么Ruby.map不';不能使用if语句,ruby,arrays,Ruby,Arrays,在.map中使用if会得到意外的结果: a = [1,2,3,4,5] a.map do |item| item + 10 if item < 4 item + 9 if item > 4 end a=[1,2,3,4,5] a、 地图项目| 如果项目4,则项目+9 结束 我期望:[11,12,13,13,14] …但我得到的是:[nil,nil,nil,nil,14] 为什么 其次,我知道最后一个表达式是方法的返回值 那么if语句是否也是如此?最后一个表达式是if语句

.map
中使用
if
会得到意外的结果:

a = [1,2,3,4,5]
a.map do |item|
  item + 10 if item < 4
  item + 9  if item > 4
end
a=[1,2,3,4,5]
a、 地图项目|
如果项目<4,则项目+10
如果项目>4,则项目+9
结束
我期望:
[11,12,13,13,14]

…但我得到的是:
[nil,nil,nil,nil,14]

为什么

其次,我知道最后一个表达式是方法的返回值 那么if语句是否也是如此?最后一个表达式是if语句的返回值


谢谢

对于<4的元素,
如果项目<4
确实返回预期值,则项目+10。但第二条语句执行后,map返回该值。对于<4项,
item+9,如果item>4
返回
nil

您的地图应该如下所示:

a.map do |item|
  if item < 4 then
      item + 10
  else
      item + 9
  end
end
a.map do |项|
如果项目<4,则
项目+10
其他的
项目+9
结束
结束

如果item==4,该怎么办?

对于<4的元素,如果item<4确实返回了预期值,则
item+10。但第二条语句执行后,map返回该值。对于<4项,
item+9,如果item>4
返回
nil

您的地图应该如下所示:

a.map do |item|
  if item < 4 then
      item + 10
  else
      item + 9
  end
end
a.map do |项|
如果项目<4,则
项目+10
其他的
项目+9
结束
结束

如果item==4怎么办?

这是因为如果使用
map
,您将创建一个数组,其中包含从传递到
map
方法中的块计算的值。因此,在本例中,前4个元素中计算的最后一个值是
item+9,如果item>4
,则返回
nil

这是因为如果您使用
map
,您将创建一个数组,其中包含从传递到
map
方法的块中计算的值。因此,在本例中,前4个元素中计算的最后一个值是
item+9,如果item>4
,则返回
nil

我们可以通过将块作为一种方法写入来演示您的问题:

def test_map(item)
  item + 10 if item < 4
  item + 9  if item > 4
end

test_map 3
# => nil
test_map 5
# => 14

case..when
返回计算为true的第一个
when
子句后的块。

我们可以通过将块作为一种方法写入来演示您的问题:

def test_map(item)
  item + 10 if item < 4
  item + 9  if item > 4
end

test_map 3
# => nil
test_map 5
# => 14

case..when
返回计算为true的第一个
when
子句后的块。

Ruby 2.7+

现在有解决办法了

Ruby 2.7正是为了这个目的而引入了
filter\u map
。这是一种惯用的、有表现力的语言,我希望它很快就会成为一种常态

例如:

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


希望这对别人有用

Ruby 2.7+

现在有解决办法了

Ruby 2.7正是为了这个目的而引入了
filter\u map
。这是一种惯用的、有表现力的语言,我希望它很快就会成为一种常态

例如:

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


希望这对别人有用

提示:条件为非真的if的返回值为nil提示:条件为非真的if的返回值为nilOh,我得到了一个使用此映射的练习。在那张图里面,我放了几个if语句,但它并没有像我预期的那样工作。所以上面的例子只是为了证明我的问题。我不介意,所以我可能忘记了item==4Oh的情况,我有一个练习使用这个映射。在那张图里面,我放了几个if语句,但它并没有像我预期的那样工作。所以上面的例子只是为了证明我的问题。我不介意,所以我可能忘记了item==4的情况,那么这是否意味着块中的最后一个表达式将作为每个元素迭代器通过返回到map?那么这是否意味着块中的最后一个表达式将作为每个元素迭代器通过返回到map?