Oddities of Ruby to a noob

H

Hakusa

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.
 
H

Hakusa

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.
 
B

Bill Kelly

From: said:
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
 
L

Logan Capaldo

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.
 
T

Todd Benson

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
 
J

Just Another Victim of the Ambient Morality

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...
 
H

Hakusa

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.

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.
 
H

Hakusa

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

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.
 
B

Bill Kelly

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

Do you have `ri` installed on your system?

$ ri IO#sync=

--------------------------------------------------------------- IO#sync=
ios.sync = boolean => boolean
------------------------------------------------------------------------
Sets the ``sync mode'' to +true+ or +false+. When sync mode is
true, all output is immediately flushed to the underlying operating
system and is not buffered internally. Returns the new state. See
also +IO#fsync+.

f = File.new("testfile")
f.sync = true

_(produces no output)_


As Avdi Grimm pointed out, unnecessarily using unbuffered I/O can
slow down your program. So if you're worried about that, keep using
flush only when you need it, as you were already doing.

But anyway, setting IO#sync = true is essentially telling the I/O
subsystem to do a flush for you after every write to that file
descriptor.


Regards,

Bill
 
J

Just Another Victim of the Ambient Morality

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.


Yeah, sorry about that. Your post seemed ambiguous to me and I just
wanted to make sure, for my own piece of mind...
Thanks...
 
B

Brian Candler

A

akbarhome

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.

When I graduated from high school, I only know about clipper
programming language. :( You are much luckier than me.

I find these tutorials all you need to be advanced in ruby
programming.
http://poignantguide.net/ruby/index.html
http://www.sapphiresteel.com/The-Little-Book-Of-Ruby
http://www.troubleshooters.com/codecorn/ruby/basictutorial.htm

After finishing tutorial, come often to these blogs:
http://www.rubyinside.com/
http://www.rubyfleebie.com/
 

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
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top