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