Принятие аргументов командной строки в сценарий Ruby
Я пытаюсь использовать следующий код для принятия в файл в качестве аргумента в терминале, который затем будет прочитан и обновит body
переменная с ее содержимым. Если файл не передан, я хочу получить приглашение, в котором пользователь может ввести свою собственную копию тела.
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 `'
Я довольно новичок в рубине и, следовательно, не лучший в этом. Я пытался обменять много вещей вокруг и изменить вещи, но безрезультатно. Что я делаю неправильно?
2 ответа
defined?(ARGV)
не вернет логическое значение false
, скорее "constant"
, Так как это не оценивает false
, filename
определяется как ARGV[0]
, который nil
,
>> ARGV
=> []
>> defined?(ARGV)
=> "constant"
?> ARGV.first
=> nil
Вместо этого вы можете проверить длину ARGV
:
if ARGV.length > 0
filename = ARGV.first.chomp
end
определены? выражение проверяет, относится ли выражение к чему-либо распознаваемому (литеральный объект, локальная переменная, которая была инициализирована, имя метода, видимое из текущей области и т. д.). Возвращаемое значение равно нулю, если выражение не может быть разрешено. В противном случае возвращаемое значение предоставляет информацию о выражении.
Майкл дал вам основной ответ на ваш вопрос. Немного более Rubyish способ сделать это будет использовать ARGF для чтения; тогда условное условие необходимо только для того, чтобы решить, следует ли печатать приглашение:
puts "Post title: "
title = gets.chomp
puts "Post body: " if ARGV.length == 0
body = ARGF.gets.chomp
puts body
... конечно, если вам не нужно ничего с телом, вы можете пропустить сохранение содержимого файла (ов) и просто сделать
puts ARGF.gets.chomp