2012-03-27 3 views
4

다음 코드를 사용하여 터미널에서 인수로 파일을 수락하고이 내용을 읽은 다음 내용으로 body 변수를 업데이트하려고합니다. 파일이 전달되지 않으면 사용자가 자신의 본문 사본을 입력 할 수있는 프롬프트를 원합니다. 내가 파일을 전달하지 않고 프로그램을 실행하면Ruby 스크립트에 명령 줄 인수 허용


require 'posterous' 

Posterous.config = { 
    'username' => 'name', 
    'password' => 'pass', 
    'api_token' => 'token' 
} 

include Posterous 
@site = Site.primary 

#GETS POST TITLE 
puts "Post title: " 
title = STDIN.gets.chomp() 

if defined?(ARGV) 
    filename = ARGV.first 
end 

if (defined?(filename)) 
    body = File.open(filename) 
    body = body.read() 
else 
    puts "Post body: " 
    body = STDIN.gets.chomp() 
end 
puts body 

나는이 반환받을 :


Post title: 
Hello 
posterous.rb:21:in `initialize': can't convert nil into String (TypeError) 
    from posterous.rb:21:in `open' 
    from posterous.rb:21:in `' 

나는 루비 오히려 새로 온 사람 때문에 그것을 최고의 아닙니다. 나는 많은 것들을 교환하고 일을 바꾸려고 노력했지만 아무 소용이 없다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

10

defined?(ARGV)은 부울 false을 반환하지 않고 "constant"을 반환합니다. 이 값은 false이 아니므로 filenameARGV[0]으로 정의되고 nil이됩니다.

if ARGV.length > 0 
    filename = ARGV.first.chomp 
end 

From the docs:

정의 :

>> ARGV 
=> [] 
>> defined?(ARGV) 
=> "constant" 
?> ARGV.first 
=> nil 

대신 당신은 ARGV의 길이를 확인 하는가? 표현식은 식 (식 객체, 초기화 된 지역 변수, 현재 범위에서 볼 수있는 메소드 이름 등)이 인식 가능한지 여부를 테스트합니다. 표현식을 해석 할 수없는 경우 반환 값은 nil입니다. 그렇지 않으면 반환 값은 표현식에 대한 정보를 제공합니다.

2

마이클이 질문에 대한 기본적인 답변을주었습니다. 약간 더 루비 같은 방법은 ARGF를 사용하여 읽기를 수행하는 것입니다. 당신이, 당신이 파일의 내용을 저장 건너 뛸 수 있습니다 몸 아무것도 할 필요가없는 경우 (..of 물론

puts "Post title: " 
title = gets.chomp 

puts "Post body: " if ARGV.length == 0 
body = ARGF.gets.chomp 
puts body 

: 다음 조건은 프롬프트를 인쇄 할 것인지 여부를 결정하기 위해 필요 s)하고 그냥한다

puts ARGF.gets.chomp