Что обоснование / история для # конвенции о идентификации методов в Руби?

StackOverflow https://stackoverflow.com/questions/3123445

Вопрос

Например, я всегда видел методы, называемые 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>'

Я думаю, что причина, по которой они не используют . В качестве сепаратора для всего, что это было бы неоднозначно, принадлежит метод к классу или экземпляру. Теперь, когда я привык делать это, я действительно вижу это как недостаток на конвенциях других языков, если честно.

Кроме того, это несколько совершенно не связанной темы от поля Потому что все сообщения, которые вы можете отправить, являются сообщениями, правильно говоря, даже если это выглядит Как общедоступное поле. Самое близкое, что вам нужно длялей, являются атрибутами или переменными экземпляра, конечно, которые всегда префиксированы с @ и нет напрямую доступен снаружи экземпляра, если вы не используете наследство или Object#instance_variable_get/_set.

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

Другие советы

Я понимаю, что именно то, как методы определены в RI. Который пришел первым?

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top