【问题标题】:`return` in Ruby Array#mapRuby数组中的`return`#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

【问题讨论】:

标签: arrays ruby return enumerator


【解决方案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
    猜你喜欢
    • 2012-09-20
    • 2012-04-12
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    相关资源
    最近更新 更多