Каково объяснение/история для # конвенции идентификации методов в Ruby?

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

Я понимаю, что это - способ, которым методы определяются в ri. Который был на первом месте?

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

9
задан Justin L. 25 June 2010 в 23:18
поделиться

2 ответа

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

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

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

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

8
ответ дан 3 November 2019 в 00:58
поделиться

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

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

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

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

3
ответ дан 3 November 2019 в 00:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: