Почему этот объект 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 ответов:
inspect
используется больше для отладки иto_s
для конечного пользователя или отображения.например,
[1,2,3].to_s
и[1,2,3].inspect
производить различные вывода.
inspect
- Это метод, который по умолчанию сообщает вам имя класса, экземплярobject_id
, и перечисляет переменные экземпляра экземпляра.
puts
используются, как вы уже знаете, чтобы ставить стоимость объектаto_s
методSTDOUT
. Как указано в документации Ruby,Object#to_s
возвращает строку, представляющую объект -- используемый для удобства чтения конечным пользователем.
puts
идентичны друг другу кромеputs
автоматически добавляет новую строку, в то время как
для сравнения с 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
выводит результатinspect
ing объект.есть тонкая разница между
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