LINUX.ORG.RU

Релиз Ruby 2.1

 


5

9

Прекрасный новогодний подарок преподнес Matz всем любителям и профессионалам программирования на языке Ruby — релиз Ruby 2.1. В целом новый выпуск языка и среды исполнения написанного на нем кода продолжает эволюционное развитие Ruby и практически не вносит кардинальных или ломающих изменений. Кроме того, что стандартный интерпретатор стал работать быстрее, заявлены следующие отличительные особенности Ruby 2.1:

  • Кэширование названий методов. Теперь когда интерпретатор встречает название какого-то метода объекта, он производит поиск этого метода, после чего сохраняет указатель на него в байткоде. Если у вас есть код, в котором для объектов одного и того же типа часто вызывается один и тот же метод, работа этого участка программы будет ускорена. Для проверки корректности сохраненного значения в кэше MRI использует внутренние счетчики потенциально опасных в плане инвалидации кэшированного метода действий.
  • Поддержка профайлинга кода на уровне MRI. Вы можете измерять производительность вашего кода и отслеживать работу сборщика мусора (благодаря подписке на события запуска/останова сборщика мусора и создания/удаления объектов).
  • Обновленный сборщик мусора RGenGC (с поколениями). Более подробно с ним можно ознакомиться в захватывающей презентации [pdf] с RubyConf.
  • Добавлены суффиксы i и r для записи комплексных чисел.
  • Определение функции (def) теперь возвращает символ ее названия вместо nil.
  • Работа над неоднозначностью объявления refinements, то есть расширения модуля или класса в пределах одного локального файла. Подробнее [pdf].
  • Наконец-то Array#to_h — создание хэша из массива.
  • Сокращение записи «замороженных» строк (str = «mystring"f).
  • Для ускорения операций над очень большими числами используется GMP (The GNU Multiple Precision Arithmetic Library).
  • Обновлены стандартные библиотеки BigDecimal, JSON, NKF, Rake, RubyGems и RDoc.
  • Удалена поддержка из коробки curses (гем curses теперь при необходимости надо установить отдельно).
  • А также многое другое! Подробный список изменений прилагается.

Релиз явно удался на славу и его обязательно стоит попробовать. Исходные коды уже доступны на официальном сайте проекта.

>>> Подробности

★★★★★

Проверено: Shaman007 ()
Последнее исправление: ymn (всего исправлений: 1)
Ответ на: комментарий от mashina

Хамить ~ сказать что ты не знаешь Ruby?

И это тоже. Менторский тон не очень приятен(и совершенно неуместен, когда вы просто пересказываете информацию, почерпнутую в том числе и из моих сообщений). Но больше всего меня возмутило ваше

В Ruby заблаговременно нужно конвертировать контейнер в Array() потому, что какой-то недалёкий удак прилепил к нему join(), а не сделал его свободной ф-ией или методом строки

Должен заметить, после подобных оскорблений, вести беседу и относиться с уважением к вашей персоне, крайне затруднительно.

Оказалось, что это свойство гарантирует Object задавая дефолтный to_s, а не Array. Где здесь подмена понятий?

Подмена понятий в том, что когда я говорю о свойствах Array, я подразумеваю, что его элементы будут объектами Ruby, а не объектами mashina' Ruby. Терминологический спор, в который нас пытается увести фраза

это не гарантия Array(), а обещание стандартной объектной модели.

, не имеет смысла — в данном контексте это одно и то же.

Если обстоятельства к тому располагают, вы можете наследовать от BasicObject, разопределять методы и создавать свою собственную иерархию объектов, но это будут уже объекты другого типа — не того, который в общем случае ожидается объектами стандартной библиотеки.

Тип в Ruby — это функция, областью определения которой является множество методов, и областью значений которой является множество типов. Из популярных языков похожим образом parametric polymorphism объектов реализован в Ocaml.

Оба рассматриваемых ЯП могут кинуть исключение где угодно и в документации эти моменты оговариваются редко.

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

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

У строгой же типизации, к которой вы ссылаетесь, отсутствует строгое определение. А без него, «строгая типизация», как и «мультипарадигменный», это просто пустые слова(«marketing bullshit», с помощью которого пытаются впарить Python в ходе этой утомительной, навязчивой пропаганды).

Python вынуждает программиста отвлекаться на низкоуровневые операции, которые компьютер должен делать сам. Если это «просто», то самый простой язык — ассемблер. Представьте себе, что у вас вместо map() отдельные функции: map_int(), map_str() и так далее. Это безобразие не намного хуже того, что в Python сейчас.

С моей точки зрения, система типов — очевидный недостаток Python, но если вы думаете иначе и желаете на нем писать, у меня к вам по этому поводу нет никаких претензий.

Anatolik ★★
()
Ответ на: комментарий от RA
>>> help(''.join)
...
S.join(iterable) -> string

Return a string which is the concatenation of the strings in the
iterable.  The separator between elements is S.
Возвращает строку, которая есть сложение строк в `некой хрени, поддерживающей итерацию` (== iterable)

Смотрим на код:

"abc".join("def") => "dabceabcf"
Python берет строку «def», сам получает из нее объект-итератор по ней (в случае встроенных типов данных это происходит с помощью функции iter, емнип). Итератор по строке будет выдавать по порядку символы, из которых она состоит, пока не дойдет до конца строки. Потому что в Python строка это совокупность символов, а символ это строка единичной длины:
>>> "d" "e" "f"
'def'
Обобщая, получим в данном конкретном случае,
"abc".join("def") =>  "d" + "abc" + "e" + "abc" + "f" => "dabceabcf"

я например ожидал

Почему что-то должно работать так, как ты ожидаешь, а не так, как задумано людьми, его создавшими?

Virtuos86 ★★★★★
()
Ответ на: комментарий от Anatolik

Тип в Ruby — это функция, областью определения которой является множество методов, и областью значений которой является множество типов.
С моей точки зрения, система типов — очевидный недостаток Python, ...

Один вопрос: что такое тип в Python? У Вас должно быть точное представление об этом, чтобы иметь претензии к системе типов.

Virtuos86 ★★★★★
()

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

['Вася', 'Петя', Array] ['Вася', 'Петя', list]

Далее в коде выполняется join с разделителем ', '

В тестах случай с ошибкой не учли (определенный случай не случился). Теперь вопрос. Какое поведение на ваш взгляд лучше/правильнее/грамотнее?

1. Программа выдает пользователю «Вася, Петя, Array» и пользователь начинает думать, кто такой Array, что это за человек и откуда он взялся?

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

anonymous
()
Ответ на: комментарий от anonymous

Какое поведение на ваш взгляд лучше/правильнее/грамотнее?

Всё зависит от правил. Оба ответа поэтому имеют смысл. Но я бы выбрал второй, потому что это явная ошибка типизации.

Virtuos86 ★★★★★
()
Ответ на: комментарий от umren

Вранье. Россия давно еврожопу и СШП обогнала по доступности высокооплачиваемой работы для кодеров.

anonymous
()
Ответ на: комментарий от anonymous

Что за бред? :) среднее по больнице у нас в разы ниже

umren ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.