接受命令行参数到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 `'

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

解决方法

定义?(ARGV)不会返回布尔值false,而是返回“常量”.由于这不会被评估为false,因此filename被定义为ARGV [0],即nil.

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

相反,你可以检查ARGV的长度:

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

From the docs:

defined? expression tests whether or not expression refers to anything recognizable (literal object,local variable that has been initialized,method name visible from the current scope,etc.). The return value is nil if the expression cannot be resolved. Otherwise,the return value provides information about the expression.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...