gpt4 book ai didi

Ruby 数组适配器

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

我必须查询一组来自不同来源的模型对象。每个源返回一个Array,其中包含类似Hash的对象,但同一模型(LogDoc)的布局并不相同。

我的第一个方法是将查询结果对象包装到一个数组适配器中,该适配器基本上转换在 #each block 中提取的每个元素。这是我想到的:

class MongoQueryAdapter
extend Forwardable

def initialize(mongo_query)
@query_rows = mongo_query
...
end

def_delegators :@query_rows, ...

def each(&block)
@query_rows.each do |raw|
log = LogDoc.new raw
block.call(log)
end
end
end

我认为这是更适合我的用例的模式,但我担心性能,因为我听说 block.callyield 相比效率低下.

是否可以使用 yield 来实现?还是性能影响真的值得考虑?

最佳答案

您可以只yield 而不是调用 block ,不需要其他更改。

def each
if block_given?
@query_rows.each do |raw|
yield LogDoc.new(raw)
end
else
# return Enumerator or raise
end
end

看看代码,我认为你实际上可以稍微简化一下:

def each(&block)
@query_rows.map { |raw| LogDoc.new(raw) }.each(&block)
end

是的,yield 往往要快得多:

Calculating -------------------------------------
bench_block 30.600k i/100ms
bench_yield 42.073k i/100ms
-------------------------------------------------
bench_block 768.311k (± 6.0%) i/s - 3.825M
bench_yield 3.917M (± 2.8%) i/s - 19.564M

关于Ruby 数组适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27798855/

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