我是红宝石的新手,这看起来不对,但工作正常
def get_internal_deps
self.internal_dependencies = self.sources.map do |f|
s = File.open(File.join(self.dir, f)).grep(/\d{8}-\w{5}/)
if s.length > 0
{:file => f, :line => s}
end
end.compact
#how crazy does that look?
end
那么如何在没有end.compact
的情况下执行此操作?
答案 0 :(得分:2)
get_internal_deps
,但看起来它实际上设置了一个实例变量。internal_dependencies
并使用缓存。attr_reader/writer/accessor
的所有@internal_dependencies
。File.open(f)
并不是很干净。self
或self.dir
self.sources
:line
是一个数组。不应该叫它:线?def internal_dependencies
@internal_dependencies ||= sources.map{|s| parse_dependency(s) }
.reject{|h| h[:line].empty? }
end
private
def parse_dependency(source)
{
file: source,
line: File.readlines(File.join(dir, source)).grep(/\d{8}-\w{5}/)
}
end
答案 1 :(得分:0)
要避免compact
,可以使用reduce
(在此特定情况下为Enumerable#each_with_object
)而不是map
:
def get_internal_deps
self.internal_dependencies = sources.each_with_object do |f, acc|
s = File.open(File.join(self.dir, f)).grep(/\d{8}-\w{5}/)
acc << {:file => f, :line => s} if s.length > 0
end
end
另请注意,明确的self
接收器在分配的情况下可能有意义,但在RHO中这是完全冗余的(在此代码段中为sources
。)