Ruby数组中的`return`#map

Posted

技术标签:

【中文标题】Ruby数组中的`return`#map【英文标题】:`return` in Ruby Array#map 【发布时间】:2017-01-13 23:20:22 【问题描述】:

我有一个方法,我想决定在 map 函数中返回什么。我知道这可以通过分配一个变量来完成,但这是我虽然可以做到的;

def some_method(array)
    array.map do |x|
      if x > 10
         return x+1 #or whatever
      else
         return x-1
      end
    end
end

这不像我预期的那样工作,因为第一次点击return,它从方法返回,而不是在 map 函数中,类似于在 javascript 的 map 函数中使用 return 的方式。

有没有办法实现我想要的语法?还是我需要将它分配给一个变量,然后像这样将它挂在最后:

def some_method(array)
    array.map do |x|
      returnme = x-1
      if x > 10
         returnme = x+1 #or whatever
      end
      returnme
    end
end

【问题讨论】:

相关问题以及更多答案和详细信息:Using 'return' in a Ruby block. 【参考方案1】:

Sergio 的回答非常好,但值得指出的是, 有一个关键字可以按照您希望 return 的方式工作:next

array.map do |x|
  if x > 10
    next x + 1
  else
    next x - 1
  end
end

next 的用法不是很好,因为正如 Sergio 指出的那样,你不需要任何东西。但是,您可以使用next 更明确地表达它:

array.map do |x|
  next x + 1 if x > 10
  x - 1
end

【讨论】:

太好了!我的实际代码比我上面的例子更复杂一些,所以next 可能是一个非常好的解决方案。就我个人而言,我不喜欢 ruby​​ 的所有这些“默认魔法”行为。很高兴明确说明正在发生的事情,以便下一个人更容易理解。 酷,我用过很多 Ruby,但在next 上错过了这个。总有一天我会开始阅读手册...【参考方案2】:

return关键字只能在方法中使用(实际上包括Proc)。它将引发LocalJumpError

irb(main):123:0> array = [1, 2, 3, 4, 5, 8, 9, 10, 11, 14, 15]
irb(main):124:0> array.map  |n| return n 
Traceback (most recent call last):
        3: from (irb):124
        2: from (irb):124:in `map'
        1: from (irb):124:in `block in irb_binding'
LocalJumpError (unexpected return)

您可以使用next 代替return

irb(main):126:0> array.map  |n| next n 
=> [1, 2, 3, 4, 5, 8, 9, 10, 11, 14, 15]

【讨论】:

【参考方案3】:

你不需要这个变量。块的返回值是在其中评估的最后一个表达式的值。在这种情况下,if

def some_method(array)
    array.map do |x|
      if x > 10
         x+1
      else
         x-1
      end
    end
end

我认为三元运算符看起来会更好。更具表现力。

def some_method(array)
  array.map do |x|
    (x > 10) ? x+1 : x-1
  end
end

如果你坚持使用return,那么你可以使用 lambdas。在 lambdas 中,return 的行为与普通方法一样。

def some_method(array)
  logic = ->(x) 
    if x > 10
      return x + 1
    else
      return x - 1
    end
  
  array.map(&logic)
end

不过,这种形式很少见。如果你的代码很短,它肯定可以重写为表达式。如果您的代码足够长且复杂到足以保证多个退出点,那么您可能应该尝试简化它。

【讨论】:

不错!我不得不稍微修改我的代码,但我相信这是一个很好的解决方案! 一段时间后回到这个问题,我仍然对implicit return 有效,但explicit return 无效。太奇怪了。 @Automatico:希望你会习惯这个:) 我做不到。我的大多数项目都跳到了打字稿上。 @SergioTulentsev

以上是关于Ruby数组中的`return`#map的主要内容,如果未能解决你的问题,请参考以下文章

为啥`return a or b`是Ruby中的空值表达式错误?

Ruby:应该从子数组返回最大值数组的递归函数的问题

带索引的Ruby数组collect

这个 ruby​​ 代码算作递归函数吗?

ruby中proc和lambda的return区别

Ruby 中的关联数组