to_a - это не метод в Range, но он работает на Range? - PullRequest
0 голосов
/ 10 октября 2018

Действителен следующий код:

(1..5).to_a

(1..5) - это Range.Похоже, что метод to_a конвертирует диапазон в массив.

Однако документация для Range не документируется.Поскольку эта документация предположительно генерируется автоматически из источника с Yard, я сомневаюсь, что она не может быть в списке методов.Происходит ли автоматическое преобразование?

Как работает указанный выше юридический Ruby?

1 Ответ

0 голосов
/ 10 октября 2018

Следующий код является допустимым ruby:

b = (1..5).to_a

(1..5) является объектом Range, а b является объектом Array.Официальная (?) Документация для класса Range не документирует метод to_a, который, по-видимому, преобразует диапазон в массив.

Итак, как работает вышеуказанный допустимый Ruby?

В Ruby есть нечто, называемое "наследование".Наследование - это метод дифференциального повторного использования кода, который на самом деле существует не только в Ruby, но на самом деле довольно популярен во многих языках, таких как Java, C♯, C ++, Python, PHP, Scala, Kotlin, Ceylon и т. Д., Ии т. д.

Наследование позволяет вам определять методы в одном месте, а затем наследовать их в другом месте, переопределяя и определяя только методы, поведение которых отличается .Следовательно, «повторное использование дифференциального кода».

В данном конкретном случае, метод, который вы смотрите, это Enumerable#to_a.

Примечание: Ruby на самом деле имеет дваформы наследования, наследование миксинов и наследование классов .Наследование миксинов похоже на наследование классов, когда миксин не знает своего суперкласса.(Окончательный ресурс о наследовании миксинов: Гилад Брача *, докторская диссертация Пазл языка программирования - ? миксины, ? модульность и множественное наследование .)

Официальная (?) Документация

На самом деле ruby-doc - это сторонний сайт.Официальной документации сайта нет.(Тем не менее, документация по ruby-doc генерируется из комментариев документации в YARV, одной из основных реализаций Ruby, и той, в которую активно участвует Юкихиро Мацумото.)

Поскольку эта документация предположительно генерируется автоматически изисточник с Yard,

Он на самом деле автоматически генерируется из источника YARV с помощью RDoc, а не YARD.

Я запутался, как этого не могло быть в спискеметоды,

Обратите внимание, что объяснение, которое я дал, является правильным, но может быть много других объяснений.Самый простой: причина, по которой метод отсутствует в документации, заключается в том, что он не документирован.Другой причиной может быть ошибка в генераторе документации, которая препятствует отображению документации для этого метода, опечатка в исходном коде, которая не позволяет генератору документации распознавать документацию, и многие, многие другие.

так происходит ли автоматическое преобразование?

Нет.В Ruby нет автоматических преобразований в языке.Существуют некоторые методы, которые по соображениям эффективности реализуются не объектно-ориентированным образом и требуют, чтобы объект был экземпляром конкретного класса (в отличие от объекта-ориентированный способ, который потребует от объекта соответствия определенному протоколу).Поскольку строгое ограничение требует, чтобы объект был экземпляром определенного класса, эти методы обычно предлагают программисту «аварийный штрих», отправляя конкретное сообщение и позволяя объекту ответить объектом требуемого класса.class.

Например, для всех методов, печатающих что-либо на консоли, требуется экземпляр String, но они сначала попытаются отправить to_s, прежде чем отклонить аргумент.

Это иногда называют "неявными преобразованиями", но они не имеют ничего общего с неявными преобразованиями, как в Scala, или неявными приведениями, как в C♯.На самом деле они даже не являются частью языка, это просто соглашение для авторов библиотек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...