Ruby Array #map中的`return`

时间:2016-09-06 13:18:44

标签: arrays ruby return enumerator

我有一个方法,我想决定在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函数中返回的使用方式

有没有办法实现我想要的语法?或者我是否需要将其分配给变量,并将其挂在最后,如下所示:

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

3 个答案:

答案 0 :(得分:34)

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

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

这不是next的好用,因为正如塞尔吉奥指出的那样,你不需要任何东西。但是,您可以使用next更简洁地表达它:

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

答案 1 :(得分:15)

您不需要变量。块的返回值是在其中计算的最后一个表达式的值。在这种情况下,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

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

答案 2 :(得分:0)

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]