Вызов.methods в классе против экземпляра в Ruby
Надеюсь опросить коллективное сознание здесь, так как я не могу структурировать это таким образом, чтобы найти ответ через поиск. В Ruby 1.9+ вызов метода.methods для экземпляра даст результаты, отличные от класса этого экземпляра. Например, "foo".methods будет включать "length" и "size", тогда как String.methods не будет. Что является причиной этого? Я опытный программист, но плохо знаком с Ruby. Насколько я понимаю, методы должны включать в себя все методы-предки, поэтому в микшине или другом шаблоне длина и размер добавляются в список экземпляра, но не в класс?
2 ответа
Ты путаешь .methods()
с .instance_methods()
,
Первый даст вам методы, которые могут быть вызваны на String
объект - это String
класс как сам объект. Второй даст вам методы объектов, созданных с использованием String
класс или экземпляры String
,
Длина и размер являются методами экземпляра String, почему они должны быть включены в список методов класса (String)? Классы являются объектами и имеют свои собственные методы.
Другими словами, вы получите список методов, поддерживаемых объектом, для которого вы его вызываете. String - это класс, поэтому вы получаете его конкретные методы класса, а также методы класса, которые он наследует.
Экземпляр строки - это экземпляр, поэтому вы получаете методы экземпляра строки и методы экземпляра, которые он наследует.