Ответ 1
inspect
используется больше для отладки и to_s
для конечных пользователей или для показа.
Например, [1,2,3].to_s
и [1,2,3].inspect
производят другой вывод.
Почему этот объект 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
to_s
и inspect
?puts
, print
и p
?Если я прокомментирую функцию to_s
или inspect
, я получаю следующее.
#<Graph:0x100124b88>
#<Graph:0x100124b88>
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
, который вы вызываете, когда вам нужен String-подобный объект, а не только строковое представление. (Попробуйте в IRB: [1,2,3].to_str
, и он потерпит неудачу, но [1,2,3].to_s
не будет.) Я чувствую, что должен упомянуть об этом, потому что я был укушен им раньше:)
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
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
Для тех, кто прибыл сюда после запуска Ruby Koans, простой пример того, где to_s
и inspect
отличается в выходе, это
nil.to_s # will yield an empty string, ie ""
nil.inspect # will yield the string "nil"
Ответа на этот вопрос Chris Pine Learn To Program book
"Метод проверки очень похож на to_s, за исключением того, что возвращаемая строка пытается показать вам код ruby для создания объекта, который вы его передали".
Таким образом, метод проверки возвращает массив, например, такой как...
[25, 16, 9, 4, 1, 0]
Где, когда puts/to_s вернет
25
16
9
4
1
0
Обратитесь к следующей ссылке за дополнительной информацией и примерами, объясняющими разницу между "to_s" и "проверкой", а также разницу между "puts" и "p". https://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/45-more-classes/lessons/108-displaying-objects