2014-12-12 3 views
4

나는 "Ruby를 힘든 방법으로 배우기"를 할 것이고, 연습 20에서는 이해할 수없는 코드 스 니펫이 있습니다. get.chomp가 "print_a_line"함수에서 f를 호출하는 이유를 모르겠습니다.루비의 함수 안에 gets.chomp

input_file = ARGV.first 

def print_all(f) 
    puts f.read 
end 

def rewind(f) 
    f.seek(0) 
end 

def print_a_line(line_count, f) 
    puts "#{line_count}, #{f.gets.chomp}" 
end 

current_file = open(input_file) 

puts "First let's print the whole file:\n" 

print_all(current_file) 

puts "Now let's rewind, kind of like a tape." 

rewind(current_file) 

puts "Let's print three lines:" 

current_line = 1 
print_a_line(current_line, current_file) 

current_line = current_line + 1 
print_a_line(current_line, current_file) 

current_line = current_line + 1 
print_a_line(current_line, current_file) 

결과적으로 출력의 두 번째 부분이 어떻게 생성되는지 이해할 수 없습니다. 코드로 전달 된 test.txt 파일의 처음 3 줄을 이해하지만 f.gets.chomp가 어떻게 생성하는지 이해할 수 없습니다. 당신이 IO#gets에 대한 documentation을 살펴 경우

$ ruby ex20.rb test.txt 
First let's print the whole file: 
This is line 1 
This is line 2 
This is line 3 
Now let's rewind, kind of like a tape. 
Let's print three lines: 
1, This is line 1 
2, This is line 2 
3, This is line 3 
+0

'f'는 입력 파일 객체이므로'f.gets' ([IO # gets] (http://www.ruby-doc.org/core-2.1.1/IO.html#method-i) -gets))는 개행 문자 ('\ n')를 만나기 전까지 파일에서 읽는다. ([Kernel # gets] (http://www.ruby-doc.org/core-2.1.5/Kernel.html # method-i-gets)는 사용자가 돌아 오기 전까지 STDIN에서 읽습니다. 줄 바꿈 문자는 읽지 만 더 이상은 읽지 않습니다. 'chomp'는 줄 바꿈 문자를 꺾습니다. –

+0

원래 게시물에서 불분명했을 수도 있습니다. f.gets.chomp가 스크립트에 전달 된 test.txt 파일의 행을 통해 어떻게 증가하는지 명확하지 않습니다. 나는 current_line이 어떻게 증가 하는지를 이해하지만 current_file이 증가되어서 각 라인이 읽혀지는 것을 이해하지 못한다. 어떻게 든 gets.chomp와 관련이 있다고 생각했는데 상관 관계가 있는지 확실하지 않습니다. –

답변

2

, 당신은이 IO 객체에서 다음 라인을 읽는 것을 볼 수 있습니다. 호출중인 Kernel#open 메서드는 해당 메서드가있는 IO 개체를 반환합니다. #gets 방법은 실제로 다음 줄로 나아갈 것입니다. 줄을 읽음으로써 반환 된 문자열에 #chomp과 아무런 관련이 없습니다.

7

File 객체 f은 파일에서 읽는 위치를 추적합니다 (잘 보면 참조하는 대상을 추적합니다). 파일을 읽을 때 커서가 앞으로 나아가는 것처럼 생각하면됩니다. fgets에게 말하면 새로운 행에 도달 할 때까지 읽습니다. 그들은 커서가 "커서"를 읽었 기 때문에 f이 어디에 있는지 기억하고 있습니다. chomp 호출이이 부분에 전혀 입력되지 않습니다. 따라서 f.gets을 호출 할 때마다 파일의 다음 행을 읽고 문자열로 리턴합니다.

chompf.gets이 반환하는 문자열 만 처리하며 File 객체에는 영향을주지 않습니다.

편집 : 대답을 완료하려면 : chomp 후행 줄 바꿈이 제거 된 문자열을 반환합니다. (기술적으로 레코드 분리 기호는 제거되지만 줄 바꿈과 거의 다르지 않습니다.) 이것은 Perl (AFAIK)에서 비롯된 것이며 기본적으로 입력을 얻는 특정 형식이 전달하는 경우에 대해 염려 할 필요가 없다는 것이 아이디어입니다 줄 바꿈 문자.

+0

이 설명에 감사드립니다. 실제로 무슨 일이 일어나는지 개념적으로 이해하는 데 도움이됩니다. –