接受命令行参数到Ruby脚本

ayy*_*yyp 4 ruby command-line-arguments posterous

我正在尝试使用以下代码在文件中接受作为终端中的参数,然后将其读取并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
Run Code Online (Sandbox Code Playgroud)

当我在没有传入文件的情况下运行程序时,我得到了这个:


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 `'
Run Code Online (Sandbox Code Playgroud)

我对红宝石很新,因此不是最好的.我试过交换很多东西并改变一些事情,但无济于事.我究竟做错了什么?

Mic*_*ski 10

defined?(ARGV) 不会返回布尔值false,而是返回"constant".因为那不评估false,filename被定义为ARGV[0],即nil.

>> ARGV
=> []
>> defined?(ARGV)
=> "constant"
?> ARGV.first
=> nil
Run Code Online (Sandbox Code Playgroud)

相反,您可以检查以下内容的长度ARGV:

if ARGV.length > 0
  filename = ARGV.first.chomp
end
Run Code Online (Sandbox Code Playgroud)

来自文档:

界定?表达式测试表达式是否引用任何可识别的内容(文本对象,已初始化的局部变量,从当前作用域可见的方法名称等).如果无法解析表达式,则返回值为nil.否则,返回值提供有关表达式的信息.