@Wamsmer

Интерполяция строк в Ruby и методы times, upto и downto. Как правильно вписать в строку?

Есть задача. Вывести в консоль 10 раз (с новой строки) слово "Привет" и приставить к нему Восклицательный знак. На каждой итерации количество Восклицательных знаков должно увеличиваться на 1.
Пример:
Привет!
Привет!!
Привет!!!
и т.д.
Написал так:
1.upto(10) {|x| puts"Hello #{x.times { print "!"}}"}

Но получил странный результат:
!Hello1
!!Hello2
!!!Hello3
!!!!Hello4
Вопросы:
1. Почему первым выводится результат выражения x.times { print "!"}?
2. Почему выводится x, если в коде он участвует, как часть функции?
3. Возможно ли вообще написать это в одну строчку с данными методами?

Есть решение со знаком умножения
1.upto(10) {|x| puts "Hello#{"!"*x}"}
но хочется понять - почему выводятся данные в такой последовательности и со значением x.
Заранее благодарю за ответы.
  • Вопрос задан
  • 651 просмотр
Решения вопроса 1
roswell
@roswell
и швец, и жнец, и на дуде игрец
1. Выражение #{ x.times... } в двойных кавычках было развернуто в первую очередь, ну а там внутри -- print, как было его не вызвать. Отсюда восклицательные знаки перед Hello.
2. Любой блок в Ruby, в том числе и #{ ... } возвращает последнее вычисленное значение (результат вызова x.times { ... }, в данном случае), поэтому после вывода восклицательных знаков и строчки Hello интерпретатор подставил вместо выражения результат его вычисления.
3. Решение уже есть в вопросе.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы