Например, я всегда видел методы, называемые как String#split
, но никогда String.split
, который кажется немного более логичным. Или возможно ровный String::split
, потому что Вы могли рассмотреть #split
быть в пространстве имен String
. Я даже видел один только метод, когда класс принимается/подразумевается (#split
).
Я понимаю, что это - способ, которым методы определяются в ri. Который был на первом месте?
Это должно дифференцировать, например, методы от полей? Я также услышал, что это помогает, дифференцирует методы экземпляра от методов класса. Но где это запускалось?
Разница указывает на способ доступа к методам.
Методы класса используют разделитель ::
, чтобы указать, что сообщение может быть отправлено объекту класса / модуля, в то время как методы экземпляра используют #
], чтобы указать, что сообщение может быть отправлено объекту-экземпляру.
Я собираюсь выбрать класс 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 делает это, я, честно говоря, вижу в этом недостаток для соглашений других языков.
Кроме того, эта тема совершенно не связана с полями , потому что все сообщения, которые вы можете отправлять, являются сообщениями, собственно говоря, даже если они выглядят как общедоступное поле.Самым близким к полям, конечно же, являются атрибуты или переменные экземпляра, которые всегда имеют префикс @
и не напрямую доступны извне, если вы не используете наследование или Объект № instance_variable_get
/ _set
.
Что конкретно, почему они выбрали ::
и #
? ::
имеет смысл для меня, потому что он условно разделяет пространства имен, но #
, вероятно, был просто символом, который не использовался в другой номенклатуре и мог однозначно распознаваться как разделитель метода экземпляра .
Я понимаю, что это способ обозначения методов в ri. Что было первым?
Да, именно отсюда. Когда вы используете #
, он автоматически добавляет гиперссылки на ваши методы, поэтому ссылки на другие методы в документации начинаются с префикса #
. См. здесь :
Имена классов, исходных файлов и любых имен методов, содержащих подчеркивание или которым предшествует символ решетки, автоматически связываются гиперссылками от текста комментария к их описанию.
Однако вы не можете вызвать метод таким образом. Но это не должно вызывать удивления; в конце концов,
- недопустимый оператор в C #, несмотря на то, что он является допустимым тегом документации.