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]
我有一个方法,我想在地图函数中决定 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]