Я думал, что все объекты Ruby могут вызывать метод .capitalize
Нет.Вы можете вызывать some_obj.some_method
тогда и только тогда, когда класс some_obj
или один из его суперклассов или включенных модулей определяет метод some_method
.Это означает, что для вызова метода для любого объекта его необходимо определить в классе Object
, который является суперклассом всех классов (или одного из включенных в него модулей).
capitalize
не определено в Object
определено в String
и не зря.42.capitalize
или [].capitalize
не имеет смысла.
class Me
puts "i am me"
end
Этот код, вероятно, не делает то, что вы думаете.При первом чтении определения класса Me
будет напечатана строка i am me
.Это не определяет поведение класса Me
.По сути это то же самое, что и
class Me
end
puts "i am me"
Т.е. вы создаете пустой класс.
Если вы намеревались печатать строку i am me
каждый раз, когда вы делаете Me.new
puts "i am me"
необходимо поместить в метод Me
initialize
.Но даже в этом случае вы не сможете вызывать String
методы для Me
объектов.
Также у вас создается впечатление, что вы можете изменить строку после того, как она уже напечатана.Это, конечно, невозможно.Как только вы вызываете puts
для строки, она появляется на экране, и вы не можете ее вернуть (хорошо, вы могли бы использовать termios
или специфичные для терминала последовательности управления, но это не главное).