Почему я не могу вызвать метод .capitalize для моего объекта Ruby? - PullRequest
0 голосов
/ 09 ноября 2010

Вот тестовый код для Ruby.

class Me  
  puts "i am me"
end

who = Me.new

myself = who.capitalize

Я ожидаю, что вернется строка «Я есть я», но я ошибаюсь.Ruby не распознает метод .capitalize для вновь созданного объекта из уникального класса.Это нормально с возвратом who в виде строки «я есть я», но если я попытаюсь вызвать .capitalize, он не распознает метод.Почему?

Ответы [ 3 ]

4 голосов
/ 09 ноября 2010

Это потому, что метод capitalize определен в классе String.

Прежде всего, в строке puts "i am me" вы просто выполняете метод puts,После выполнения строка «я есть я» исчезла, поскольку вы не имеете на нее никакой ссылки, и она не имеет ничего общего с классом Me.

Возможно, этот код отражает то, что вы пытаетесь сделать

class Me

  # Returns the string, can be executed by instances of class Me
  def to_s
    "i am me"
  end

end

puts Me.new.to_s.capitalize
3 голосов
/ 09 ноября 2010

Я думал, что все объекты 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.newputs "i am me" необходимо поместить в метод Me initialize.Но даже в этом случае вы не сможете вызывать String методы для Me объектов.

Также у вас создается впечатление, что вы можете изменить строку после того, как она уже напечатана.Это, конечно, невозможно.Как только вы вызываете puts для строки, она появляется на экране, и вы не можете ее вернуть (хорошо, вы могли бы использовать termios или специфичные для терминала последовательности управления, но это не главное).

1 голос
/ 09 ноября 2010

Как я вижу в своих документах, только String и Symbol имеют метод capitalize. Так что только они и их дочерние классы имеют это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...