Вызов.methods в классе против экземпляра в Ruby

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

2 ответа

Решение

Ты путаешь .methods() с .instance_methods(),

Первый даст вам методы, которые могут быть вызваны на String объект - это String класс как сам объект. Второй даст вам методы объектов, созданных с использованием String класс или экземпляры String,

Длина и размер являются методами экземпляра String, почему они должны быть включены в список методов класса (String)? Классы являются объектами и имеют свои собственные методы.

Другими словами, вы получите список методов, поддерживаемых объектом, для которого вы его вызываете. String - это класс, поэтому вы получаете его конкретные методы класса, а также методы класса, которые он наследует.

Экземпляр строки - это экземпляр, поэтому вы получаете методы экземпляра строки и методы экземпляра, которые он наследует.

Другие вопросы по тегам