Вопрос о методе to_s Руби (из книги Axe, 2-е издание) - PullRequest
1 голос
/ 13 апреля 2010

Согласно книге топоров (2-е издание), мы можем использовать to_s следующим образом.

class Song
  def to_s
    "Song"
  end
end

song = Song.new()
song.to_s

Но это ничего не дает, чтобы напечатать что-то на стандартный вывод, я должен запустить

  def to_s
    p "Song"  
  end

Есть ли какие-либо изменения после выпуска ruby ​​1.8.2, когда книга была написана? Информация о моей рубиновой версии 1.8.7 для Mac.

ruby 1.8.7 (2009-06-08, уровень исправления 173) [universal-darwin10.0]

Ответы [ 5 ]

3 голосов
/ 13 апреля 2010

В книге «Кирка» используется общее обозначение, например:

song.to_s & rarr; "Song: My Way--Sinatra (225)"

, чтобы указать, что "Song: My Way--Sinatra (225)" является значением выражения слева. Однако он не распечатывается, если вы явно не используете puts.

Соответствующая реализация to_s для объекта будет возвращать строковое представление этого объекта (например, имя человека или заголовок и идентификатор для сообщения в блоге), но фактически не будет иметь никаких побочных эффектов (таких как вывод чего-то.)

Если вы используете irb, интерактивный интерпретатор Ruby выводит для вас значение каждого выражения без явного puts. например,

$ irb
irb(main):001:0> 2 + 2
=> 4
2 голосов
/ 13 апреля 2010

Этот пример может быть введен в REPL, например irb, который будет выглядеть так:

irb> class Song
  ..   def to_s
  ..     "Song"
  ..   end
  .. end
  => nil
irb> song = Song.new()
  => Song
irb> song.to_s
  => "Song"
1 голос
/ 13 апреля 2010

В вашем случае вы бы хотели, чтобы ваши последние строки были:

song = Song.new
puts song.to_s
0 голосов
/ 13 апреля 2010

Это потому, что вышеприведенный метод просто возвращает «песню», он не печатает ее. Ваша программа должна сама печатать.

0 голосов
/ 13 апреля 2010

Право, to_s всегда только что преобразовал объект в строку. Ваша программа может затем использовать эту строку, например, записав ее в стандартный вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...