Разница указывает, как вы получаете доступ к методам.
Методы класса использовать ::
разделитель, чтобы указать, что сообщение может быть отправлено на объект класса/модуля, в то время как методы экземпляра использовать #
разделитель, чтобы указать, что сообщение может быть отправлено на объект экземпляра.
Я собираюсь выбрать класс Complex
(в Ruby 1.9), чтобы продемонстрировать разницу. У вас есть как Complex::rect
, так и Complex#rect
. Эти методы имеют различную сущность, и они служат совершенно другим целям. Complex::rect
принимает реальный и воображаемый аргумент, возвращая новый экземпляр Complex
, а Complex#rect
возвращает массив реальных и мнимых компонентов экземпляра.
ruby-1.9.1-p378 > x = Complex.rect(1,5)
=> (1+5i)
ruby-1.9.1-p378 > x.rect
=> [1, 5]
ruby-1.9.1-p378 > x.rect(2, 4) # what would this even do?
ArgumentError: wrong number of arguments(2 for 0)
from (irb):4:in `rect'
from (irb):4
from /Users/mr/.rvm/rubies/ruby-1.9.1-p378/bin/irb:17:in `<main>'
Я думаю, что причина того, что они не используют .
в качестве разделителя для всего, что это будет неоднозначным, принадлежит ли метод класса или экземпляра. Теперь, когда я привык к тому, чтобы Руби это делал, я действительно считаю это недостатком конвенций других языков, если честно.
Кроме того, это несколько из совершенно несвязанной темы от полех потому, что все сообщения, которые вы можете отправить это сообщения, собственно говоря, даже если она выглядит как общедоступное поле. Самое близкое, что у вас есть к полям - это атрибуты или переменные экземпляра, которые всегда имеют префикс @
и не являются напрямую доступны извне экземпляра, если вы не используете наследование или Object#instance_variable_get
/_set
.
Что конкретно конкретно они выбрали ::
и #
? ::
имеет смысл для меня, потому что он условно разделял пространства имен, но #
был, вероятно, просто символом, который не использовался в другой номенклатуре и мог однозначно распознаваться как разделитель экземпляров.
Я хочу знать, почему это соглашение не упоминается/объясняется в книгах/учебниках при обсуждении соглашений об именах рубинов. Я сбив с толку вижу имена методов с префиксом «#» в различных дискуссиях и только в состоянии угадать, какое значение имел префикс. Тот факт, что '#' начинает комментарий в источнике .rb, делает его вдвойне запутанным. Как вы можете себе представить, это не самая легкая вещь для поиска, поэтому спасибо, что спросили об этом где-нибудь, я смог наткнуться на нее. Интересно, смогу ли я снова найти его, когда забуду эти данные за 6 месяцев без рубиновой активности ... –