2013-05-14 37 views
0

我不明白为什么下面不工作:文件的红宝石方法未定义nilClass错误的字符串方法

#TODO: 
#Open file-io-samples/MultipleLinesCustomDelimiter.txt 
#Break each line into fields 
#Convert Times from mm:ss to seconds 
#Remove any redundant spaces. 
####################################################### 

Song = Struct.new(:title, :name, :length) 

File.open("file-io-samples/MultipleLinesCustomDelimiter.txt") do |file_data| 
    songs = [] 
    file_data.each do |line| 
    file, length, name, title = line.chomp.split(/\s*\|\s*/) 
    name.squeeze!(" ") #Error: undefined method for nilClass 
    mins, secs = length.scan(/\d+/) #Error: undefined method for nilClass 
    secs += mins*60 
    songs << Song.new(title, name, secs) 
    end 
    puts songs[1] #make sure output is consistent. 
end 

内容多数民众赞成读取:

/jazz/j00132.mp3 | 3:45 | Fats Waller | Ain't Misbehavin' 
/jazz/j00319.mp3 | 2:58 | Louis Armstrong | Wonderful World 
/bgrass/bg0732.mp3| 4:09 | Strength in Numbers | Texas Red 
: : : : 

这是一个来自Programming Ruby书籍的例子。我不知道为什么scan方法和squeeze方法在字符串对象不是nilClass对象时抛出错误。如果没有这些,put songs [1]的输出看起来是正确的。

+0

他们说他们是'nilClass',不'String'。 – sawa

+0

我知道,但我不明白他们如何不能串。 – Senjai

回答

3

最后一行

::

不匹配的分裂,所以名称,长度和标题为

文件结束

::::

并行例如:

a,b,c = [1,2] 
#a=1 
#b=2 
#c = nil 
+0

啊,我的意思是用它来检测文件的结尾。对我而言,这是多么的疏忽。谢谢您的帮助。冷却后我会标记答案。 – Senjai

+0

不客气,不幸的是,这些例外情况并不多,所以这是使用战略性投入语句或调试器的问题。 –

+0

是的,这是我的一个非常简单的错误。 – Senjai

相关问题