我正在尝试使用以下代码在文件中接受作为终端中的参数,然后将其读取并使用其内容更新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 `'
我对红宝石很新,因此不是最好的。我试过交换很多东西并改变一些事情,但无济于事。我做错了什么?
答案 0 :(得分:10)
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
定义?表达式测试表达式是否引用任何可识别的内容(文本对象,已初始化的局部变量,从当前作用域可见的方法名称等)。如果无法解析表达式,则返回值为nil。否则,返回值提供有关表达式的信息。
答案 1 :(得分:2)
puts "Post title: "
title = gets.chomp
puts "Post body: " if ARGV.length == 0
body = ARGF.gets.chomp
puts body
..当然,如果你不需要任何其他的身体,你可以跳过存储文件的内容,只是做
puts ARGF.gets.chomp