Ruby数组中的`return`#map
Posted
技术标签:
【中文标题】Ruby数组中的`return`#map【英文标题】:`return` in Ruby Array#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
【问题讨论】:
相关问题以及更多答案和详细信息:Using 'return' in a Ruby block. 【参考方案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以上是关于Ruby数组中的`return`#map的主要内容,如果未能解决你的问题,请参考以下文章