Каково обоснование / история соглашения об идентификации методов в Ruby? - PullRequest
9 голосов
/ 26 июня 2010

Например, я всегда видел методы, называемые String#split, но никогда не String.split, что кажется немного более логичным.Или, может быть, даже String::split, потому что вы можете считать #split в пространстве имен String.Я даже видел один метод, когда класс предполагается / подразумевается (#split).

Я понимаю, что именно так методы идентифицируются в ri.Что появилось раньше?

Разве это, например, чтобы отличать методы от полей?Я также слышал, что это помогает отличать методы экземпляра от методов класса.Но где это началось?

Ответы [ 2 ]

8 голосов
/ 26 июня 2010

Разница показывает, как вы получаете доступ к методам.

Методы класса используют разделитель ::, чтобы указать, что сообщение может быть отправлено объекту класса / модуля, в то время как методы экземпляра используют разделитель #, чтобы указать, что сообщение может быть отправлено экземпляру объекта.

Я собираюсь выбрать класс 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.

Что конкретно, почему они выбрали :: и #? :: имеет смысл для меня, потому что он условно разделял пространства имен, но #, вероятно, был просто символом, который не использовался в другой номенклатуре и мог однозначно распознаваться как разделитель метода экземпляра.

3 голосов
/ 26 июня 2010

Я понимаю, что это способ определения методов в ри. Что было первым?

Да, вот откуда. Когда вы используете #, он автоматически связывает ваши методы, поэтому ссылки на другие методы в документации начинаются с префикса #. См. здесь :

Имена классов, исходных файлов и любые имена методов, содержащие подчеркивание или предшествующие символу хеша, автоматически связываются гиперссылками из текста комментария с их описанием.

Однако вы не можете вызвать метод таким способом. Но это не должно удивлять; в конце концов, <cref ...> является недопустимым оператором в C #, несмотря на то, что является допустимым тегом документации.

...