gpt4 book ai didi

ruby - 跳过 ruby​​ 中 yield block 的迭代

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

尝试使用一个构思不当的框架,该框架从传入的 block 中收集结果列表,实际上是这样的:

def sigh(&block)
r = (1..3).collect do |i|
yield(i)
end

# do something with r
end

我想要传入的 block 来过滤项目,但要跳过集合迭代而不是将nil 添加到结果中,例如next 会(因为框架不会压缩它们。)除了修补 gem 之外还有什么简单的方法?即,

sigh {|i|  next unless i == 1 }  # results in [1,nil,nil] rather than just [1]

最佳答案

坏消息是您必须修补 gem。让 gem 调用您的代码块并不会赋予您的代码任何特殊权力来影响调用代码如何处理 block 的返回值。

好消息是,通常可以使用“猴子补丁”来为 gem 打补丁,您的程序会重新打开 gem 的类或模块并进行更改。在这个虚构的示例中,我们将展示嵌套在模块中的类,因为许多 gem 使用嵌套的类和模块:

require 'somegem'

# Monkey patch to cause Somegem's do_something_cool method
# to ignore the SomethingBadHappened exception

module SomeGem
class SomeClass
alias_method :orig_do_something_cool, :do_something_cool
def do_something_cool
orig_do_something_cool
rescue SomethingBadHappened
end
end
end

关于ruby - 跳过 ruby​​ 中 yield block 的迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6416599/

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