2014-02-01 3 views

ответ

1

print "#{foo}" - здесь вы делаете объект строки interpolation.Whatever будет ссылаться на foo (если это локальная переменная), возвращается из foo (если это метод), по этому результату String#to_s будут применены.

print foo выведет объект будет ссылаться foo (если это локальная переменная), возвращается из foo (если это метод), на этом результате #to_s будет применяться.

1

Выражение print "#{foo}" примерно переводит на print foo.to_s.

Kernel#print - это тонкая обертка вокруг IO#print, которая ультимативно называет IO#write. Из write «s документации:

[...] Если аргумент не является строкой, то он будет преобразован в строку с помощью to_s. [...]

Так что, в конце концов, нет никакой разницы. print "#{foo}", однако, сначала создаст строковое представление foo и, во-вторых, интерполирует результат, который приведет к пустой строке, но я думаю, что это могло бы (было) легко оптимизироваться интерпретатором.

+0

Еще одна вещь, о которой нужно помнить, если вы вернетесь и сделаете что-то большее для вывода, маршрут интерполяции строк может быть более привлекательным. print "this: # {foo}" немного легче читать, чем напечатать "this" + foo.to_s –

0

Нет никакой разницы, они оба применяют to_s неявно в какой-то момент. Вы должны использовать print x, а не print "#{x}". Зачем вам интересно, что использовать? print "#{x}", очевидно, менее прост, чем print x.

0

print name обычно используется, если вам нужно только распечатать эту вещь и ничего более.

Строковая интерполяция используется, когда вы хотите вставить значения в другие строки.

print "My name is #{my_name} and I am currently #{my_age} years old." 

Можно даже вставить некоторую логику:

print "My name is #{my_name.capitalize} and" 
print "I am currently #{my_age} year#{my_age>1 ? 's':''} old." #print years instead of year if age is greater than 1. 
Смежные вопросы