[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

simple, simple array question

Peter Bailey

4/8/2008 1:35:00 PM

Hi,
I need to cap-and-lowercase words in strings of XML data. Why is this
happening in this test?

stuff = [ "This", "is", "a", "test" ]
stuff.collect { |x| puts x.capitalize! }

I get:

nil
Is
A
Test

Program exited with code 0

What's with the "nil?"

Thanks,
Peter
--
Posted via http://www.ruby-....

7 Answers

Sam Rudd

4/8/2008 1:42:00 PM

0

[Note: parts of this message were removed to make it a legal post.]

I'm hardly any good at Ruby yet, but isn't "Test" already capitalized? Maybe
that's why it's nil?

On Tue, Apr 8, 2008 at 2:35 PM, Peter Bailey <pbailey@bna.com> wrote:

> Hi,
> I need to cap-and-lowercase words in strings of XML data. Why is this
> happening in this test?
>
> stuff = [ "This", "is", "a", "test" ]
> stuff.collect { |x| puts x.capitalize! }
>
> I get:
>
> nil
> Is
> A
> Test
>
> Program exited with code 0
>
> What's with the "nil?"
>
> Thanks,
> Peter
> --
> Posted via http://www.ruby-....
>
>

Arlen Cuss

4/8/2008 1:42:00 PM

0

[Note: parts of this message were removed to make it a legal post.]

Hi,

I'm so tired, so here's a succinct answer:

`capitalize!' (with the exclamation mark on the end) actually changes `x'
itself:

>> a = "boo"
=> "boo"
>> a.capitalize!
=> "Boo"
>> a
=> "Boo"
>>

Notice how `a' has a new value. Now, what if we try to capitalize! again?

>> a.capitalize!
=> nil
>> a
=> "Boo"
>>

It returns nil. `a' is still "Boo" - the thing is, capitalize! returns nil
because `a' didn't change. With your example, `This' is already capitalized,
so no change occurred. What you really want is `x.capitalize' - it just
returns the value of x capitalized, whatever that is:

>> a = "boo"
=> "boo"
>> a.capitalize
=> "Boo"
>> a
=> "boo"
>>

It also doesn't change `x' - not that it would matter much in your given
example.

Also, though it's probably just your test, but note that you're not saving
the result of `collect' anywhere. As an example:

>> a = %w(This is a test.)
=> ["This", "is", "a", "test."]
>> a = %w(This is a test)
=> ["This", "is", "a", "test"]
>> a.collect {|x| x.capitalize}
=> ["This", "Is", "A", "Test"]

We get this answer, but ...

>> a
=> ["This", "is", "a", "test"]

It's still lowercase! So we can use the collect! method to alter the
original:

>> a.collect! {|x| x.capitalize}
=> ["This", "Is", "A", "Test"]
>> a
=> ["This", "Is", "A", "Test"]
>>

Or you could assign the result of `collect'.

And I'm out for the night.

HTH,
Arlen

On Tue, Apr 8, 2008 at 11:35 PM, Peter Bailey <pbailey@bna.com> wrote:

> Hi,
> I need to cap-and-lowercase words in strings of XML data. Why is this
> happening in this test?
>
> stuff = [ "This", "is", "a", "test" ]
> stuff.collect { |x| puts x.capitalize! }
>
> I get:
>
> nil
> Is
> A
> Test
>
> Program exited with code 0
>
> What's with the "nil?"
>
> Thanks,
> Peter
> --
> Posted via http://www.ruby-....
>
>

Sam Rudd

4/8/2008 1:43:00 PM

0

[Note: parts of this message were removed to make it a legal post.]

Sorry, I meant "This" already capitalized. Try it lowercase?

On Tue, Apr 8, 2008 at 2:41 PM, Sam Rudd <kanden123@googlemail.com> wrote:

> I'm hardly any good at Ruby yet, but isn't "Test" already capitalized?
> Maybe that's why it's nil?
>
> On Tue, Apr 8, 2008 at 2:35 PM, Peter Bailey <pbailey@bna.com> wrote:
>
> > Hi,
> > I need to cap-and-lowercase words in strings of XML data. Why is this
> > happening in this test?
> >
> > stuff = [ "This", "is", "a", "test" ]
> > stuff.collect { |x| puts x.capitalize! }
> >
> > I get:
> >
> > nil
> > Is
> > A
> > Test
> >
> > Program exited with code 0
> >
> > What's with the "nil?"
> >
> > Thanks,
> > Peter
> > --
> > Posted via http://www.ruby-....
> >
> >
>

Arlen Cuss

4/8/2008 1:43:00 PM

0

[Note: parts of this message were removed to make it a legal post.]

Hi,

And excuse my top-posting, I really am tired!

Cheers,
Arlen

Tim Hunter

4/8/2008 1:45:00 PM

0

Peter Bailey wrote:
> What's with the "nil?"

capitalize! returns nil when the string is already capitalized. Use
capitalize instead. Also, you don't need the puts inside the block.

stuff.collect { |x| x.capitalize }
puts stuff
--
Posted via http://www.ruby-....

Peter Hickman

4/8/2008 1:47:00 PM

0

Peter Bailey wrote:
> Hi,
> I need to cap-and-lowercase words in strings of XML data. Why is this
> happening in this test?
>
> stuff = [ "This", "is", "a", "test" ]
> stuff.collect { |x| puts x.capitalize! }
>
> I get:
>
> nil
> Is
> A
> Test
>
> Program exited with code 0
>
> What's with the "nil?"
>
> Thanks,
> Peter
>
This is because you are using collect where, I suspect, you want to use
each or perhaps drop the puts.

irb(main):004:0> stuff = [ "This", "is", "a", "test" ]
=> ["This", "is", "a", "test"]
irb(main):005:0> stuff.collect{|x| x.capitalize }
=> ["This", "Is", "A", "Test"]
irb(main):006:0>

Maybe that is what you want.

Peter Bailey

4/8/2008 1:55:00 PM

0

Peter Hickman wrote:
> Peter Bailey wrote:
>> Is
>> A
>> Test
>>
>> Program exited with code 0
>>
>> What's with the "nil?"
>>
>> Thanks,
>> Peter
>>
> This is because you are using collect where, I suspect, you want to use
> each or perhaps drop the puts.
>
> irb(main):004:0> stuff = [ "This", "is", "a", "test" ]
> => ["This", "is", "a", "test"]
> irb(main):005:0> stuff.collect{|x| x.capitalize }
> => ["This", "Is", "A", "Test"]
> irb(main):006:0>
>
> Maybe that is what you want.


Thanks all you guys. Yeh, I feel kinda' dumb. That first word was
already capitalized. Duh.

Cheers,
-Peter

--
Posted via http://www.ruby-....