Ruby 数组中的`return`#map

`return` in Ruby Array#map

我有一个方法,我想在地图函数中决定 return 的内容。我知道这可以通过分配一个变量来完成,但这就是我认为我可以做到的方式;

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

这不像我预期的那样工作,因为第一次 return 被命中时,它 return 来自方法,而不是地图函数,类似于 return用于javascript的地图功能。

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

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

您不需要变量。 Return 块的值是其中计算的最后一个表达式的值。在这种情况下,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。在 lambda 表达式中,return 的行为与普通方法中的一样。

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

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

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

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]