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


почему этот рубиновый объект как A to_s и inspect методы, которые, кажется, делают то же самое?

The 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__ == 
  gr = Graph.new
  p gr
  print gr
  puts gr
end

я

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

если я закомментировать to_s или

9 56

9 ответов:

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

например, [1,2,3].to_s и [1,2,3].inspect производить различные вывода.

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

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

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

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

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

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

есть тонкая разница между 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

для тех, кто прибывает сюда после начала с Руби Коаны простейший пример, где to_s и inspect отличаются по выходу это:

nil.to_s     # will yield an empty string, ie ""
nil.inspect  # will yield the string "nil"
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 

С Учебник Рельсов

ответ от Криса Пайна научиться программировать книгу

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

таким образом, метод inspect вернет массив, например, как это...

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

куда как ставит / to_s вернет

25
16
9
4
1
0

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