Arrays `返回`在Ruby数组中#映射
我有一个方法,我想在这个方法中决定在map函数中返回什么。我知道这可以通过分配一个变量来实现,但我认为这就是我可以做到的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时,它从方法返回,而不是在
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
中却错过了这一点。总有一天我会开始阅读手册…非常感谢!此答案应标记为最终解决方案。包含更多答案和详细信息的相关问题:。