Разница показывает, как вы получаете доступ к методам.
Методы класса используют разделитель ::
, чтобы указать, что сообщение может быть отправлено объекту класса / модуля, в то время как методы экземпляра используют разделитель #
, чтобы указать, что сообщение может быть отправлено экземпляру объекта.
Я собираюсь выбрать класс 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>'
Я думаю, причина того, что они не используют .
в качестве разделителя для всего, в том, что было бы неоднозначно, принадлежит ли метод классу или экземпляру. Теперь, когда я привык делать это в Ruby, я, честно говоря, считаю это недостатком соглашений других языков.
Кроме того, это в некоторой степени совершенно не связанная тема из полей , поскольку все сообщения, которые вы можете отправлять, являются сообщениями, собственно говоря, даже если оно выглядит как общедоступное поле. Конечно, ближе всего к полям относятся атрибуты или переменные экземпляра, которые всегда имеют префикс @
и не напрямую доступны извне экземпляра, если вы не используете наследование или Object#instance_variable_get
/ _set
.
Что конкретно, почему они выбрали ::
и #
? ::
имеет смысл для меня, потому что он условно разделял пространства имен, но #
, вероятно, был просто символом, который не использовался в другой номенклатуре и мог однозначно распознаваться как разделитель метода экземпляра.