Хотя в Python все является объектом, в Ruby он отличается подходом к разрешению имен и взаимодействию с объектами.
Например, хотя Ruby предоставляет вам метод to_s для базового класса Object, для предоставления этой функциональности Python интегрирует его в сам строковый тип - вы преобразуете тип в строку, создавая строку из Это. Вместо 5.to_s
у вас есть str(5)
.
Не обманывайтесь. За кулисами все еще есть метод - вот почему этот код работает:
(5).__str__()
Таким образом, на практике эти два принципиально похожи, но вы используете их по-разному. Длина для таких последовательностей, как списки и кортежи в Python, является еще одним примером этого принципа в действии - фактическая функция построена на методах со специальными именами, но предоставляется через более простой и легкий в использовании интерфейс (функция len
).
Таким образом, Python эквивалентно тому, что вы написали в своем вопросе:
(5).__add__(6)
Другое важное отличие заключается в том, как реализованы глобальные функции. В python глобалы представлены словарем (как и местные). Это означает, что следующее:
foo(5)
Эквивалентно этому в python:
globals()["foo"].__call__(5)
Хотя ruby эффективно делает это:
Object.foo(5)
Это оказывает большое влияние на подход, используемый при написании кода на обоих языках. Библиотеки Ruby имеют тенденцию расти за счет добавления методов к существующим типам, таким как Object, в то время как библиотеки Python имеют тенденцию расти за счет добавления глобальных функций к данному модулю.