rtrim and ltrim function for ruby: is this ok?

L

LeonB

I made these two functions to extend the default String object:

class String
def rtrim(character)

if self[-1, 1] == character.to_s
self[0, self.length - 1]
end
return self
end

def ltrim(character)
if self[0, 1] == character.to_s
self[1, self.length]
end
return self
end
end

Are they ok? I mean, aren't there any default Ruby functions I am
copying? I looked on google for functions that did the same as above
functions, but I couldn't find any for Ruby.

Thanks in advance!
 
L

LeonB

Pfff... Sorry for the second post. I couldn't find the first one on
Google groups.
I tried changing the self object. But I wasn't allowed to do it. I got
an error message when I did that:
"Can't change the value of self"

So I changed it to:

class String
def rtrim(character)

ret = self
if self[-1, 1] == character.to_s
ret = self[0, self.length - 1]
end
return ret
end

def ltrim(character)
if self[0, 1] == character.to_s
ret = self[1, self.length]
end
return ret
end
end

This works. But I would rather see the first object changed. Is this
possible?
 
L

LeonB

Ow yeah. rstrip and lstrip only strip spaces (and maybe line-endings).
I also want to use it for other characters.
 
T

Todd Benson

Pfff... Sorry for the second post. I couldn't find the first one on
Google groups.
I tried changing the self object. But I wasn't allowed to do it. I got
an error message when I did that:
"Can't change the value of self"

So I changed it to:

class String
def rtrim(character)

ret = self
if self[-1, 1] == character.to_s
ret = self[0, self.length - 1]
end
return ret
end

def ltrim(character)
if self[0, 1] == character.to_s
ret = self[1, self.length]
end
return ret
end
end

This works. But I would rather see the first object changed. Is this
possible?

Leon, look at String#slice!

Todd
 
I

Ian Whitlock

Leon said:
This works. But I would rather see the first object changed. Is this
possible?

I would argue that ltrim and rtrim should not remove one character, but
a sequence of the given character. The following code probably does
not meet all ruby conventions, but it does what you request and it does
reserve ! for its intended purpose.

class String
def rtrim!(character)
n = 0
while (self[-(n+1), 1] == character.to_s)
n +=1
end
self.slice!(self.length - n,n) if n > 0
end

def ltrim!(character)
n = 0
while (self[n, 1] == character.to_s)
n += 1
end
self.slice!(0 , n) if n > 0
end
end

s = "aaaaaabacbccccc"
p s
s.rtrim!("c")
p s
s.ltrim!("b")
p s
s.ltrim!("a")
p s

Ian
 
M

Michael Fellinger

I would argue that ltrim and rtrim should not remove one character, but
a sequence of the given character. The following code probably does
not meet all ruby conventions, but it does what you request and it does
reserve ! for its intended purpose.

Since we got the power of regex/gsub, let's use it :)

class String
def rtrim(char)
dump.rtrim!(char)
end

def rtrim!(char)
gsub!(/#{Regexp.escape(char)}+$/, '')
end

def ltrim(char)
dump.ltrim!(char)
end

def ltrim!(char)
gsub!(/^#{Regexp.escape(char)}+/, '')
end
end

s = "aaaaaabacbccccc"
p s
s.rtrim!("c")
p s
s.ltrim!("b")
p s
s.ltrim!("a")
p s
 
I

Ian Whitlock

Michael said:
Since we got the power of regex/gsub, let's use it :)

Michael,

Thanks. I agree that in practice your code is better.
I am a newbie who does not yet feel comfortable with
regular expressions, but I see what you have done.

Ian
 

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

No members online now.

Forum statistics

Threads
474,172
Messages
2,570,934
Members
47,473
Latest member
ChristelPe

Latest Threads

Top