[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Oddities of Ruby to a noob

Hakusa@gmail.com

5/22/2007 1:50:00 AM

I have some good experience in other languages and consider myself a
good programmer, but some of the good techniques I've picked up don't
seem to work here. Here are two examples.

x=aNum
y=0
x.times do
(y+1).times do
Stuff
end
end

y never actually increments. Why? (No pun intended.) y should go up
one x times by the end. Instead it stays at zero. And it's kind of
troubling that is does the loop once even when y is zero; or is that
just because it's a 'do' loop and not a 'for' loop?


And I've learned that to do the gets thing, I have to have
STDOUT.flush before it. It seems that no matter what I do, if it's
even two lines above the gets, I get the gets at the start of the
program even though it was towards the end. Why? If it is such a
common thing, why is STDOUT.flush not automatically called by the
language?


Although as much as this all complexes me, I am very glad to be able
to do this with guilty glee:

STDOUT.flush
puts 'Hello ' + gets.chomp

Although I have a feeling I'll rarely get to use this trick.

16 Answers

Michael Hollins

5/22/2007 2:06:00 AM

0

Hakusa@gmail.com wrote:
> I have some good experience in other languages and consider myself a
> good programmer, but some of the good techniques I've picked up don't
> seem to work here. Here are two examples.
>
> x=aNum
> y=0
> x.times do
> (y+1).times do
> Stuff
> end
> end
>
> y never actually increments. Why?

because you don't actually increment it anywhere. Perhaps you want something like:

x=5
y=0
x.times do
(y += 1).times do
puts "x = #{x} y = #{y}"
end
end

cheers,
mick

Hakusa@gmail.com

5/22/2007 2:12:00 AM

0

>
> because you don't actually increment it anywhere. Perhaps you want something like:
>
> x=5
> y=0
> x.times do
> (y += 1).times do
> puts "x = #{x} y = #{y}"
> end
> end
>
> cheers,
> mick

You'd think I'd have gotten that. Oh well. There's one problem fixed.
Thanks.

Bill Kelly

5/22/2007 2:17:00 AM

0

From: <Hakusa@gmail.com>
>
> And I've learned that to do the gets thing, I have to have
> STDOUT.flush before it. It seems that no matter what I do, if it's
> even two lines above the gets, I get the gets at the start of the
> program even though it was towards the end. Why? If it is such a
> common thing, why is STDOUT.flush not automatically called by the
> language?
>
>
> Although as much as this all complexes me, I am very glad to be able
> to do this with guilty glee:
>
> STDOUT.flush
> puts 'Hello ' + gets.chomp
>
> Although I have a feeling I'll rarely get to use this trick.

At the top of your program, try:

STDOUT.sync = true


Hope this helps,

Bill





Logan Capaldo

5/22/2007 2:24:00 AM

0

On 5/21/07, Hakusa@gmail.com <Hakusa@gmail.com> wrote:
> I have some good experience in other languages and consider myself a
> good programmer, but some of the good techniques I've picked up don't
> seem to work here. Here are two examples.
>
> x=aNum
> y=0
> x.times do
> (y+1).times do
> Stuff
> end
> end
>

That's not how times works,

a_num.times do |x|
p x
end


> y never actually increments. Why? (No pun intended.) y should go up
> one x times by the end. Instead it stays at zero. And it's kind of
> troubling that is does the loop once even when y is zero; or is that
> just because it's a 'do' loop and not a 'for' loop?
You said do the following y + 1 times.
y is zero, y + 1 is 1. therefore, execute the following block of code, once.

Other methods you may be interested in are:

0.upto(10) do |y|
p y
end

or

0.step(5, 1) do |y|
p y
end

>
>
> And I've learned that to do the gets thing, I have to have
> STDOUT.flush before it. It seems that no matter what I do, if it's
> even two lines above the gets, I get the gets at the start of the
> program even though it was towards the end. Why? If it is such a
> common thing, why is STDOUT.flush not automatically called by the
> language?
>
>
> Although as much as this all complexes me, I am very glad to be able
> to do this with guilty glee:
>
> STDOUT.flush
> puts 'Hello ' + gets.chomp
>
Look what you've written:

puts( 'Hello' + gets.chomp )

That means it must ask the user for input before it can create the
string to print.
> Although I have a feeling I'll rarely get to use this trick.
>
>
>

I would suggest you look into a ruby tutorial or book such as
Programming Ruby 2nd Ed. or Chris Pine's Learn to Program.

Avdi Grimm

5/22/2007 2:28:00 AM

0

On 5/21/07, Bill Kelly <billk@cts.com> wrote:
> STDOUT.sync = true

But don't make a habit of it. Synchronous output is a great way to
slow your code down.

--
Avdi

Todd Benson

5/22/2007 2:34:00 AM

0

On 5/21/07, Hakusa@gmail.com <Hakusa@gmail.com> wrote:
> I have some good experience in other languages and consider myself a
> good programmer, but some of the good techniques I've picked up don't
> seem to work here. Here are two examples.
>
> x=aNum
> y=0
> x.times do
> (y+1).times do
> Stuff
> end
> end
>
> y never actually increments. Why? (No pun intended.) y should go up
> one x times by the end. Instead it stays at zero. And it's kind of
> troubling that is does the loop once even when y is zero; or is that
> just because it's a 'do' loop and not a 'for' loop?
>
>
> And I've learned that to do the gets thing, I have to have
> STDOUT.flush before it. It seems that no matter what I do, if it's
> even two lines above the gets, I get the gets at the start of the
> program even though it was towards the end. Why? If it is such a
> common thing, why is STDOUT.flush not automatically called by the
> language?
>
>
> Although as much as this all complexes me, I am very glad to be able
> to do this with guilty glee:
>
> STDOUT.flush
> puts 'Hello ' + gets.chomp
>
> Although I have a feeling I'll rarely get to use this trick.
>
>
>

I can't answer the STDOUT.flush question because I've never had to use
it, but the lines

> x=aNum
> y=0
> x.times do
> (y+1).times do
> Stuff
> end
> end

doesn't change x or y. If aNum = 5, for example, the code above would
interpret as:

5.times do
1.times do
Stuff
end
end

You would do Stuff 5 times with x as 5, y as 0 and (y+1) as 1.


If you just want to have a value increment:

aNum.times do |i|
puts i
end

Note the |i| after do. This prints

0
1
2
3
4


#times isn't clear that it starts at zero from looking at it, so you
can also write:

0.upto(aNum - 1) do |i|
puts i
end

Or even

(0..4).each do |i|
puts i
end


A nested loop:

aNum.times do |i|
aNum.times do |j|
puts "i:#{i} j#{j}"
end
end

Todd

Just Another Victim of the Ambient Morality

5/22/2007 2:38:00 AM

0


<Hakusa@gmail.com> wrote in message
news:1179799925.678198.117120@u30g2000hsc.googlegroups.com...
> >
>> because you don't actually increment it anywhere. Perhaps you want
>> something like:
>>
>> x=5
>> y=0
>> x.times do
>> (y += 1).times do
>> puts "x = #{x} y = #{y}"
>> end
>> end
>>
>> cheers,
>> mick
>
> You'd think I'd have gotten that. Oh well. There's one problem fixed.
> Thanks.

Just so there are no misunderstandings, do you now understand why:

y + 1

...does not increment y? Does this seem consistent with your experience
in other programming languages?
Thank you...



Hakusa@gmail.com

5/22/2007 2:38:00 AM

0

> Look what you've written:
>
> puts( 'Hello' + gets.chomp )
>
> That means it must ask the user for input before it can create the
> string to print.

Exactly! It's awesome! I don't have to make the input and the use of
the word separate. I still need a prompt, but I've cut the middle
step.


> > Although I have a feeling I'll rarely get to use this trick.
>
> I would suggest you look into a ruby tutorial or book such as
> Programming Ruby 2nd Ed. or Chris Pine's Learn to Program.

I'm sure it's a good book, but I'm a zero budget coder at the moment.
No job and only just graduated high school.


> STDOUT.sync = true

What is it anyway? Google's not getting me much good.

Avdi Grimm

5/22/2007 2:47:00 AM

0

On 5/21/07, Hakusa@gmail.com <Hakusa@gmail.com> wrote:
> I'm sure it's a good book, but I'm a zero budget coder at the moment.
> No job and only just graduated high school.

> What is it anyway? Google's not getting me much good.

http://rub... - scads of documentation, including a few full
books, free and online.

--
Avdi

Hakusa@gmail.com

5/22/2007 2:55:00 AM

0

On May 21, 10:47 pm, "Avdi Grimm" <a...@avdi.org> wrote:
> On 5/21/07, Hak...@gmail.com <Hak...@gmail.com> wrote:
>
> > I'm sure it's a good book, but I'm a zero budget coder at the moment.
> > No job and only just graduated high school.
> > What is it anyway? Google's not getting me much good.
>
> http://ruby... scads of documentation, including a few full
> books, free and online.
>
> --
> Avdi

Awesome. Thanks.


> Just so there are no misunderstandings, do you now understand why:
>
> y + 1
>
> ...does not increment y? Does this seem consistent with your experience
> in other programming languages?
> Thank you...

I consider that a logical error. I've already rebutted how silly of me
it was to do that and had my laugh about it.