В Ruby есть блоки;Python не.
Python имеет функции;Руби нет.В Python вы можете взять любую функцию или метод и передать их другой функции.В Ruby все является методом, и методы не могут быть переданы напрямую.Вместо этого вам нужно обернуть их в Proc's, чтобы передать их.
Оба Ruby и Python поддерживают замыкания, но по-разному.В Python вы можете определить функцию внутри другой функции.Внутренняя функция имеет доступ для чтения к переменным из внешней функции, но не для записи.В Ruby вы определяете замыкания, используя блоки.Замыкания имеют полный доступ для чтения и записи к переменным из внешней области видимости.
В Python есть списочные выражения, которые довольно выразительны.Например, если у вас есть список чисел, вы можете написать
[x*x for x in values if x > 15]
, чтобы получить новый список квадратов со всеми значениями, превышающими 15. В Ruby вам нужно написать следующее:
values.select {|v| v > 15}.map {|v| v * v}
Код Ruby не выглядит таким компактным.Это также не так эффективно, поскольку сначала он преобразует массив значений в более короткий промежуточный массив, содержащий значения больше 15. Затем он берет промежуточный массив и генерирует окончательный массив, содержащий квадраты промежуточных элементов.Промежуточный массив затем выбрасывается.Таким образом, Ruby в процессе вычисления имеет 3 массива в памяти;Python нуждается только во входном списке и результирующем списке.
Python также предоставляет аналогичные описания карт.
Python поддерживает кортежи;Руби нет.В Ruby вы должны использовать массивы для имитации кортежей.
Ruby поддерживает операторы switch / case;Python не поддерживает.
Ruby поддерживает стандартный троичный оператор expr ? val1 : val2
;Python не поддерживает.
Ruby поддерживает только одно наследование.Если вам нужно имитировать множественное наследование, вы можете определить модули и использовать дополнения для переноса методов модуля в классы.Python поддерживает множественное наследование, а не смешивание модулей.
Python поддерживает только однострочные лямбда-функции.Блоки Ruby, которые являются своего рода лямбда-функциями, могут быть сколь угодно большими.Из-за этого код Ruby обычно написан в более функциональном стиле, чем код Python.Например, чтобы перебрать список в Ruby, вы обычно делаете
collection.each do |value|
...
end
Блок работает очень похоже на функцию, передаваемую в collection.each
.Если бы вы делали то же самое в Python, вам нужно было бы определить именованную внутреннюю функцию и затем передать ее в коллекцию каждому методу (если список поддерживал этот метод):
def some_operation(value):
...
collection.each(some_operation)
That not 'Течет очень хорошо.Таким образом, обычно в Python используется следующий нефункциональный подход:
for value in collection:
...
Безопасное использование ресурсов между двумя языками весьма различно.Здесь проблема заключается в том, что вы хотите выделить некоторый ресурс (открыть файл, получить курсор в базе данных и т. Д.), Выполнить некоторую произвольную операцию с ним, а затем закрыть его безопасным способом, даже если возникает исключение.
В Ruby, поскольку блоки очень просты в использовании (см. # 9), вы обычно кодируете этот шаблон как метод, который принимает блок для произвольной операции над ресурсом.
В Python,передача функции для произвольного действия немного сложнее, поскольку вы должны написать именованную внутреннюю функцию (см. # 9).Вместо этого Python использует оператор with
для безопасной обработки ресурсов.См. Как правильно очистить объект Python? для получения более подробной информации.