Принятие аргументов командной строки в Ruby-скрипт - PullRequest
4 голосов
/ 28 марта 2012

Я пытаюсь использовать следующий код для принятия в файл в качестве аргумента в Терминале, который затем будет прочитан и обновит переменную 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 ]

10 голосов
/ 28 марта 2012

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

Из документов:

определяется? выражение проверяет, относится ли выражение к чему-либо распознаваемому (литеральный объект, локальная переменная, которая была инициализирована, имя метода, видимое из текущей области и т. д.). Возвращаемое значение равно нулю, если выражение не может быть разрешено. В противном случае возвращаемое значение предоставляет информацию о выражении.

2 голосов
/ 28 марта 2012

Майкл дал вам основной ответ на ваш вопрос.Немного более 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
...