Что у Ruby у Python нет, и наоборот?

Существует много дискуссий о Python против Ruby, и я все считаю их совершенно бесполезными, потому что они все обходят вокруг, почему функция X отстой в языке Y, или что язык заявки Y не имеет X, хотя на самом деле это делает. Я также точно знаю, почему я предпочитаю Python, но это также субъективно и не поможет никому выбирать, поскольку они могут не иметь одинаковых вкусов в развитии, как я.

Поэтому было бы интересно перечислить различия, объективно. Так что нет "Python lambdas sucks". Вместо этого объясните, что Ruby lambdas может сделать, что Python не может. Нет субъективности. Пример кода хорош!

У вас нет нескольких отличий в одном ответе, пожалуйста. И голосуйте за те, которые, как вы знаете, правильны, и по тем, кого вы знаете, неверны (или субъективны). Кроме того, различия в синтаксисе не интересны. Мы знаем, что Python делает с отступом то, что Ruby делает с помощью скобок и концов, и что @называется self в Python.

UPDATE: теперь это вики сообщества, поэтому мы можем добавить здесь большие различия.

Ruby имеет ссылку класса в классе класса

В Ruby у вас есть ссылка на класс (self) уже в классе. В Python у вас нет ссылки на класс до завершения построения класса.

Пример:

class Kaka
  puts self
end

self в этом случае является классом, и этот код будет печатать "Кака". Невозможно распечатать имя класса или другими способами получить доступ к классу из тела определения класса в Python (определения внешних методов).

Все классы изменяются в Ruby

Это позволяет вам разрабатывать расширения для основных классов. Вот пример расширения рельсов:

class String
  def starts_with?(other)
    head = self[0, other.length]
    head == other
  end
end

Python (представьте, что не было метода ''.startswith):

def starts_with(s, prefix):
    return s[:len(prefix)] == prefix

Вы можете использовать его в любой последовательности (а не только в строках). Чтобы использовать его, вы должны явно импортировать его, например, from some_module import starts_with.

Ruby имеет Perl-подобные скриптовые функции

Ruby имеет первые классы regexps, $-variables, цикл awk/perl line by line и другие функции, которые делают его более подходящим для написания небольших сценариев оболочки, которые обрабатывают текстовые файлы или действуют как код клейма для других программ.

Ruby имеет продолжения первого класса

Благодаря выражению callcc. В Python вы можете создавать продолжения с помощью различных методов, но поддержка языка не поддерживается.

У Ruby есть блоки

С помощью инструкции "do" вы можете создать многострочную анонимную функцию в Ruby, которая будет передана в качестве аргумента в метод перед do и вызывается оттуда. В Python вы должны сделать это либо путем передачи метода, либо с помощью генераторов.

Ruby:

amethod { |here|
    many=lines+of+code
    goes(here)
}

Python (блоки Ruby соответствуют различным конструкциям в Python):

with amethod() as here: # `amethod() is a context manager
    many=lines+of+code
    goes(here)

или

for here in amethod(): # `amethod()` is an iterable
    many=lines+of+code
    goes(here)

или

def function(here):
    many=lines+of+code
    goes(here)

amethod(function)     # `function` is a callback

Интересно, что оператор удобства в Ruby для вызова блока называется "yield", который в Python будет создавать генератор.

Ruby:

def themethod
    yield 5
end

themethod do |foo|
    puts foo
end

Python:

def themethod():
    yield 5

for foo in themethod():
    print foo

Хотя принципы разные, результат поразительно схож.

Ruby упрощает программирование с использованием функционального стиля (трубчатого)

myList.map(&:description).reject(&:empty?).join("\n")

Python:

descriptions = (f.description() for f in mylist)
"\n".join(filter(len, descriptions))

Python имеет встроенные генераторы (которые используются как блоки Ruby, как указано выше)

Python поддерживает генераторы на языке. В Ruby 1.8 вы можете использовать модуль генератора, который использует продолжения для создания генератора из блока. Или вы можете просто использовать блок /proc/lambda! Более того, в Ruby 1.9 Fibers есть и могут использоваться как генераторы, а класс Enumerator - это встроенный генератор 4

docs.python.org имеет этот пример генератора:

def reverse(data):
    for index in range(len(data)-1, -1, -1):
        yield data[index]

Сравните это с приведенными выше примерами блоков.

Python имеет гибкое пространство имен

В Ruby, когда вы импортируете файл с require, все вещи, определенные в этом файле, попадут в ваше глобальное пространство имен. Это вызывает загрязнение пространства имен. Решение этого - модули Rubys. Но если вы создаете пространство имен с модулем, вы должны использовать это пространство имен для доступа к содержащимся классам.

В Python файл является модулем, и вы можете импортировать содержащиеся в нем имена с помощью from themodule import *, тем самым загрязняя пространство имен, если хотите. Но вы также можете импортировать только выбранные имена с помощью from themodule import aname, another или просто import themodule, а затем получить доступ к именам с помощью themodule.aname. Если вам нужно больше уровней в вашем пространстве имен, вы можете иметь пакеты, которые представляют собой каталоги с модулями и файл __init__.py.

У Python есть docstrings

Докстры являются строками, которые привязаны к модулям, функциям и методам и могут быть интроспективно во время выполнения. Это помогает создавать такие вещи, как команда справки и автоматическая документация.

def frobnicate(bar):
    """frobnicate takes a bar and frobnicates it

       >>> bar = Bar()
       >>> bar.is_frobnicated()
       False
       >>> frobnicate(bar)
       >>> bar.is_frobnicated()
       True
    """

Ruby-эквивалент аналогичен javadocs и расположен выше метода, а не внутри него. Они могут быть извлечены во время выполнения из файлов с помощью 1.9 Метод # source_location example use

Python имеет множественное наследование

Ruby не делает ( "специально" - см. сайт Ruby, см. здесь, как это делается в Ruby). Он повторно использует концепцию модуля как тип абстрактных классов.

У Python есть списки/dict-решения

Python:

res = [x*x for x in range(1, 10)]

Ruby:

res = (0..9).map { |x| x * x }

Python:

>>> (x*x for x in range(10))
<generator object <genexpr> at 0xb7c1ccd4>
>>> list(_)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Ruby:

p = proc { |x| x * x }
(0..9).map(&p)

Python 2.7 +:

>>> {x:str(y*y) for x,y in {1:2, 3:4}.items()}
{1: '4', 3: '16'}

Ruby:

>> Hash[{1=>2, 3=>4}.map{|x,y| [x,(y*y).to_s]}]
=> {1=>"4", 3=>"16"}

Python имеет декораторы

В Ruby также могут быть созданы элементы, подобные декораторам, и также можно утверждать, что они не так необходимы, как в Python.

Различия в синтаксисе

Ruby требует "end" или "}", чтобы закрыть все его области, в то время как Python использует только пробел. Недавно были предприняты попытки Ruby разрешить простое отступы http://github.com/michaeledgar/seamless

Ответ 1

У вас может быть код в определении класса в Ruby и Python. Однако в Ruby у вас есть ссылка на класс (self). В Python у вас нет ссылки на класс, поскольку класс еще не определен.

Пример:

class Kaka
  puts self
end

self в этом случае является классом, и этот код будет печатать "Кака". Нет способа распечатать имя класса или другими способами получить доступ к классу из тела определения класса в Python.

Ответ 2

Ruby имеет понятия блоков, которые по сути являются синтаксическим сахаром вокруг раздела кода; они являются способом создания замыканий и передачи их другому методу, который может или не может использовать блок. Блок может быть вызван позже с помощью инструкции yield.

Например, простое определение метода each на Array может выглядеть примерно так:

class Array
  def each
    for i in self  
      yield(i)     # If a block has been passed, control will be passed here.
    end  
  end  
end  

Затем вы можете вызвать это так:

# Add five to each element.
[1, 2, 3, 4].each{ |e| puts e + 5 }
> [6, 7, 8, 9]

У Python есть анонимные функции/закрытие/lambdas, но у него нет блоков, поскольку он пропускает какой-то полезный синтаксический сахар. Однако, по крайней мере, один способ получить его в специальном стиле. См., Например, здесь.

Ответ 3

Пример Python

Функции - это первоклассные переменные в Python. Вы можете объявить функцию, передать ее как объект и перезаписать ее:

def func(): print "hello"
def another_func(f): f()
another_func(func)

def func2(): print "goodbye"
func = func2

Это фундаментальная особенность современных языков сценариев. JavaScript и Lua делают это тоже. Ruby не обрабатывает функции таким образом; Именование функции вызывает его.

Конечно, есть способы сделать это в Ruby, но они не являются первоклассными операциями. Например, вы можете обернуть функцию с помощью Proc.new, чтобы рассматривать ее как переменную - но тогда она больше не является функцией; это объект с методом "вызова".

Функции Ruby не являются первоклассными объектами

Функции Ruby не являются первоклассными объектами. Функции должны быть завернуты в объект, чтобы передать их; результирующий объект нельзя рассматривать как функцию. Функции не могут быть назначены первоклассным образом; вместо этого в его контейнерном объекте должна быть вызвана функция для их изменения.

def func; p "Hello" end
def another_func(f); method(f)[] end
another_func(:func)      # => "Hello"

def func2; print "Goodbye!"
self.class.send(:define_method, :func, method(:func2))
func                     # => "Goodbye!"

method(:func).owner      # => Object
func                     # => "Goodbye!"
self.func                # => "Goodbye!"    

Ответ 4

В конечном счете, все ответы будут субъективными на каком-то уровне, и ответы, опубликованные до сих пор, в значительной степени доказывают, что вы не можете указать на какую-либо одну функцию, которая не может быть выполнена на другом языке в одинаково приятном (если не аналогичный) путь, поскольку оба языка очень сжатые и выразительные.

Мне нравится синтаксис Python. Однако вам нужно копать немного глубже синтаксиса, чтобы найти истинную красоту Ruby. В консистенции Ruby есть дзен-красавица. Хотя ни один тривиальный пример не может объяснить это полностью, я попытаюсь придумать это здесь, чтобы объяснить, что я имею в виду.

Переверните слова в этой строке:

sentence = "backwards is sentence This"

Когда вы думаете о том, как вы это сделаете, вы бы сделали следующее:

  • Разделить предложение на слова
  • Обратные слова
  • Повторно присоединить слова к строке

В Ruby вы сделаете следующее:

sentence.split.reverse.join ' '

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

В python это будет выглядеть примерно так:

" ".join(reversed(sentence.split()))

Это не трудно понять, но у него совсем нет такого же потока. Предмет (предложение) похоронен посередине. Операции представляют собой сочетание функций и методов объектов. Это тривиальный пример, но каждый обнаруживает множество разных примеров, когда действительно работает с Ruby и понимает Ruby, особенно по нетривиальным задачам.

Ответ 5

У Python есть "мы все взрослые здесь". Таким образом, вы обнаружите, что Ruby имеет такие вещи, как константы, в то время как Python этого не делает (хотя константы Ruby только предупреждают). Путь мышления Python состоит в том, что если вы хотите сделать что-то постоянным, вы должны поместить имена переменных во все кепки и не изменять их.

Например, Ruby:

>> PI = 3.14
=> 3.14
>> PI += 1
(irb):2: warning: already initialized constant PI
=> 4.14

Python:

>>> PI = 3.14
>>> PI += 1
>>> PI
4.1400000000000006

Ответ 6

Вы можете импортировать только определенные функции из модуля в Python. В Ruby вы импортируете весь список методов. Вы могли бы "имитировать" их в Ruby, но это не то, что все о нем.

EDIT:

возьмите этот модуль Ruby:


module Whatever
  def method1
  end

  def method2
  end
end

если вы включили его в свой код:


include Whatever

вы увидите, что оба метода method1 и method2 были добавлены в ваше пространство имен. Вы не можете импортировать только method1. Вы либо импортируете их обоих, либо не импортируете их вообще. В Python вы можете импортировать только методы по вашему выбору. Если бы это имело имя, возможно, это было бы названо выборочным импортом?

Ответ 7

От Ruby веб-сайт:

Сходства Как с Python, в Ruby,...

  • Theres интерактивное приглашение (называется irb).
  • Вы можете читать документы в командной строке (с помощью команды ri вместо pydoc).
  • Нет специальных терминаторов строк (кроме обычной новой строки).
  • Строковые литералы могут охватывать несколько строк, таких как строки с тремя кавычками Pythons.
  • Скобки для списков, а фигурные скобки для dicts (которые в Ruby называются "хэшами" ).
  • Массивы работают одинаково (добавление их делает один длинный массив, но, составив их, как это, a3 = [ a1, a2 ] дает вам массив массивов).
  • Объекты сильно и динамически типизируются.
  • Все это объект, а переменные - это просто ссылки на объекты.
  • Хотя ключевые слова немного разные, исключения работают примерно одинаково.
  • У вас есть встроенные инструменты doc (Rubys называется rdoc).

Различия В отличие от Python, в Ruby,...

  • Строки изменяемы.
  • Вы можете создавать константы (переменные, значение которых вы не собираетесь изменять).
  • Существуют некоторые принудительные условные обозначения (например, имена классов начинаются с заглавной буквы, переменные начинаются с строчной буквы).
  • Создает только один вид контейнера списка (массив) и его изменяемый.
  • Строки с двойными кавычками позволяют escape-последовательности (например,\t) и специальный синтаксис "подстановки выражения" (который позволяет вставлять результаты выражений Ruby непосредственно в другие строки без необходимости "добавлять" + "строки" + вместе "). Строки с одиночными кавычками похожи на" необработанные строки "Pythons.
  • Нет классов" нового стиля "и" старого стиля ". Только один вид.
  • Вы никогда не получаете прямого доступа к атрибутам. С Ruby все вызовы метода.
  • Круглые скобки для вызовов методов обычно являются необязательными.
  • Theres публичный, закрытый и защищенный для обеспечения доступа вместо Pythons _voluntary_ underscore __convention__.
  • " mixins "используются вместо множественного наследования.
  • Вы можете добавлять или изменять методы встроенных классов. Оба языка позволяют вам открывать и изменять классы в любой момент, но Python предотвращает модификацию встроенных модулей - Ruby не делает.
  • У вас есть true и false вместо True и False (и nil вместо None).
  • При проверке истины только false и nil оценивают значение false. Все остальное верно (включая 0, 0.0," " и []).
  • Его elsif вместо elif.
  • Его требуется вместо импорта. В противном случае использование одинаково.
  • Для генерации документов используются комментарии обычного стиля к строкам (далее) (вместо docstrings ниже них).
  • Есть несколько ярлыков, которые, хотя дают вам больше памяти, вы быстро узнаете. Они, как правило, делают Ruby веселым и очень продуктивным.

Ответ 8

Что Ruby имеет над Python - это возможности языка сценариев. Язык сценариев в этом контексте означает использование для "кода клея" в сценариях оболочки и общих манипуляциях с текстом.

В основном они используются совместно с Perl. Первоклассные встроенные регулярные выражения, $-Variables, полезные параметры командной строки, такие как Perl (-a, -e) и т.д.

Вместе с его кратким, но темпоральным синтаксисом он идеально подходит для таких задач.

Python для меня - это скорее динамически типизированный бизнес-язык, который очень прост в освоении и имеет аккуратный синтаксис. Не как "круто", как Ruby, но аккуратно. Для Python для Ruby для меня существует огромное количество привязок для других библиотек. Привязки к Qt и другим библиотекам GUI, многим библиотекам поддержки игр и т.д. У Ruby гораздо меньше. Хотя широко используемые привязки, например, в Базы данных хорошего качества. Я нашел нишевые библиотеки, которые лучше поддерживаются в Python, даже если для одной и той же библиотеки есть также привязка Ruby.

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

Ответ 9

Я не думаю, что у Ruby есть X, а Python этого не делает, в то время как у Python есть Y, а Ruby - нет, это самый полезный способ взглянуть на него. Это довольно схожие языки, с множеством общих способностей.

В значительной степени разница в том, что язык делает изящным и удобочитаемым. Чтобы использовать пример, который вы подняли, оба теоретически имеют lambdas, но программисты Python имеют тенденцию избегать их, а созданные с их помощью конструкции не выглядят нигде как читабельными или идиоматическими, как в Ruby. Поэтому в Python хороший программист захочет пойти по другому пути решения проблемы, чем в Ruby, только потому, что на самом деле это лучший способ сделать это.

Ответ 10

Я хотел бы предложить вариант исходного вопроса: "Что у Ruby есть, что Python не делает, и наоборот?" который признает неутешительный ответ: "Ну, что вы можете сделать с Ruby или Python, которые нельзя сделать в Intercal?" Ничто на этом уровне, потому что Python и Ruby являются частью огромной королевской семьи, сидящей на троне как аппроксимация Тьюринга.

Но как насчет этого:

Что можно сделать изящно и хорошо в Python, чего нельзя сделать в Ruby с такой красотой и хорошей инженерией, или наоборот?

Это может быть гораздо интереснее, чем просто сравнение функций.

Ответ 11

Python имеет явный встроенный синтаксис для составления списков и генераторов, тогда как в Ruby вы будете использовать карты и кодовые блоки.

Сравнение

list = [ x*x for x in range(1, 10) ]

к

res = (1..10).map{ |x| x*x }

Ответ 12

"Переменные, начинающиеся с заглавной буквы, становятся константами и не могут быть изменены"

Неправильно. Они могут.

Если вы сделаете предупреждение, вы получите предупреждение.

Ответ 13

Несколько больше на стороне инфраструктуры:

  • Python имеет гораздо лучшую интеграцию с С++ (через такие вещи, как Boost.Python, SIP и Py ++), чем Ruby, где параметры, похоже, либо записываются напрямую против API-интерфейса Ruby-интерпретатора (что вы также можете делать с Python, но в обоих случаях это низкий уровень, утомительный и подверженный ошибкам) ​​или использовать SWIG (который, хотя он работает и определенно велик, если вы хотите для поддержки многих языков, не так хорош, как Boost.Python или SIP, если вы специально хотите связать С++).

  • В Python есть несколько сред веб-приложений (Django, Pylons/Turbogears, web.py, возможно, по крайней мере, полдюжины других), тогда как Ruby (эффективно) имеет один: Rails. (Другие веб-фреймворки Ruby действительно существуют, но, похоже, с трудом справляются с Rails). Является ли этот аспект хорошим или плохим? Трудно сказать и, вероятно, вполне субъективно; Я легко могу представить аргументы, что ситуация на Python лучше и что ситуация с Ruby лучше.

  • Культурно, сообщества Python и Ruby кажутся несколько разными, но я могу только намекнуть на это, поскольку у меня нет такого большого опыта взаимодействия с сообществом Ruby. Я добавляю это в основном в надежде, что тот, у кого есть большой опыт работы с обоими, может усилить (или отклонить) это утверждение.

Ответ 14

Бесстыдно копировать/вставлять из: Alex Martelli ответить на " Что лучше Ruby than Python" из comp.lang.python список рассылки.Суб >

18 августа 2003, 10:50 Эрик Макс Фрэнсис писал:

"Брэндон Дж. Ван каждый" написал:

     
  

Чем лучше Ruby, чем Python? Я уверен, что есть что-то.     Что это?

  
  

Разве не было бы больше смысла спрашивать людей Руби это, а не   Люди Python?

Возможно, или нет, в зависимости от одной цели - например, если одна цель включает "социологическую изучения" сообщества Python, то постановка вопросов в это сообщество скорее всего, окажется более информацию об этом, чем их в другом месте: -).

Лично я с радостью принял возможность следовать за Дейвом Томасом ' однодневный учебник по Ruby, наконец, OSCON. Ниже тонкого шпона синтаксиса различия, я нахожу Ruby и Python удивительно похожи - если бы я был вычисление минимального остовного дерева среди всего лишь любого набора языков, Я уверен, что Python и Ruby быть первыми двумя листьями для объединения в промежуточный node: -).

Конечно, я устал, в Ruby, от набрав глупый "конец" в конце каждый блок (а не просто unindenting) - но тогда я добираюсь до избегайте набирать одинаково-глупый ':' которые Python требует на начало каждого блока, так что почти стирка:-). Другой синтаксис различия, такие как "@foo" против 'self.foo', или более высокое значение случая в Ruby vs Python, действительно почти как не относящийся к мне.

Другие, несомненно, основывают свой выбор языков программирования на таких проблемы, и они генерируют самые горячие дебаты, но для меня это просто пример одного из законов Паркинсона в действий (сумма на вопрос обратно пропорционален актуальное значение).

Изменить (от AM 6/19/2010 11:45): это также известно как "рисование bikeshed" (или, короче говоря, "bikeshedding" ) - ссылка, снова, Норткоту Паркинсону, который дал "дебаты о том, какой цвет краски bikeshed" как типичный пример "горячие дебаты по тривиальным темам". (С истекшим Edit).

Одна синтаксическая разница, которую я нахожу важно, и в пользу Python - но другие люди, без сомнения, подумают просто обратное - это "как вы вызвать функцию, которая не принимает параметров". В Python (как в C) для вызова функции, которую вы всегда применяете "оператор вызова" - завершающий скобки сразу после объекта вы звоните (внутри этих трейлингов в скобках идут аргументы, которые вы проходите в вызове - если вы не проходите мимо args, то скобки пусты). Это оставляет простое упоминание о любой объект без участия оператора, что означает только ссылку к объекту - в любом контексте, без особых случаев, исключений, специальные правила и т.п. В Рубине (например, в Паскале), чтобы вызвать функцию С аргументами вы передаете аргументы (обычно в круглых скобках, хотя это не всегда имеет место) - НО, если функция не принимает никаких аргументов, а затем просто упоминание функции неявно называет это. Это может ожидания многих людей (по крайней мере, без сомнения, те, чьи только предыдущие опыт программирования был Паскаль или другие языки с аналогичный "неявный вызов", такой как Visual Basic) - но для меня это означает простое упоминание объекта может Иными словами, ссылка на объект, ИЛИ вызов объекта, в зависимости от тип объекта - и в тех случаи, когда я не могу получить ссылку на объект, просто упоминая это я нужно будет использовать явные "дать мне ссылайтесь на это, НЕ НАЗЫВАЙТЕ!" операторы, которые не нужны в противном случае. Я чувствую, что это влияет на "первоклассность" функций (или методы или другие вызываемые объекты) и возможность взаимозаменяемости объектов плавно. Поэтому, для меня, эта специфическая разность синтаксиса является серьезная черная марка против Ruby - но Я понимаю, почему другие люди в противном случае, хотя я мог с трудом не согласны с ними более яростно: -).

Ниже синтаксиса мы входим в некоторые важные различия в элементарных семантика - например, строки в Ruby - изменяемые объекты (например, в С++), тогда как в Python они не mutable (как на Java, или я верю С#). Опять же, люди, которые судят прежде всего тем, что они уже знакомый с может думать, что это плюс для Ruby (если они не знакомы с Java или С#, конечно:-). Я, я думаю неизменяемые строки - превосходные (и я не удивлен, что Java, независимо я думаю, заново изобрел идея, которая уже была на Python), хотя я бы не прочь Тип "изменяемого строкового буфера" (и в идеале один с лучшим простота использования, чем собственная строка Java буферы "), и я не даю этого суждение из-за знакомства - перед изучением Java, кроме функциональных языков программирования, где все данные неизменяемы, все языки, которые я знал, имеют изменяемые строки - но когда я впервые увидел идею непреложной строки в Java (которая я хорошо научились, прежде чем я узнал Python), это сразу показалось мне превосходным, очень подходит для ссылочная семантика более высокого уровня языка программирования (в отличие от значение-семантика, которая лучше всего подходит для языки ближе к машине и дальше от приложений, таких как C) со строками как первоклассный, встроенные (и очень важные) данные тип.

У Ruby есть некоторые преимущества в элементарная семантика - например, удаление списков Python vs кортежи" чрезвычайно тонкие различие. Но в основном оценка (как Я держу это, с простотой большой плюс и тонкие, умные различия примечательный минус) против Ruby (например, имеющие как закрытые, так и полуоткрытые интервалов с обозначениями a..b и a... b [кто-то хочет утверждать, что очевидно, что это? -)], является глупый - ИМХО, конечно!). Еще раз, люди, которые считают, что аналогичные, но тонко разные вещи при ядро языка PLUS, скорее чем МИНУС, конечно, посчитают эти "наоборот" от того, как Я считаю их: -).

Не смешивайте эти сравнения в мышление, что два языка очень разные, заметьте. Это не так. Но если меня попросят сравнить "capelli d'angelo" - "спагеттини", указав, что эти два виды макаронных изделий неотличимы ни от кого, ни от сменный в любом блюде, который вы можете хочу подготовиться, я тогда неизбежно приходится переходить в микроскопическое исследование того, как длины и диаметры незаметно отличаются, как концы нитей сужаются в одном случае, а не в другие и т.д. - попытаться объяснить почему я лично хотел бы capelli d'angelo в качестве макарон в любой вид бульона, но предпочел бы спагеттини, как пастасьютта, чтобы пойти с подходящими соусами для таких длинных тонкие формы макарон (оливковое масло, фарш чеснок, фарш красный перец и мелко например, наземные анчоусы, но если вы нарезали чеснок и перец вместо того, чтобы рубить их, тогда вы следует выбрать корпус эхолота спагетти, а не тоньше исчезновение спагеттини, и следует рекомендовать отказаться от аховий и добавьте вместо этого свежий springбазилик [или даже - я еретик...! - легкая мята...] листья - на самом в последний момент перед подачей блюда). Ой, извините, это показывает, что я выезжают за границу и не имеют макаронных изделий на какое-то время, я думаю. Но аналогия все еще очень хорошо! -)

Итак, вернемся к Python и Ruby, мы пришли к двум крупным (с точки зрения языка - оставляя библиотек и других важных вспомогательные средства, такие как инструменты и среды, как встраивать/расширять каждый язык, и т.д., и т.д. - они не будут применяться ко всем РЕАЛИЗАЦИЯМ каждого языка в любом случае, например, Jython vs Classic Python являющихся двумя реализациями Язык Python!):

  • Итераторы и кодовые блоки Ruby против итераторов и генераторов Python;

  • Ruby TOTAL, необузданная "динамичность", включая способность для "повторного открытия" любого существующего класса, включая все встроенные, и изменить свое поведение во время выполнения - против Python обширный, но ограниченный динамичность, которая никогда не меняет поведение существующих встроенных классы и их экземпляры.

Лично я считаю 1мытье ( различия настолько глубоки, что я мог легко видеть, как люди ненавидят подхода и уважения другого, но на моих личных весах плюсы и минусы примерно на высоте); и 2 a ключевой вопрос - тот, который делает Ruby гораздо более подходящий для "мастеринга", BUT Python одинаково подходит для использование в крупных производственных приложениях. Это смешно, в некотором смысле, потому что оба языки настолько БОЛЬШЕ динамичны чем в большинстве других, ключевое различие между ними от моего POV должен зависеть от этого - этот Ruby "доходит до одиннадцати" в этом отношении ( ссылка здесь на "Spinal Tap", of курс). В Ruby нет ограничений к моему творчеству - если я решаю, что все сопоставления строк должны без учета регистра, я МОГУ СДЕЛАТЬ ЭТО! I.e., я могу динамически изменять встроенный класс строк, чтобы     a = "Hello World"     b = "привет мир"     если a == b         print "equal!\n"     еще         print "different!\n"     end WILL print "equal". В python нет способа, которым я могу это сделать. Для целей метапрограммирования, внедрение экспериментальных рамок, и тому подобное, эта удивительная динамика способность Ruby чрезвычайно привлекательным. НО - если мы говорим о крупных приложениях, разработанных многие люди и поддерживаются даже больше, включая все виды библиотек из разных источников, и перейти на производство на клиентских сайтах... ну, я не ХОЧУ язык, который QUITE так динамично, большое спасибо. Я ненавижу саму идею какой-то библиотеки невольно нарушая другие несвязанные которые полагаются на те строки, которые разные - что вид глубокого и глубоко скрытый "канал", между фрагменты кода, которые LOOK разделяют и ДОЛЖЕН быть отдельным, что заклинания d-e-a-t-h в крупномасштабном программировании. Путем того, чтобы любой модуль влиял на поведение любого другого "тайного", способность мутировать семантику встроенные типы - это просто идея BAD для программирование производственного приложения, так же, как прохладно для возиться.

Если бы мне пришлось использовать Ruby для такого большого приложения, я постараюсь полагаться на ограничения стиля кодирования, много тесты (для повторного запуска каждый раз, когда НИЧЕГО изменения - даже то, что должно быть полностью несвязанные...) и т.п. запретить использование этой языковой функции. Но НЕ имея функцию в первое место еще лучше, в моем мнение - так же, как сам Python быть еще лучшим языком для прикладного программирования, если определенный количество встроенных модулей может быть "прибито" вниз ", поэтому я ЗНАЮ, что, например, len (" ciao ") составляет 4 (вместо того, чтобы иметь беспокоиться о сублиминальном кто-то изменил привязку имени 'len' в модуле встроенных...). Я надеюсь, что в конечном итоге Python" гвоздь "своих встроенных модулей.

Но проблема второстепенна, поскольку пересоздание встроенных модулей устаревшие, а также редкая практика в Python. В Ruby мне кажется, что майор - так же, как слишком мощный макрообъекты других языков (например, Дилан), аналогичные риски по моему мнению (я надеюсь что Python никогда не получает такой мощный макросистемы, независимо от" позволяя людям определять свои собственные малоязычные языки встроенный в сам язык "- это будет, ИМХО, ухудшит Python замечательный полезность для применения программирования путем представления" привлекательная неприятность" потенциальному tinkerer, который скрывается в каждом сердце программиста...).

Алекс

Ответ 15

Некоторые другие:

http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/to-ruby-from-python/

(Если я неправильно понял что-либо или что-то изменилось на стороне Ruby, так как эта страница была обновлена, кто-то может отредактировать...)

Строки изменяются в Ruby, а не в Python (где новые строки создаются с помощью "изменений" ).

Ruby имеет некоторые принудительные условные условные обозначения, Python этого не делает.

Python имеет как списки, так и кортежи (неизменные списки). Ruby имеет массивы, соответствующие спискам Python, но не имеет неизменяемого варианта.

В Python вы можете напрямую обращаться к атрибутам объекта. В Ruby это всегда с помощью методов.

В Ruby скобки для вызовов методов обычно являются необязательными, но не в Python.

Ruby имеет открытый, закрытый и защищенный для обеспечения доступа, а не соглашение Pythons с использованием символов подчеркивания и имени.

Python имеет множественное наследование. Ruby имеет "mixins".

И еще одна очень релевантная ссылка:

http://c2.com/cgi/wiki?PythonVsRuby

Который, в частности, ссылается на еще один хороший Алекс Мартелли, который также размещал много хорошего здесь на SO:

http://groups.google.com/group/comp.lang.python/msg/028422d707512283

Ответ 16

Я не уверен в этом, поэтому сначала добавляю его как ответ.

Python рассматривает несвязанные методы как функции

Это означает, что вы можете вызвать метод либо как theobject.themethod(), либо TheClass.themethod(anobject).

Изменить: хотя разница между методами и функциями мала в Python и не существует в Python 3, она также не существует в Ruby, просто потому, что Ruby не имеет функций. Когда вы определяете функции, вы фактически определяете методы в Object.

Но вы по-прежнему не можете взять метод одного класса и назвать его как функцию, вам придется переустановить его к объекту, который вы хотите вызвать, что гораздо более затруднительно.

Ответ 17

Я хотел бы упомянуть API-интерфейс дескриптора Python, который позволяет настраивать "связь" объекта с атрибутом. Также следует отметить, что в Python можно свободно реализовать альтернативный протокол, переопределив значение по умолчанию, заданное по умолчанию методом __getattribute__. Позвольте мне подробнее рассказать об упомянутом выше. Дескрипторы являются регулярными классами с методами __get__, __set__ и/или __delete__. Когда интерпретатор сталкивается с чем-то вроде anObj.anAttr, выполняется следующее:

  • __getattribute__ вызывается метод anObj
  • __getattribute__ извлекает объект anAttr из класса dict
  • он проверяет, имеет ли объект abAttr __get__, __set__ или __delete__ вызываемые объекты
  • контекст (т.е. объект или класс вызывающего объекта, а значение, а не последнее, если у нас есть сеттер) передается вызываемому объекту
  • возвращается результат.

Как уже упоминалось, это поведение по умолчанию. Один из них может свободно изменять протокол путем повторной реализации __getattribute__.

Этот метод намного более мощный, чем декораторы.

Ответ 18

Ruby имеет встроенную поддержку продолжения с помощью callcc.

Следовательно, вы можете реализовать классные вещи, такие как amb-operator

Ответ 19

На этом этапе Python по-прежнему имеет лучшую поддержку юникода

Ответ 20

У Python есть docstrings и ruby ​​нет... Или, если это не так, они недоступны так же легко, как в python.

Ps. Если я ошибаюсь, довольно, пожалуйста, оставьте пример? У меня есть обходное решение, что я могу легко обезвредить классы, но я бы хотел, чтобы docstring выглядела как функция в "родном" режиме.

Ответ 21

Ruby имеет сигилы и twigils, Python этого не делает.

Изменить. И одна очень важная вещь, которую я забыл (в конце концов, предыдущее было просто немного плакать: -p):

Python имеет JIT-компилятор (Psyco), более зрелищный язык более низкого уровня для написания более быстрого кода (Pyrex) и возможность добавления встроенного кода на С++ (Weave).

Ответ 22

Ruby имеет линейный цикл над входными файлами (флаг -n) из командной строки, поэтому его можно использовать как AWK. Этот однострочный Ruby:

ruby -ne 'END {puts $.}'

будет подсчитывать строки, как однострочный AWK:

awk 'END{print NR}'

Ruby получает эту возможность через Perl, который взял его из AWK как способ получить системных администраторов на борту с Perl, не изменяя способ их выполнения.

Ответ 23

Мой python ржавый, поэтому некоторые из них могут быть в python, и я просто не помню/никогда не узнавал в первую очередь, но вот первые несколько, о которых я думал:

Пробелы

Рубины обрабатывают пробелы совершенно разные. Для начала вам не нужно ничего отступать (это означает, что не имеет значения, используете ли вы 4 пробела или 1 вкладку). Он также выполняет интеллектуальное продолжение линии, поэтому справедливо следующее:

def foo(bar,
        cow)

В принципе, если вы закончите с оператором, он выяснит, что происходит.

Примеси

Ruby имеет mixins, который может расширять экземпляры вместо полных классов:

module Humor
  def tickle
    "hee, hee!"
  end
end
a = "Grouchy"
a.extend Humor
a.tickle    »   "hee, hee!"

Перечисления

Я не уверен, что это то же самое, что и генераторы, но с Ruby 1.9 ruby ​​в качестве перечислений, поэтому

>> enum = (1..4).to_enum
=> #<Enumerator:0x1344a8>

Ссылка: http://blog.nuclearsquid.com/writings/ruby-1-9-what-s-new-what-s-changed

"Аргументы ключевого слова"

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

def foo(a, b=2, c=3)
  puts "#{a}, #{b}, #{c}"
end
foo(1,3)   >> 1, 3, 3
foo(1,c=5) >> 1, 5, 3
c          >> 5

Обратите внимание, что c = 5 фактически присваивает переменной c в области вызова значение 5 и устанавливает для параметра b значение 5.

или вы можете сделать это с помощью хэшей, которые обращаются ко второй проблеме

def foo(a, others)
  others[:b] = 2 unless others.include?(:b)
  others[:c] = 3 unless others.include?(:c)
  puts "#{a}, #{others[:b]}, #{others[:c]}"
end
foo(1,:b=>3) >> 1, 3, 3
foo(1,:c=>5) >> 1, 2, 5

Ссылка: Руководство по прагматическим прогаммерам для Ruby

Ответ 24

Синтаксис не является второстепенным, он оказывает прямое влияние на то, как мы думаем. Это также оказывает прямое влияние на правила, которые мы создаем для систем, которые мы используем. В качестве примера мы имеем порядок операций из-за того, как мы пишем математические уравнения или предложения. Стандартная нотация для математики позволяет людям читать ее более чем одним способом и получать разные ответы, учитывая одно и то же уравнение. Если бы мы использовали префикс или постфиксную нотацию, мы бы создали правила, чтобы отличать то, что должны обрабатывать числа, а не только правила для порядка, в котором нужно вычислять значения.

Стандартная нотация позволяет прояснить то, что мы говорим, делая приказ, чтобы вычислить их двусмысленно. Префикс и постфиксная нотация делают порядок вычисления равнины, делая цифры неоднозначными. У Python уже были бы многострочные lambdas, если бы не трудности, вызванные синтаксическим пробелом. (Существуют предложения для вытаскивания такого рода без необходимости добавления явных разделителей блоков.)

Мне легче записывать условия, в которых я хочу, чтобы что-то произошло, если условие ложно намного проще писать с помощью инструкции if в Ruby, чем семантически эквивалентная конструкция "if-not" в Ruby или других языках, например. Если большинство языков, которые люди используют сегодня, равны по силе, как синтаксис каждого языка можно считать тривиальной? После того, как определенные функции, такие как блоки и механизмы наследования, и т.д. Синтаксис является самой важной частью языка, вряд ли поверхностная вещь.

Что поверхностно - это эстетические качества красоты, которые мы приписываем синтаксису. Эстетика не имеет ничего общего с тем, как работает наше познание, синтаксис.

Ответ 25

python имеет необязательные аргументы

def func(a, b=2, c=3):
    print a, b, c

>>> func(1)
1 2 3
>>> func(1, c=4)
1 2 4

AFAIK Ruby имеет только позиционированные аргументы, потому что b = 2 в объявлении функции - это аффектация, которая всегда добавляется.

Ответ 26

Удивлен, что ничего не упоминается о рубине "метод отсутствует". Я приведу примеры методов find_by _... в Rails в качестве примера возможности этой языковой функции. Я предполагаю, что что-то подобное может быть реализовано в Python, но, насколько мне известно, его нет.

Ответ 27

Другое отличие в lambdas между Python и Ruby продемонстрировано Paul Graham Проблема с генератором аккумуляторов. Перепечатано здесь:

Напишите функцию foo, которая принимает число n и возвращает функцию, которая принимает число i, и возвращает n, увеличивающуюся на i. Примечание: (a) это число, а не целое число, (b), которое увеличивается, а не плюс.

В Ruby вы можете сделать это:

def foo(n)
  lambda {|i| n += i }
end

В Python вы должны создать объект для хранения состояния n:

class foo(object):
    def __init__(self, n):
        self.n = n
    def __call__(self, i):
        self.n += i
        return self.n

Некоторые люди могут предпочесть явный подход Python как более понятный концептуально, даже если он немного более подробный. Вы сохраняете состояние, как вы делаете для чего-либо еще. Вам просто нужно обернуть голову идеей вызываемых объектов. Но независимо от того, какой подход предпочитает эстетически, он демонстрирует одно уважение, в котором Ruby lambdas являются более мощными конструкциями, чем Python's.

Ответ 28

Ruby имеет встроенную документацию:

 =begin

 You could use rdoc to generate man pages from this documentation

 =end

Ответ 30

В Ruby, когда вы импортируете файл с требуют, все вещи, определенные в этот файл окажется в вашем глобальном Пространство имен.

С Cargo вы можете "потребовать библиотеки без загромождения вашего пространства имен".

# foo-1.0.0.rb
class Foo
  VERSION = "1.0.0"
end

# foo-2.0.0.rb
class Foo
  VERSION = "2.0.0"
end
>> Foo1 = import("foo-1.0.0")
>> Foo2 = import("foo-2.0.0")
>> Foo1::VERSION
=> "1.0.0"
>> Foo2::VERSION
=> "2.0.0"