gpt4 book ai didi

ruby - 了解 Ruby Enumerable#map(具有更复杂的 block )

转载 作者:数据小太阳 更新时间:2023-10-29 07:08:51 25 4
gpt4 key购买 nike

假设我有一个函数

def odd_or_even n
if n%2 == 0
return :even
else
return :odd
end
end

我有一个简单的可枚举数组

simple = [1,2,3,4,5]

然后我用我的函数在 map 中运行它,使用一个 do-end block :

simple.map do
|n| odd_or_even(n)
end
# => [:odd,:even,:odd,:even,:odd]

如果不首先定义函数,我怎么能做到这一点?例如,

# does not work
simple.map do |n|
if n%2 == 0
return :even
else
return :odd
end
end

# Desired result:
# => [:odd,:even,:odd,:even,:odd]

不是有效的 ruby​​,编译器甚至因为考虑它而生我的气。但是,我将如何实现一种有效的等效方法呢?

编辑

实际上,对我来说,问题的解决方案远不如它背后的动机/推理重要,它可以帮助我更多地了解 ruby​​ block 的工作原理:)

最佳答案

你是如此接近。只需删除 return 就可以了。

这是因为传递给 map 的 block 是一个过程(即用 Proc.new 创建),而不是一个 lambda。 proc 中的 return 不只是跳出 proc,它会跳出执行该 proc 的方法(即调用 call)。另一方面,在 lambda 中的 return 仅跳出 lambda。

proc 方法在 Ruby 1.8 中返回一个 lambda,在 Ruby 1.9 中返回一个 Proc。最好不要使用此方法,并明确说明您要使用哪种结构。

我猜你在尝试这个时要么在 IRB 中,要么在一个普通的 ruby​​ 脚本中。

a = Proc.new { return }
a.call # fails. Nothing to return from.

def foobar
a = Proc.new { return }
a.call
puts 'hello' # not reached. The return within the proc causes execution to jump out of the foobar method.
end
foobar # succeeds, but does not print 'hello'. The return within the proc jumps out of the foobar method.

b = lambda { return }
b.call # succeeds. The return only returns from the lambda itself.

def bazquux
b = lambda { return }
b.call
puts 'hello' # this is reached. The lambda only returned from itself.
end
bazquux # succeeds, and prints 'hello'

从中吸取的教训是使用隐式返回,除非你不能,我猜。

关于ruby - 了解 Ruby Enumerable#map(具有更复杂的 block ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3042011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com