Почему этот объект 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выводит результат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