[英]Accepting Command-Line Arguments into a Ruby Script
我正在嘗試使用以下代碼在文件中接受作為終端中的參數,然后將讀取該更新並使用其內容更新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 `'
我對紅寶石很新,因此不是最好的。 我試過交換很多東西並改變一些事情,但無濟於事。 我究竟做錯了什么?
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。 否則,返回值提供有關表達式的信息。
邁克爾給了你問題的基本答案。 稍微多一點的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.