Arrays `返回`在Ruby数组中#映射

Arrays `返回`在Ruby数组中#映射,arrays,ruby,return,enumerator,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函数中返回什么。我知道这可以通过分配一个变量来实现,但我认为这就是我可以做到的

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

您不需要变量。块的返回值是其中计算的最后一个表达式的值。在这种情况下,
如果

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

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

Sergio的答案很好,但值得指出的是,有一个关键字可以按照您希望的方式工作:
返回
下一步

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>数组=[1,2,3,4,5,8,9,10,11,14,15]
irb(main):124:0>array.map{| n | return n}
回溯(最近一次呼叫最后一次):
3:from(irb):124
2:发件人(irb):124:在“地图”中
1:from(irb):124:in`block in irb_binding'
LocalJumpError(意外返回)
您可以使用
next
而不是
return

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

不错!我不得不重新编写代码,但我相信这是一个很好的解决方案!过了一段时间再回到这里,我仍然对
隐式返回
有效,而不是
显式返回
感到惊讶。太奇怪了。@Automatico:希望你能习惯:)我不能。对于大多数om my项目,跳转到typescript@塞尔吉奥图兰塞夫:太好了!我的实际代码比上面的示例要复杂一些,因此
next
可能是一个非常好的解决方案。就我个人而言,我不喜欢ruby的这种“默认魔法”行为。明确地说明发生了什么是很好的,这样下一个人就能更容易地了解它。这是一个更好的答案!很酷,我经常使用Ruby,但在
next
中却错过了这一点。总有一天我会开始阅读手册…非常感谢!此答案应标记为最终解决方案。包含更多答案和详细信息的相关问题:。