Ruby - Array.find,但返回块的值

Nar*_*tor 16 ruby

我有一个数组,我想要第一个块的结果返回一个truthy值(又名,不是nil).问题在于,在我的实际使用案例中,测试有副作用(我实际上是在一组队列上迭代,然后从顶部弹出),所以我不需要在第一次成功之后评估该块.

a,b,c = [1,2,3]

[a,b,c].first_but_value{ |i| (i + 1) == 2 } == 2

a == 2
b == 2
c == 3
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

rib*_*mar 15

break 丑陋= P

如果你想要一个功能方法,你想要一个懒惰的地图:

[nil, 1, 2, 3].lazy.map{|i| i && i.to_s}.find &:itself   
# => "1"
Run Code Online (Sandbox Code Playgroud)

如果你不相信它不是在整个阵列中迭代,只需打印出来并看到:

[nil, 1, 2, 3].lazy.map{|i| (p i) && i.to_s}.find  &:itself
# nil
# 1
# => "1"
Run Code Online (Sandbox Code Playgroud)

i.to_s由您的块替换.

  • 错误的,这就是为什么“懒惰”在那里的原因。使用“懒惰”,您不必映射所有元素。我什至提供了带有打印的版本,因此,如果您不相信它,则可以自己进行测试。 (2认同)

saw*_*awa 10

[1, 2, 3].detect { |i| i += 1; break i if i == 2 } 
# => 2

[1, 2, 3].detect { |i| i += 1; break i if i == 10 }
# => nil
Run Code Online (Sandbox Code Playgroud)

  • 这个想法是在Ruby中`break`和`return`基本上是一回事.一个用于循环,另一个用于函数上下文.通过打破循环,我们提前返回..如果没有arg中断,我们将简单地返回nil但是使用"返回值"我们可以获得所需的返回行为.(同样适用于任何循环) (2认同)
  • 小心这一点,好像什么也没找到,返回值将是原始数组:`[1,2,3] .each {| i | i + = 1; 如果我= = 10} => [1,2,3]那就打破我 (2认同)

Dmi*_*kin 5

find_yield做你想做的事,查看具有许多核心扩展的 ruby​​ facets,尤其是find_yieldEnumberable 方法:https : //github.com/rubyworks/facets/blob/master/lib/core/facets/enumerable/find_yield.rb

  • 很酷!如果/当它被拉入核心 ruby​​ 时重新弹出,所以我可以将其标记为答案。 (2认同)