在此示例中实现DRY的最佳方法

时间:2013-05-17 05:50:30

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1

在此示例中,创建可重用读取方法的最佳方法是什么。我有两个代码块,共同做两件事,读取文件并检查某个正则表达式模式。我想在一个单独的方法中将这两个任务分开,以便我可以重复使用它。我开始重构但它不起作用,我仍然在学习如何有效地使用块。有人能告诉我最好的方法吗?提前谢谢。

方法1

   File.readlines(file) do |line|
    if line.match(/@/)
    line.split.each do |word| 
    if word.include?("@")
    puts word
      end

     end
  end  

方法2

     File.readlines(file) do |line|
     if line.match(/$hello/)
     line.split(',').each do |word|
     puts word.split('.')[0][0..6]

     end
    end 
    end 

重复使用方法

    def read_file file, pattern
    File.readlines(file) do |line|
    if line.match (pattern)
      #not sure what to return here
    end
   end

1 个答案:

答案 0 :(得分:3)

我不确定我是否完全理解您的问题,但此代码应该可以帮助您了解如何使用块并执行您想要的操作。

def f file, pattern
  File.readlines(file).each do |line|
    if line.match (pattern)
      yield line
    end
  end
end

f('text.txt', /@/) do |line| 
  line.split.each do |word| 
    if word.include?('@')
      puts word
    end
  end
end

f('text.txt', /^hello/) do |line|
  line.split(',').each do |word|
    puts word.split('.')[0][0..6]
  end
end

您也可以使用&block作为该函数的第三个参数,然后代替yield编写block.call line