[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

what's wrong about this chomp code?

Zhenning Guan

11/5/2008 12:51:00 PM

when I was running this code
------------
File.open("1c.txt") do |f|
while line= f.gets.chomp;
p line ;
end
end
-------------

why they warning with the message below?

=========
private method 'chomp' called for nil:NilClass <nomethoderror>
from ok.rb:2:in 'open'
from ok.rb:2
==========
--
Posted via http://www.ruby-....

4 Answers

Stefano Crocco

11/5/2008 12:59:00 PM

0

Alle Wednesday 05 November 2008, Zhenning Guan ha scritto:
> when I was running this code
> ------------
> File.open("1c.txt") do |f|
> while line= f.gets.chomp;
> p line ;
> end
> end
> -------------
>
> why they warning with the message below?
>
> =========
> private method 'chomp' called for nil:NilClass <nomethoderror>
> from ok.rb:2:in 'open'
> from ok.rb:2
> ==========

Because chomp will be called on the value returned by f.gets, even when it's
nil. You need to move the call to chomp inside the while loop:

while line=f.gets
line = line.chomp #or simply line.chomp!
...

You can also add a rescue clause inside the condition of the while loop:

while (line = f.gets.chomp rescue nil)
...

This way, when f.gets returns nil and the NoMethodError exception is raised,
the exception is rescued and line is set to nil, which causes the loop to end.

I hope this helps

Stefano


Zhenning Guan

11/5/2008 1:28:00 PM

0

Stefano Crocco wrote:
> This way, when f.gets returns nil and the NoMethodError exception is
> raised,
> the exception is rescued and line is set to nil, which causes the loop
> to end.
>
> I hope this helps
>
> Stefano

Thank you for help me understand it. :)
--
Posted via http://www.ruby-....

Lloyd Linklater

11/5/2008 2:10:00 PM

0

Zhenning Guan wrote:
> when I was running this code
> ------------
> File.open("1c.txt") do |f|
> while line= f.gets.chomp;
> p line ;
> end
> end
> -------------
>
> why they warning with the message below?
>
> =========
> private method 'chomp' called for nil:NilClass <nomethoderror>
> from ok.rb:2:in 'open'
> from ok.rb:2
> ==========


This might be easier:
File.open('1c.txt').each { |line| puts line.chomp }
--
Posted via http://www.ruby-....

Sebastian Hungerecker

11/5/2008 2:22:00 PM

0

Lloyd Linklater wrote:
> File.open('1c.txt').each { |line| puts line.chomp }

File.foreach('1c.txt') {|line| puts line}

File.foreach is better than File.open(...).each because that way the file is
closed right away (with your code open returns a file object that you simply
throw away after calling each on it, so you can't call close on it). And
doing puts file.chomp is pointless as puts will just readd the \n removed by
chomp.

HTH,
Sebastian
--
Jabber: sepp2k@jabber.org
ICQ: 205544826