简体   繁体   中英

Using puts method in Ruby to get the same output as printing in a loop

thanks for clicking. I'm learning Ruby from this tutorial .

And here's a bit of code for a method that gives square values.

def first_square_numbers(number_of_squares)
 squares = []

 idx = 0
 while idx < number_of_squares
  squares.push(idx * idx)
  idx = idx + 1
 end

 return squares
end

puts("How many square numbers do you want?")
number_of_desired_squares = gets.to_i
squares = first_square_numbers(number_of_desired_squares)

idx = 0
while idx < squares.length
 puts(squares[idx])
 idx = idx + 1
end

# Output:
#   How many square numbers do you want?
#   7
#   0
#   1
#   4
#   9
#   16
#   25
#   36

My question is, in order to print the output, instead of this code:

 idx = 0
 while idx < squares.length
  puts(squares[idx])
  idx = idx + 1
 end

Can I just put this?

puts(squares)

I tried it and got the same result but I'm not sure which is "more correct" and why.

Thanks!

puts squares

is, without doubts, more correct since it's an idiomatic Ruby. Another option is to use the each iterator method:

squares.each { |n| puts n }

But in this case puts is enough.

Yes you should use puts squares instead (no need for the parentheses here either) because it's more readable and cleaner and well there's no need to re-invent the wheel etc.

Although your overall code works fine, in Ruby it would be better to do something like:

puts "How many squares do you want?"
puts (1..gets.to_i).map {|i| i**2 }

How it works...

Suppose the user enters 7 :

1..gets.to_i #creates a range from 1 to the user's input
  #=> 1..7

map {|i| i**2 } #takes each element from 1..7, squares it and puts in an array
  #=> [1, 4, 9, 16, 25, 36, 49]

puts #prints out each element of the above array on a new line:
  #=>
  #1
  #4
  #9
  #16
  #25
  #36
  #49

For further information see documentation for Range and Enumerable#map .

If you call puts with an array, it will print out the elements line by line. The behavior is exactly the same as your loop version.

See the documents here

If called with an array argument, writes each element on a new line.

PS It's more practical to use built-in iteration methods to operate on all the elements in an array:

squares.each do |square|
  puts(square)
  # possibly some other operations on the element
end

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM