2013-05-17 2 views
0

이 예제에서 재사용 가능한 읽기 메소드를 만드는 가장 좋은 방법은 무엇입니까? 두 가지 공통점을 지닌 두 개의 청크가 있는데 파일을 읽고 특정 정규식 패턴을 확인합니다. 이 두 가지 작업을 별도의 방법으로 분리하여 다시 사용할 수 있도록하고 싶습니다. 리팩토링을 시작했지만 제대로 작동하지 않고 블록을 효율적으로 사용하는 방법을 배우고 있습니다.이 작업을 수행하는 가장 좋은 방법을 보여 줄 수 있습니까? 미리 감사드립니다.이 예제에서 DRY를 구현하는 가장 좋은 방법

방법 항목

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 

답변

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을 쓸 수 있습니다.

+0

고마워요, 고마워요, speransky – katie

+0

Word가 인쇄되고 있지 않습니다. 귀하의 목적에 맞는지 확인하기 위해 테스트 했습니까? – katie