chop problems

B

BearItAll

Hello, I'm new here, also fairly new to ruby, but I already have some
very usfull scripts written with it.

But a problem I have over and over is that the 'chop' doesn't always
work (for me) when dealing with files.

An example, the file '/tmp/dirtree' is the result of a class that
traverses the directory tree, the lines are written using,

f.print "#{filename}\n"
(but I've also tried others writing methods)

Then next would be the class to read from that file.

DIRTREE='/tmp/dirtree'
IO.foreach(DIRTREE) { |@x|
@x.chop
print "Thisdir = #{@x}/*"
}

The output from print gives,

Thisdir = /home/whatever
/*

So chop hasn't removed the newline.

Do you use a definitive combination of file write and read that will
always work, or is there another trick I don't know about yet.

PS: I' on UNIX/Linux.

Thankyou
 
R

Robert Klemme

BearItAll said:
Hello, I'm new here, also fairly new to ruby, but I already have some
very usfull scripts written with it.

But a problem I have over and over is that the 'chop' doesn't always
work (for me) when dealing with files.

An example, the file '/tmp/dirtree' is the result of a class that
traverses the directory tree, the lines are written using,

f.print "#{filename}\n"
(but I've also tried others writing methods)

"f.puts filename" does the same more efficiently.
Then next would be the class to read from that file.

DIRTREE='/tmp/dirtree'
IO.foreach(DIRTREE) { |@x|
@x.chop
print "Thisdir = #{@x}/*"
}

The output from print gives,

Thisdir = /home/whatever
/*

So chop hasn't removed the newline.

You want chop!() because you want to modify @x. chop() just returns a
copy of the string with the last char removed. But even better use
chomp!(), because chop!() and chop() always remove the last char -
regardless what it is:
=> nil
Do you use a definitive combination of file write and read that will
always work, or is there another trick I don't know about yet.

Kind regards

robert
 
B

BearItAll

Robert said:
"f.puts filename" does the same more efficiently.




You want chop!() because you want to modify @x. chop() just returns a
copy of the string with the last char removed. But even better use
chomp!(), because chop!() and chop() always remove the last char -
regardless what it is:



=> "abcde\n"


=> "abcde"


=> "abcd"


=> "abc"


=> "ab"


=> "a"


=> ""


=> nil




Kind regards

robert

Thankyou, I love you loads.

Strange really how I read that "Returns a new string..." a billion
times, without actually noticing what it said.

But then I'm the same with tax return forms.

So as a reward you are welcome to join me in a all expenses paid round
the world holiday on my yaght. it's about 3 foot long and 2 foot wide
with one oar each. Let me know when your avaiable.
 
R

Robert Klemme

BearItAll said:
Thankyou, I love you loads.
*blush*

Strange really how I read that "Returns a new string..." a billion
times, without actually noticing what it said.

But then I'm the same with tax return forms.

So you never get money back?
So as a reward you are welcome to join me in a all expenses paid round
the world holiday on my yaght. it's about 3 foot long and 2 foot wide
with one oar each. Let me know when your avaiable.

Lemmesee, I think, before I can join this invitation I'll have to undergo
some shrinking - otherwise there'll be hardly enough space on your
"ship"...

:)

robert
 
P

Pit Capitain

Robert said:
Lemmesee, I think, before I can join this invitation I'll have to undergo
some shrinking - otherwise there'll be hardly enough space on your
"ship"...

Should be easy:

robert.chop!

Regards,
Pit
 
C

Caio Tiago Oliveira

BearItAll, 3/2/2005 09:05:
Strange really how I read that "Returns a new string..." a billion
times, without actually noticing what it said.

@x = @x.chop
is the same as
@x.chop!

@x.chop return a new string you can assing to a variable you want to.
 
R

Robert Klemme

Caio Tiago Oliveira said:
BearItAll, 3/2/2005 09:05:


@x = @x.chop
is the same as
@x.chop!

No, it is not. In many applications this might be equivalent but it's not
the same. @x.chop! does not create a new instance, i.e. whoever holds a
reference to that instance sees the change. @[email protected] creates a new
instance so everybody else referencing the old value of @x sees no change.
Also, it makes a difference when you consider #freeze:
TypeError: can't modify frozen string
from (irb):3:in `chop!'
from (irb):3=> "abc"

Also, it makes a difference performance wise. The first form is usually
slower since a new instance has to be created.
@x.chop return a new string you can assing to a variable you want to.

Yes.

Kind regards

robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,535
Members
45,007
Latest member
obedient dusk

Latest Threads

Top