Что вас смущает, так это разница между методами класса и экземпляра.
Методы класса не имеют явного получателя, поэтому self
не имеет доступа к другим полям с помощью. Они просто ... есть.
Обычно методы экземпляра используются для запроса или манипулирования атрибутами данного объекта, тогда как методы класса являются «вспомогательными» или «фабричными» методами, которые предоставляют некоторую функциональность, связанную или особенно полезную для определенного типа класса, но не зависит от реальных живых экземпляров (объектов) этого класса.
Не уверен насчет Ruby, но в Java есть (например) целый класс, Math
, который не содержит ничего, кроме методов экземпляра, таких как sin()
, max()
, exp()
и т. Д. Нет "Math" объект, это просто методы, которые воплощают математические алгоритмы. Не лучший пример, потому что в Ruby эти методы, вероятно, встроены прямо в числовые классы как методы экземпляра.
Случай, который вы упоминаете, немного сбивает с толку, потому что метод Array
()
и метод Kernel
Array()
на самом деле являются разными методами, которые делают подобные вещи. Оба являются методами класса.
Array()
принимает список аргументов, создает и возвращает массив, содержащий их.
Kernel.Array()
принимает один аргумент типа "массива", такого как последовательность, и принимает значения, возвращаемые этим аргументом, и строит массив из них.
UPDATE
Возможно, голосование было оправданным; Я прошу прощения за то, что взял предмет за пределами моей области знаний. Я думаю, что скоро буду удалять этот ответ.
@ Чак: Я искренне надеюсь, что официальная документация языка / библиотеки предложит несколько значимых подсказок о том, как это работает. Это то, с чем я советовался, отвечая на этот вопрос.
RDOC для Kernel.Array()
:
Возвращает arg как массив. Сначала пытается вызвать arg.to_ary, затем arg.to_a. Если оба не удаются, создается один массив элементов, содержащий arg (если arg не равен nil).
для Array.()
:
Возвращает новый массив, заполненный данными объектами.
Я не знаю о вас, но я думаю, что если документы сильно отличаются, то либо они говорят об отдельных методах, либо документация - крушение поезда.
@ freeknight:
Но все в ruby - это какой-то объект, даже классы и модули. А Kernel.Array на самом деле является вызовом метода для конкретного объекта - объекта Kernel.
Да, под обложками это похоже на Java. Но метод Array()
ничего не делает с ядром, более чем Array()
ничего не делает с объектом класса Array
, так что на самом деле это всего лишь семантический спор. Это метод экземпляра, потому что вы можете повесить его на класс IPSocket
, если вы достаточно сумасшедший, и он все равно будет работать так же.