gpt4 book ai didi

ruby - 避免在 Ruby 中多次调用 Find.find ("./")

转载 作者:太空宇宙 更新时间:2023-11-03 18:31:14 26 4
gpt4 key购买 nike

我不确定最好的策略是什么。我有一个类,我可以在其中搜索文件系统以查找特定的文件模式。我只想执行 Find.find("./") 一次。我将如何处理:

  def files_pattern(pattern)
Find.find("./") do |f|
if f.include? pattern
@fs << f
end
end
end

最佳答案

记住方法调用的(通常是计算密集型的)结果,以便下次调用该方法时不需要重新计算它被称为 memoization 所以您可能想阅读更多相关内容。

Ruby 实现它的一种方法是使用一个小包装类,将结果存储在一个实例变量中。例如

class Finder
def initialize(pattern)
@pattern = pattern
end

def matches
@matches ||= find_matches
end

private

def find_matches
fs = []
Find.find("./") do |f|
if f.include? @pattern
fs << f
end
end
fs
end
end

然后你可以做:

irb(main):089:0> f = Finder.new 'xml'
=> #<Finder:0x2cfc568 @pattern="xml">
irb(main):090:0> f.matches
find_matches
=> ["./example.xml"]
irb(main):091:0> f.matches # won't result in call to find_matches
=> ["./example.xml"]

注意:||= 运算符仅在左侧变量的计算结果为 false 时才执行赋值。即 @matches ||= find_matches@matches = @matches || 的简写find_matches 其中 find_matches 由于短路评估只会在第一次被调用。有很多 other questions在 Stackoverflow 上进行解释。


略有不同:您可以更改方法以返回所有文件 的列表,然后使用Enumerable 中的方法,例如grepselect 对同一文件列表执行多个搜索。当然,这有将整个文件列表保存在内存中的缺点。这是一个例子:

def find_all
fs = []
Find.find("./") do |f|
fs << f
end
fs
end

然后像这样使用它:

files = find_all
files.grep /\.xml/
files.select { |f| f.include? '.cpp' }
# etc

关于ruby - 避免在 Ruby 中多次调用 Find.find ("./"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3838913/

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