Подтвердить что ты не робот

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

Почему этот объект 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>
4b9b3361

Ответ 1

inspect используется больше для отладки и to_s для конечных пользователей или для показа.

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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 Tutorial

Ответ 7

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

nil.to_s     # will yield an empty string, ie ""
nil.inspect  # will yield the string "nil"

Ответ 8

Ответа на этот вопрос Chris Pine Learn To Program book

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

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

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

Где, когда puts/to_s вернет

25
16
9
4
1
0