红宝石做地图和紧凑在一起

时间:2017-01-18 07:54:52

标签: ruby

我是红宝石的新手,这看起来不对,但工作正常

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的情况下执行此操作?

2 个答案:

答案 0 :(得分:2)

一些注释

  • 您的方法称为get_internal_deps,但看起来它实际上设置了一个实例变量。
  • 您可以定义internal_dependencies并使用缓存。
  • 在这种情况下,您需要删除attr_reader/writer/accessor的所有@internal_dependencies
  • File.open(f)并不是很干净。
  • selfself.dir
  • 中不需要self.sources
  • :line是一个数组。不应该叫它:线?
  • 2个单独的简短方法可能比更大的方法更好。

重构代码

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。)