我有一个方法,我想决定在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
答案 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]