Почему у этого объекта Ruby есть методы to_s и inspect, которые, по-видимому, делают одно и то же? - PullRequest
61 голосов
/ 13 апреля 2010

Почему этот объект Ruby и методы to_s и inspect, похоже, делают одно и то же?

Метод p вызывает inspect и вызывает / печатает вызовы to_s для представления объекта.

Если я бегу

class Graph
  def initialize
    @nodeArray = Array.new
    @wireArray = Array.new
  end
  def to_s # called with print / puts
    "Graph : #{@nodeArray.size}"
  end
  def inspect # called with p
    "G"
  end
end

if __FILE__ == $0
  gr = Graph.new
  p gr
  print gr
  puts gr
end

Я получаю

G
Graph : 0
Graph : 0
  • Тогда почему в Ruby две функции выполняют одно и то же? В чем разница между to_s и inspect?
  • А в чем разница между puts, print и p?

Если я закомментирую функцию to_s или inspect, я получу следующее:

#<Graph:0x100124b88>
#<Graph:0x100124b88>

Ответы [ 9 ]

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

inspect используется больше для отладки, а to_s - для конечного пользователя или для отображения.

Например, [1,2,3].to_s и [1,2,3].inspect производят разные выходные данные.

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

inspect - это метод, который по умолчанию сообщает имя класса, object_id экземпляра и выводит список переменных экземпляра экземпляра.

print и puts используются, как вы уже знаете, для установки значения метода to_s объекта на STDOUT. Как указано в документации Ruby, Object#to_s возвращает строку, представляющую объект - используемую для удобства чтения конечным пользователем.

print и puts идентичны друг другу, за исключением того, что puts автоматически добавляет символ новой строки, а print - нет.

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

Для сравнения с Python to_s - это __str__, а inspect - __repr__. to_s дает вам строку, тогда как inspect дает вам строковое представление объекта. Вы можете использовать последний для создания объекта, если хотите.

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

Кроме того, существует метод to_str для определенных объектов, который вы вызываете, когда вам нужен объект типа String, а не просто строковое представление. (Попробуйте в IRB: [1,2,3].to_str, и он потерпит неудачу, но [1,2,3].to_s не будет.) Я чувствую, что должен упомянуть об этом, потому что меня это укусило раньше:)

4 голосов
/ 11 февраля 2016

Для тех, кто прибывает сюда после начала с Ruby Koans , простой пример того, как to_s и inspect отличаются по выходу:

3 голосов
/ 14 июля 2015

puts обычно печатает результат применения to_s к объекту, в то время как p печатает результат inspect ввода объекта.

Существует небольшая разница между inspect и to_s:

  • inspect при применении к объекту возвращает шестнадцатеричный код объекта вместе с переменной экземпляра
  • to_s при применении к объекту возвращает только шестнадцатеричный код объекта

    class Item
     def initialize(abc)
      @abc=abc
     end
    end
    
    x= Item.new(22)
    
    puts x         #prints object x hex code  
    puts x.inspect #prints object x hex code WITH INSTANCE VARIABLE @abc 
    puts x.to_s    #prints object x hex code
    
    p x            #prints object x hex code WITH INSTANCE VARIABLE @abc
    p x.inspect    #prints object x hex code WITH INSTANCE VARIABLE @abc
    p x.to_s       #prints object x hex code
1 голос
/ 02 июня 2017

Ответ из книги Криса Пайна «Учись программированию»

"Метод inspect во многом похож на to_s, за исключением того, что возвращаемая строка пытается показать вам код ruby ​​для построения объекта, который вы передали."

Таким образом, метод inspect будет возвращать массив, например, такой ...

[25, 16, 9, 4, 1, 0] 

Где, как будет возвращать пут / to_s

25
16
9
4
1
0
1 голос
/ 21 сентября 2013
2.0.0p195 :075 > puts (1..5).to_a                  # Put an array as a string.
1
2
3
4
5
=> nil 
2.0.0p195 :076 > puts (1..5).to_a.inspect          # Put a literal array.
[1, 2, 3, 4, 5]
=> nil 
2.0.0p195 :077 > puts :name, :name.inspect
name
:name
=> nil 
2.0.0p195 :078 > puts "It worked!", "It worked!".inspect    
It worked! 
"It worked!"
=> nil 
2.0.0p195 :079 > p :name                           # Same as 'puts :name.inspect'
:name
=> :name 

Из учебника Rails

0 голосов
/ 13 августа 2014

Обратитесь по следующей ссылке для получения дополнительной информации и примеров, объясняющих разницу между «to_s» и «inspect», а также разницу между «put» и «p». https://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/45-more-classes/lessons/108-displaying-objects

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