2012-11-09 29 views
0

对不起,这个愚蠢的问题,我是新的红宝石。 什么是错在下面的代码,此错误结束:私人方法`得到'要求“..”(NoMethodError)

private method `gets' called for "file.txt":String (NoMethodError) 

下面是代码:

def read_file(path) 
File.open(path, 'r') do |file| 
    while line = path.gets 
    puts line 
    end 
end 
end 

def initialize 
    read_file("file.txt") 
end 
+0

-2,ouch,看起来像是一个诚实的错误,忽视,作为一个新的... –

回答

2

更换while line = path.getswhile line = file.gets

+0

这是正确的。如果你真的想在一个对象上调用一个私有方法,将来你可以使用'path.send:gets'(但是你需要这里的文件,当然 - 这是作为File.open命令)。 –

+0

@Brad:但是,私人'String#gets'(实际上是['Kernel#gets']](http://ruby-doc.org/core-1.9.3/Kernel.html#method- i-gets))从标准输入中读取(或多或少),所以它很少是您正在寻找的方法。 –

+0

对,我认为描述访问私有方法的一般使用模式可能是值得的,因为他/她是一个自我描述的newbi。在这种情况下绝对是一个可怕的想法,正如你所指出的那样,大多数人(无论如何也是这样)也是如此。 –

2

你说这样的:

path.gets 

and pathString。有一个gets method in Kernel

gets(sep=$/) → string
gets(limit) → string or nil
gets(sep,limit) → string or nil

Returns (and assigns to $_) the next line from the list of files in ARGV (or $*), or from standard input if no files are present on the command line.

String包括Kernel经由Object所以gets方法如上所述也是String一个实例方法。但是,Kernel#gets是私人所以String#gets是私有的,还有你的错误:

private method `gets' called for "file.txt":String (NoMethodError) 

你想在file被调用gets其他地方注明。

Kernel#gets,像很多(所有?)的Kernel方法,是围绕这样就可以把gets就像个普通的功能quick'n'dirty单行等。 Kernel#gets的单线程度也是它为什么要对$_执行操作的原因。


此答案主要是背景资料,以便您知道发生了什么事情。我建议接受Hck's answer,因为他们是正确的,他们先来。

+0

写得很好。每当我看到你时,我都会学到一些新的和复杂的东西(我仍然在玩那个erb)。出于好奇,你是如何学习Rails的内涵的,对于高级概念有没有必要的资源,还是主要来自工作/娱乐? –

+0

@布拉德:谢谢,我发现铺设一切有助于我澄清自己的想法:如果我无法解释它,那么我不知道它。我通过回答SO问题(通过教学来学习)并在需要时首先潜入源代码中学到了很多有趣的角落。我已经有一段时间了,我有一个广泛的背景,所以我的主要资源是经验。让我知道ERB的内容。 –

相关问题