Существует много дискуссий о Python против Ruby, и я все нахожу их совершенно бесполезными, потому что все они оборачиваются тем, почему функция X отстой в языке Y, или в том, что язык Y не имеет X, хотя на самом деле это так. Я также точно знаю, почему я предпочитаю Python, но это тоже субъективно, и не поможет никому выбрать, так как у них могут не быть те же вкусы в разработке, что и у меня.
Поэтому было бы интересно перечислить различия объективно. Так что нет "лямбды Питона отстой". Вместо этого объясните, что могут делать лямбды в Ruby, а Python - нет. Нет субъективности. Пример кода это хорошо!
У меня нет нескольких различий в одном ответе. И проголосуйте за тех, кого вы знаете, правильно, и за тех, кого вы знаете неправильно (или субъективно). Также различия в синтаксисе не интересны. Мы знаем, что Python делает с отступом то, что Ruby делает с скобками и концами, и что в Python @ называется self.
ОБНОВЛЕНИЕ: Теперь это вики сообщества, поэтому мы можем добавить большие различия здесь.
У Ruby есть ссылка на класс в теле класса
В Ruby у вас есть ссылка на класс (self) уже в теле класса. В Python у вас нет ссылки на класс, пока не закончится построение класса.
Пример:
class Kaka
puts self
end
self в этом случае является классом, и этот код будет выводить «Kaka». Невозможно распечатать имя класса или каким-либо другим способом получить доступ к классу из тела определения класса в 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 есть регулярные выражения первого класса, переменные $, переменные циклические строки ввода awk / perl и другие функции, которые делают его более подходящим для написания небольших сценариев оболочки, которые разбирают текстовые файлы или действуют как связующий код для других программ.
Руби имеет продолжение первого класса
Благодаря заявлению callcc. В Python вы можете создавать продолжения различными способами, но в язык не встроена поддержка.
Рубин имеет блоки
С помощью оператора "do" вы можете создать многострочную анонимную функцию в Ruby, которая будет передана в качестве аргумента в метод перед do и будет вызываться оттуда. В Python вы бы вместо этого делали это, передавая метод или используя генераторы.
Рубин:
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 создаст генератор.
Рубин:
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 Fibres являются и могут использоваться как генераторы, а класс 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 имеет строки документации
Строки документации - это строки, которые присоединяются к модулям, функциям и методам и могут быть проанализированы во время выполнения. Это помогает создавать такие вещи, как команда справки и автоматическое документирование.
def frobnicate(bar):
"""frobnicate takes a bar and frobnicates it
>>> bar = Bar()
>>> bar.is_frobnicated()
False
>>> frobnicate(bar)
>>> bar.is_frobnicated()
True
"""
Эквивалент Ruby похож на javadocs и расположен над методом, а не внутри него. Они могут быть извлечены во время выполнения из файлов, используя пример метода Method # source_location 1.9
Python имеет множественное наследование
Ruby этого не делает («специально» - см. Веб-сайт Ruby, смотрите здесь, как это делается в Ruby ). Он повторно использует концепцию модуля как тип абстрактных классов.
У Python есть списки / дикты
Python:
res = [x*x for x in range(1, 10)]
Рубин:
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]
Рубин:
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'}
Рубин:
>> 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
Ответы:
В Ruby есть понятия блоков , которые по сути являются синтаксическим сахаром вокруг части кода; они являются способом создания замыканий и передачи их другому методу, который может использовать или не использовать блок. Блок может быть вызван позже через
yield
оператор.Например, простое определение
each
методаArray
может выглядеть примерно так:Тогда вы можете вызвать это так:
В Python есть анонимные функции / замыкания / лямбды, но у него нет блоков, так как в нем отсутствуют некоторые полезные синтаксические символы. Тем не менее, есть по крайней мере один способ получить его в специальном режиме. Смотрите, например, здесь .
источник
Пример Python
Функции являются первоклассными переменными в Python. Вы можете объявить функцию, передать ее как объект и перезаписать:
Это фундаментальная особенность современных скриптовых языков. JavaScript и Lua тоже это делают. Руби не относится к функциям таким образом; именование функции вызывает ее.
Конечно, в Ruby есть способы сделать это, но это не первоклассные операции. Например, вы можете обернуть функцию с помощью Proc.new, чтобы рассматривать ее как переменную - но тогда она больше не является функцией; это объект с методом "вызова".
Функции Руби не первоклассные объекты
Ruby-функции не являются первоклассными объектами. Функции должны быть обернуты в объект, чтобы передать их; результирующий объект не может быть обработан как функция. Функции не могут быть назначены первоклассным способом; вместо этого для их изменения должна быть вызвана функция в объекте-контейнере.
источник
x = y
не по вызовуself.class.send(:define_method, :func, method(:func2))
. Ваш «контрпример» показывает, что функции Ruby не являются первоклассными. Если вы не согласны, не стесняйтесь опубликовать свой собственный ответ; не суй свое замешательство в мое.def ... end
в ruby, не являются функциями. Это методы (как вы их определилиKernel
). Методы могут быть связаны (используя#method
метод), которые затем являются объектами. Самое близкое, что ruby имеет к функциям, - этоProc
экземпляры, которые также являются объектами и могут передаваться или вызываться. Он также имеет специальный синтаксис для передачи одного обратного вызоваProc
методу, как обсуждает Джон Феминелла в своем ответе .UnboundMethod
может быть PITA, хотя.В конечном счете, все ответы будут субъективными на каком-то уровне, и ответы, опубликованные до сих пор, в значительной степени доказывают, что вы не можете указать ни на одну особенность, которая не может быть реализована на другом языке одинаково хорошим (если не похожим) способом , так как оба языка очень лаконичны и выразительны.
Мне нравится синтаксис Python. Однако вам придется копать немного глубже синтаксиса, чтобы найти истинную красоту Ruby. В последовательности Руби есть дзен-подобная красота. Хотя ни один тривиальный пример не может объяснить это полностью, я попытаюсь придумать один здесь, чтобы объяснить, что я имею в виду.
Поменяйте местами слова в этой строке:
Когда вы думаете о том, как вы это сделаете, вы сделаете следующее:
В Ruby вы бы сделали это:
Точно так же, как вы думаете об этом, в той же последовательности, один вызов метода за другим.
В Python это будет выглядеть примерно так:
Это не сложно понять, но у него не совсем тот же поток. Предмет (предложение) похоронен в середине. Операции представляют собой сочетание функций и методов объекта. Это тривиальный пример, но при работе с Ruby и его понимании можно найти много разных примеров, особенно в отношении нетривиальных задач.
источник
У Python менталитет «мы все здесь взрослые». Таким образом, вы обнаружите, что в Ruby есть такие вещи, как константы, в то время как в Python нет (хотя константы Ruby только вызывают предупреждение). С точки зрения Python, если вы хотите сделать что-то постоянным, вы должны поместить имена переменных во все заглавные буквы, а не изменять их.
Например, Ruby:
Python:
источник
Вы можете импортировать только определенные функции из модуля в Python. В Ruby вы импортируете весь список методов. Вы можете «импортировать» их в Ruby, но дело не в этом.
РЕДАКТИРОВАТЬ:
давайте возьмем этот модуль Ruby:
если вы включите его в свой код:
вы увидите , что оба method1 и method2 были добавлены в пространство имен. Вы не можете импортировать только method1 . Вы либо импортируете их оба, либо не импортируете их вообще. В Python вы можете импортировать только методы по вашему выбору. Если бы у этого было имя, может быть, это было бы названо выборочным импортом?
источник
import bla; bla.foo()
в Руби?module
на самом деле это немного неправильно. Модули в основном классы безnew
,allocate
методы. Они лучше всего работают как способ совместного использования кода для каждого класса / объекта, а не как механизм для разделения библиотек или для обмена кодом между программами.С сайта Руби :
Сходства, как с Python, в Ruby, ...
Отличия В отличие от Python, в Ruby, ...
источник
Ruby имеет над Python свои возможности языка сценариев. Язык сценариев в данном контексте означает, что его следует использовать для «склеивания кода» в сценариях оболочки и общих текстовых манипуляциях.
В основном они делятся с Perl. Первоклассные встроенные регулярные выражения, $ -Variables, полезные параметры командной строки, такие как Perl (-a, -e) и т. Д.
Вместе с кратким, но выразительным синтаксисом он идеально подходит для такого рода задач.
Python для меня - это скорее динамически типизированный бизнес-язык, который очень прост в изучении и имеет аккуратный синтаксис. Не такой "крутой", как Ruby, но аккуратный. Что Python имеет для Ruby для меня, так это огромное количество привязок для других библиотек. Привязки к Qt и другим библиотекам GUI, многие библиотеки поддержки игр и и и. Рубин имеет гораздо меньше. Хотя часто используемые привязки, например, к базам данных, имеют хорошее качество, я обнаружил, что нишевые библиотеки лучше поддерживаются в Python, даже если для той же библиотеки есть также привязка Ruby.
Итак, я бы сказал, что оба языка имеют свое использование, и именно эта задача определяет, какой из них использовать. Оба достаточно просты в освоении. Я использую их бок о бок. Ruby для скриптинга и Python для автономных приложений.
источник
Я не думаю, что «у Ruby есть X, а у Python нет, а у Python есть Y, а у Ruby нет» - самый полезный способ взглянуть на это. Это довольно похожие языки со многими общими возможностями.
В значительной степени разница в том, что язык делает элегантным и читабельным. Чтобы использовать пример, который вы привели, у обоих теоретически есть лямбды, но программисты на Python склонны избегать их, и конструкции, созданные с их использованием, не выглядят такими же читаемыми или идиоматическими, как в Ruby. Таким образом , в Python, хороший программист захочет взять другой путь к решению проблемы , чем он был бы в Ruby, просто потому , что на самом деле это лучший способ сделать это.
источник
for format in respond_to()
.respond_to
Метод ничего значимого не возвращается - он просто реагирует на текущий запрос HTTP.do
Вrespond_to do
начале блока. В этом блоке мы говорим с временным объектом (помеченнымformat
в этом примере), который реализует очень простой DSL для ответа на HTTP-запрос.Я хотел бы предложить вариант исходного вопроса: «Что у Ruby есть, чего нет у Python, и наоборот?» который допускает неутешительный ответ: «Ну, что вы можете сделать с Ruby или Python, чего нельзя сделать в Intercal?» Ничего на этом уровне, потому что Питон и Руби являются частью огромной королевской семьи, сидящей на троне приближенного Тьюринга.
Но как насчет этого:
Что можно сделать изящно и хорошо в Python, что нельзя сделать в Ruby с такой красотой и хорошей инженерией, или наоборот?
Это может быть гораздо интереснее, чем просто сравнение характеристик.
источник
Python имеет явный встроенный синтаксис для списочных представлений и генераторов, тогда как в Ruby вы бы использовали блоки map и code.
сравнить
в
источник
res=map(2 .__rpow__, range(1,10))
«Переменные, начинающиеся с заглавной буквы, становятся константами и не могут быть изменены»
Неправильно. Они могут.
Вы только получите предупреждение, если вы делаете.
источник
Несколько больше об инфраструктуре:
Python имеет гораздо лучшую интеграцию с C ++ (через такие вещи, как Boost.Python , SIP и Py ++ ), чем Ruby, где параметры кажутся либо написанными непосредственно в API интерпретатора Ruby (что вы также можете делать с Python, конечно, но в обоих случаях это низкоуровневое, утомительное и подверженное ошибкам) или использование SWIG (что, хотя оно работает и, безусловно, прекрасно, если вы хотите поддерживать много языков, не так хорошо, как Boost.Python или SIP, если Вы специально хотите связать C ++).
В Python есть несколько сред веб-приложений (Django, Pylons / Turbogears, web.py, вероятно, по крайней мере полдюжины других), тогда как в Ruby (эффективно) есть одна: Rails. (Другие веб-фреймворки на Ruby существуют, но, похоже, им сложно добиться успеха в Rails). Этот аспект хорош или плох? Трудно сказать, и, вероятно, довольно субъективно; Я легко могу представить аргументы, что ситуация с Python лучше, а ситуация с Ruby лучше.
В культурном отношении сообщества Python и Ruby кажутся несколько различными, но я могу только намекать на это, поскольку у меня нет такого большого опыта взаимодействия с сообществом Ruby. Я добавляю это главным образом в надежде, что кто-то, у кого есть большой опыт с обоими, может усилить (или отклонить) это утверждение.
источник
Бесстыдно скопировал / вставил из: Ответ Алекса Мартелли о теме « Что лучше в Ruby, чем Python » из списка рассылки comp.lang.python .
источник
Некоторые другие из:
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 есть общедоступный, закрытый и защищенный для обеспечения доступа доступ вместо соглашения Python об использовании подчеркивания и искажения имени.
Python имеет множественное наследование. У Руби есть "миксин".
И еще одна очень актуальная ссылка:
http://c2.com/cgi/wiki?PythonVsRuby
Который, в частности, ссылается на еще один хороший комментарий Алекса Мартелли , который также публикует здесь много полезных вещей на SO:
http://groups.google.com/group/comp.lang.python/msg/028422d707512283
источник
Я не уверен в этом, поэтому сначала добавлю его в качестве ответа.
Python рассматривает несвязанные методы как функции
Это означает, что вы можете вызывать метод как
theobject.themethod()
илиTheClass.themethod(anobject)
.Изменить: Хотя разница между методами и функциями невелика в Python и не существует в Python 3, он также не существует в Ruby, просто потому что Ruby не имеет функций. Когда вы определяете функции, вы на самом деле определяете методы для объекта.
Но вы по-прежнему не можете взять метод одного класса и вызвать его как функцию, вам придется привязать его к объекту, к которому вы хотите обратиться, что гораздо сложнее.
источник
TheClass.instance_method(:themethod).bind(anobject).call
будет эквивалентный рубин.Object
.Я хотел бы упомянуть API дескриптора Python, который позволяет настраивать «связь» между объектами и атрибутами. Также следует отметить, что в Python можно свободно реализовывать альтернативный протокол, переопределяя значение по умолчанию, заданное в реализации
__getattribute__
метода по умолчанию . Позвольте мне дать более подробную информацию о вышеупомянутом. Дескрипторы регулярные занятия с__get__
,__set__
и / или__delete__
методов. Когда интерпретатор встречает что-то подобноеanObj.anAttr
, выполняется следующее:__getattribute__
методanObj
вызывается__getattribute__
извлекает объект anAttr из класса dict__get__
,__set__
или__delete__
вызываемые объектыКак уже упоминалось, это поведение по умолчанию. Каждый свободен изменить протокол, повторно внедрив
__getattribute__
.Эта техника намного мощнее декораторов.
источник
В Ruby есть встроенная поддержка продолжения
callcc
.Следовательно, вы можете реализовать классные вещи, такие как amb-оператор
источник
На этом этапе Python все еще имеет лучшую поддержку юникода
источник
В Python есть строки документации, а в ruby нет ... Или, если это не так, они не доступны так же легко, как в python.
Ps. Если я ошибаюсь, пожалуйста, оставьте пример? У меня есть обходной путь, который я мог бы легко запрограммировать на уроки, но я бы хотел, чтобы документация была как бы «родным способом».
источник
Ruby имеет построчное зацикливание входных файлов (флаг '-n') из командной строки, поэтому его можно использовать как AWK. Это рубиновый лайнер:
будет считать строки, как в одной строке AWK:
Ruby получает эту возможность через Perl, который использует AWK как способ получения системных администраторов вместе с Perl без необходимости менять способ их выполнения.
источник
python -c "import sys; print len(list(sys.stdin))"
У Руби есть сигилы и веточки, а у Питона нет.
Изменить : И одна очень важная вещь, которую я забыл (в конце концов, предыдущий был просто немного вспыхнуть :-p):
Python имеет JIT-компилятор ( Psyco ), немного более низкий уровень языка для написания более быстрого кода ( Pyrex ) и возможность добавлять встроенный код C ++ ( Weave ).
источник
Мой питон ржавый, поэтому некоторые из них могут быть на питоне, и я просто не помню / никогда не учился во-первых, но вот первые несколько, о которых я подумал:
Пробелы
Руби обрабатывает пробелы совершенно иначе. Для начала вам не нужно ничего вставлять (это означает, что не имеет значения, используете ли вы 4 пробела или 1 табуляцию). Он также выполняет умное продолжение строки, поэтому действует следующее:
По сути, если вы заканчиваете оператором, он выясняет, что происходит.
Примеси
В Ruby есть миксины, которые могут расширять экземпляры вместо полных классов:
Перечисления
Я не уверен, что это то же самое, что генераторы, но в Ruby 1.9 ruby как enums, так
Ссылка: http://blog.nuclearsquid.com/writings/ruby-1-9-what-s-new-what-s-changed
"Аргументы по ключевым словам"
Оба перечисленных элемента поддерживаются в Ruby, хотя вы не можете пропустить такие значения по умолчанию. Вы можете пойти в порядке
Обратите внимание, что c = 5 фактически присваивает переменной c в вызывающей области значение 5, а параметру b - значение 5.
или вы можете сделать это с помощью хэшей, которые решают вторую проблему
Ссылка: Прагматическое руководство Progammer по Ruby
источник
(
,[
или{
Вы можете иметь код в определении класса как на Ruby, так и на Python. Однако в Ruby у вас есть ссылка на класс (self). В Python у вас нет ссылки на класс, так как класс еще не определен.
Пример:
self в этом случае является классом, и этот код будет выводить «Kaka». Невозможно распечатать имя класса или получить доступ к нему другими способами из тела определения класса в Python.
источник
class
оператором.Синтаксис не мелочь, он напрямую влияет на то, как мы думаем. Это также напрямую влияет на правила, которые мы создаем для систем, которые мы используем. В качестве примера у нас есть порядок операций из-за того, как мы пишем математические уравнения или предложения. Стандартные обозначения для математики позволяют людям читать ее более чем одним способом и получать разные ответы при одном и том же уравнении. Если бы мы использовали префиксную или постфиксную нотацию, мы бы создали правила, позволяющие различать, какими числами следует манипулировать, а не имели бы только правила для порядка вычисления значений.
Стандартные обозначения проясняют, о каких числах мы говорим, делая порядок их вычисления неоднозначным. Префиксная и постфиксная нотация делают порядок, в котором нужно вычислять простые данные, делая числа неоднозначными. В Python уже были бы многострочные лямбды, если бы не трудности, вызванные синтаксическим пробелом. (Предложения существуют для того, чтобы вытаскивать подобные вещи без обязательного добавления явных разделителей блоков.)
Я считаю, что проще писать условия, когда я хочу, чтобы что-то происходило, если условие ложно, гораздо проще написать с помощью оператора where в Ruby, чем семантически эквивалентной конструкции if-not в Ruby или других языках, например. Если большинство языков, которые люди используют сегодня, имеют одинаковую силу, как можно считать синтаксис каждого языка тривиальной вещью? После определенных функций, таких как блоки, механизмы наследования и т. Д., Синтаксис является наиболее важной частью языка, а не поверхностной.
Поверхностными являются эстетические качества красоты, которые мы приписываем синтаксису. Эстетика не имеет ничего общего с тем, как работает наше познание, а с синтаксисом.
источник
Удивило, что ничего не упомянуло о механизме «отсутствия метода». Я бы привел примеры методов find_by _... в Rails, как пример возможностей этой языковой функции. Я предполагаю, что нечто подобное может быть реализовано в Python, но, насколько мне известно, изначально его там нет.
источник
method_missing
можно эмулировать в Python в некоторых случаях:class M(): def __getattr__(self, n): return lambda: "Missing! " + n; M().hi()
. Однако, есть небольшие различия, и я сомневаюсь, что это идиоматично в Python :-)Еще одно различие в лямбдах между Python и Ruby демонстрируется проблемой генератора Пола Грэма . Перепечатано здесь:
В Ruby вы можете сделать это:
В Python вы бы создали объект для хранения состояния n:
Некоторые люди могут предпочесть явный подход Python как концептуально более ясный, даже если он немного более многословен. Вы сохраняете состояние, как и для всего остального. Вам просто нужно обернуть голову вокруг идеи вызываемых объектов. Но независимо от того, какой подход предпочитают эстетически, он демонстрирует одно уважение, в котором Ruby-лямбды являются более мощными конструкциями, чем Python.
источник
def foo(n): def f(i): return n + i return f
,def foo(n): L=[n] def f(i): L[0] += i return L[0] return f
, В Python3 вы можете использоватьnonlocal
ключевое слово.Python назвал необязательные аргументы
AFAIK Ruby имеет только позиционированные аргументы, потому что b = 2 в объявлении функции - это аффект, который всегда добавляется.
источник
def my_method(param1, optional = false)
работает в Ruby 1.8.6, 1.8.7 и, предположительно, 1.9!b
параметр вfunc
вызове, и он все еще поддерживает его значение по умолчанию. То естьb
является вторым аргументом в сигнатуре, но он может пропустить его, добавив перед вторым параметром префиксc=
. Ruby использует хеши для симуляции, но это не совсем то же самое.Ruby имеет встроенную документацию:
источник
http://c2.com/cgi/wiki?PythonVsRuby
http://c2.com/cgi/wiki?SwitchedFromPythonToRuby
http://c2.com/cgi/wiki?SwitchedFromRubyToPython
http://c2.com/cgi/wiki ? UsingPythonDontNeedRuby
http://c2.com/cgi/wiki?UsingRubyDontNeedPython
источник
С Cargo вы можете « требовать библиотеки, не загромождая пространство имен ».
источник