Использование метода puts в Ruby для получения того же вывода, что и печать в цикле

спасибо за клик. Я изучаю Ruby по этому руководству.

А вот немного кода для метода, который дает квадратные значения.

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

Мой вопрос заключается в том, чтобы распечатать вывод вместо этого кода:

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

Могу я просто поставить это?

puts(squares)

Я попробовал и получил тот же результат, но я не уверен, что "более правильно" и почему.

Спасибо!


person fafafariba    schedule 21.08.2016    source источник
comment
Итак, вы хороший ученик, который любит исследования. Да, puts печатает массивы по одному элементу в строке, так что ваш код абсолютно правильный. По мере изучения Ruby вы обнаружите, что все циклы не нужны, и мы можем написать весь скрипт всего в 3 строки.   -  person Aetherus    schedule 21.08.2016


Ответы (3)


puts squares

без сомнения, более правильно, так как это идиоматический Ruby. Другой вариант — использовать метод итератора each:

squares.each { |n| puts n }

Но в данном случае puts достаточно.

person dskecse    schedule 21.08.2016

Да, вы должны использовать вместо этого puts squares (здесь также нет необходимости в скобках), потому что это более читабельно и чище, и нет необходимости изобретать велосипед и т. д.

Хотя ваш общий код работает нормально, в Ruby было бы лучше сделать что-то вроде:

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

Как это работает...

Предположим, пользователь вводит 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

Для получения дополнительной информации см. документацию для Range и Enumerable#map.

person Sagar Pandya    schedule 21.08.2016

Если вы вызовете puts с массивом, он выведет элементы построчно. Поведение точно такое же, как у вашей версии цикла.

См. документы здесь

При вызове с аргументом массива записывает каждый элемент в новую строку.

P.S. Практичнее использовать встроенные методы итерации для работы со всеми элементами массива:

squares.each do |square|
  puts(square)
  # possibly some other operations on the element
end
person Arie Xiao    schedule 21.08.2016