2013-08-02 87 views
1

我試圖從運行的Zed Shaw的這個代碼瞭解紅寶石堅硬方式行使15:Ruby的File.open不能轉換成零字符串(類型錯誤)

filename = ARGV.first 

prompt = '> ' 
txt = File.open(filename) 

puts "Here's your file: #{filename}" 
puts txt.read() 

puts "I'll also ask you to type it again:" 
print prompt 
file_again = STDIN.gets.chomp() 

txt_again = File.open(file_again) 

puts txt_again.read() 

我每次運行它,我得到一條錯誤消息說:

ex15.rb:4:in `initialize': can't convert nil into String (TypeError) 
from ex15.rb:4:in `open' 
from ex15.rb:4 

這是怎麼回事?我無法獲得此代碼的工作!

+0

當你執行它時,你是否像這樣'ruby ex15.rb sample_text.txt'執行它? –

回答

0

您是如何運行腳本的?腳本似乎期待一個參數,如下所示:ruby my_script.rb file.txt

你提供了這個參數嗎?如果沒有,ARGV[0]回報nil和第4行的腳本失敗,因爲它的計算結果爲:

txt = File.open(nil) 

File.open期望一個文件名/文件路徑,請參見:File, Ruby 2.0 Docs

+0

哦,呃!我完全忘了。謝謝! – emaamodt

0

查看錯誤信息:

Line 4: File.open waits for a String as an argument, and gets instead a Nil reference. 

這意味着ARGV.first,這是命令行的第一個參數腳本名之後,是不確定的。

0

在這裏:

filename = ARGV.first 
# ... 
txt = File.open(filename) 

我們假定你是filename,因此ARGV.first將是永遠存在的。這是一個假設,特別是在處理投入時不應該這樣做。

我建議你要麼提供的情況下,沒有爲filename的默認值給出:

filename = (ARGV.count > 0) ? ARGV.first : "default.txt" 

或拋出自己的異常,讓抽象的上層來對付它:

raise RuntimeError.new "No input file" unless ARGV.count > 0 
0

我知道這個問題有點老了,但我認爲答案可能有助於其他人像我早些時候一樣尋找關於這個問題的幫助。

有同樣的問題,這是我做的工作。

我的代碼:

filename = ARGV.first 
txt = open(filename) 

puts "Here's your file #{filename}" 
print txt.read 

print "Type the filename again: " 
file_again = $stdin.gets.chomp 

txt_again = open(file_again) 

print txt_again.read 

這是正確的代碼。但是讓文件起作用並且避免錯誤的技巧不在ex15.rb文件的代碼中。這與您在何處以及如何創建純文本ex15_sample.txt文件有關。

如果您在使用TextWrangler或類似於我的情況TextMate,創建另一個選項卡或窗口和另一個文件。確保你選擇純文本:

enter image description here

然後在文件中寫的給定文本:

這是我的東西輸入到文件中。 這真的很酷的東西。 有很多很多的樂趣在這裏。

然後將其保存在與ex15.rb腳本相同的目錄中。

然後去終端。並鍵入以下(不目錄名和路徑我使用的是從我的一個例子,你必須填寫它使用了正確的信息):

紅寶石/用戶/ ilyafeynberg /臺式機/ rubyway/ex15.rb ex15_sample.txt

如果您正確執行所有步驟,它應該正常運行,並通過終端正確提示您。請注意,您必須爲ex15.rb文件提供正確的路徑。如果我想把它縮短並且把我創建的導演放在「rubyway」中,那就失敗了。

注:我真的不知道爲什麼,但創建一個使用文本編輯與Mac上的純文本功能的純文本文件創建的問題船載對我來說,並沒有工作。把它作爲純文本文件在我的編輯器中創建並妥善保存會產生差異,讓我明白我做錯了什麼,以及我必須做什麼。所以我建議不要使用TextEdit,而是使用編寫腳本的編輯器。

祝你好運!

相關問題