LINUX.ORG.RU

Ruby 2.4.0

 ,


0

5

25 декабря состоялся первый стабильный релиз ветки Ruby 2.4. В ней представлено много новых возможностей.

  • Улучшения хеш-таблицы (Владимир Макаров). Введены открытая адресация и упорядоченные в порядке добавления массивы. Это обсуждено со многими людьми, в особенности с Юрой Соколовым.
  • Привязка #irb: Старт сессии REPL по аналогии с binding.pry. Вместо логирования переменных множественными вызовами p можно подключить pry через binding.pry для запуска из приложения REPL и выполнения любого Ruby-кода. Теперь в поставку языка включён binding.irb, который позволяет проделать то же самое с irb.
  • Fixnum и Bignum объединены в Integer. Все C-расширения, затрагивающие классы Fixnum или Bignum, нужно поправить.
  • Поддержка соответствий заглавных символов Unicode. String/Symbol#upcase/downcase/swapcase/capitalize(!) теперь работают не только с ASCII.
  • Улучшения производительности. Array#max и Array#min больше не создают временный массив при некоторых условиях. Добавлен Regexp#match?, выполняющий проверку регулярного выражения без создания объекта с обратной ссылкой и изменения $~. Ускорен доступ к переменным экземпляров.

Улучшения отладки:

  • Thread#report_on_exception и Thread.report_on_exception. Ruby игнорирует исключения в потоках, если к ним явно не присоединён другой поток. С report_on_exception = true можно отследить, что поток умер из-за необработанного исключения. Присылайте отзывы, нужно ли включить эту опцию по умолчанию, равно как и report-on-GC, которая сообщает о сборке мусора в неприсоединённом потоке.
  • Отлов тупиков в потоках теперь отображает для потоков трассировку и зависимые потоки.

Другие значимые изменения с версии 2.3:

  • Поддержка OpenSSL 1.1.0 (прекращена поддержка 0.9.7 и более ранних).
  • Из stdlib убраны ext/tk и XMLRPC.

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

>>> Источник

Ответ на: комментарий от AnDoR

Что сломали на этот раз?

1) Fixnum и Bignum объединены в Integer. ВСЕ БИБЛИОТЕКИ нужно править и конпилировать. Теперь 70% RubyGems нерабочие!

2) Прекращена поддержка OpenSSL 0.9.7

3) Убраны ext/tk и XMLRPC.

И это только в Ruby 2.4.0, а сколько дров наломано предыдущими «модернизациями» с 2.0.X до 2.3.9...

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

ВСЕ БИБЛИОТЕКИ нужно править и конпилировать. Теперь 70% RubyGems нерабочие!

Истеричка, они работают, просто показыают warning'и

2.3.9

Последняя версия ветки 2.3 это 2.3.3, специалист.

сколько дров наломано предыдущими «модернизациями» с 2.0.X до 2.3.9...

Сколько? Почему я просто обновляю версию, пересобираю bundle и у меня все работает?

Alve ★★★★★ ()

Array#max и Array#min

По ссылке: «We often use an idiom [a, b].max because of the lack of Math.max(a, b)».

И поэтому вместо того, чтобы добавить max(a,b) теперь [a, b].max распознаётся компилятором и преобразуется в код без создания массива. Я недоумеваю...

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

Monk как бы намекает, что когда очевидная синтаксическая конструкция работает неочевидно, вернее, является неким особым случаем, исключением, то это странно выглядит.

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

Похоже, язык проектирует anonimous (или как там его, поехавшего на ООП)

На ООП уже лет 30 как поехали посредственные провинциальные институтики, которые плодят бесчисленные орды его адептов. Они там любят все «наглядное», «осязаемое» и квадратно-гнездовое. Anonimus лишь такая же тупая посредственность.

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

Что не создается массив. Потому что «когда ты пишешь [a, b], ты ожидаешь получить массив, содержащий a и b, а не специальный случай синтаксического сахара».

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

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

arr = [a, b]; arr.max

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

Сколько? Почему я просто обновляю версию, пересобираю bundle и у меня все работает?

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

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

Как выглядит грамматика Руби после такого нововведения? Это ведь первая ласточка. Потом ведь будет какой-нибудь [a, b].random и т.д. И по-твоему тоже всё нормально будет?

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

Как выглядит грамматика Руби после такого нововведения? Это ведь первая ласточка. Потом ведь будет какой-нибудь [a, b].random и т.д. И по-твоему тоже всё нормально будет?

Грамматика руби ни как не изменилась же. Тебя смущает когда хвостовые рекурсии разворачиваются в циклы или когда компилятор C оптимизирует day = 60 * 60 * 24 в day = 86400? Вот в данном случае тоже самое.

TDrive ★★★★★ ()

Годно, нужно. А для GUI его по задумке не хотят использовать? Вроде только GTK был из адекватного, всё остальное какое-то совсем не того, сложилось ощущение.

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

Он же просто делает require 'yaml' какие там костыли? Из того что реально сломали это например therubyracer там есть такой код

for type in [Class, Object, Array, Hash, String, Symbol, Time, Proc, Method, Fixnum] do
  type.class_eval do
    include V8::Conversion.const_get(type.name)
  end
end
А в ruby 2.4 Fixnum.name возвращает «Integer» Но это скорее исключение, и тут даже и не скажешь сразу кто виноват. И Это явно не 70% гемов.

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

Ну и че ты предлагаешь писать a.max(b).max(c).max(d) вместо [a, b, c, d].max? В руби нету метода max на числах, зато есть в модуле Enumerable который используется не только в массивах, а везде где есть метод each. Чел просто переопределил этот метод для массивов что бы он не использовал each + оптимизация

[a, b, ...].max/min -> a, b, c, opt_newarray_max/min
И все, весь старый код в котором были [a, b, ...].max/min просто будет работать быстрее.

Вы же с monk предлагаете запилить совершенно новый метод на числах, строках и вообще на всем, что можно сравнивать между собой + запилить в линтеры правило которое будет бить по рукам за [a, b, c].max и требовать a.max(b).max(c) и заставить всех переписать их старый код. Разумно...

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

1) Fixnum и Bignum объединены в Integer. ВСЕ БИБЛИОТЕКИ нужно править и конпилировать. Теперь 70% RubyGems нерабочие!

лучше как в питоне тащить две версии не забывая про кучу хлама который будет лежать ведь зачем переписывать под новую версию если и так работает?

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

Ну и че ты предлагаешь писать a.max(b).max(c).max(d) вместо [a, b, c, d].max?

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

>>> reduce(max, [1,3,0])
3
>>> 
Но я вопросов больше не имею, нечего флудить.

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

reduce(max, [1,3,0])

Omg. По смыслу здесь просится функция, max(1, 3, 0). Ну с рубистами бесполезно спорить, они не умеют в абстракции, просто тупой молебен на священную корову с переопределенными ногами.

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

В нормальном ООП пишут не [a,b].max, а a.max(b)

a.max(b) - это нифига не очевидно. Что здесь к чему? Это нужно специально узнавать в доках.

[1, 2, 3, 4, 5].max - конструкция очевидная.
max(1, 2, 3, 4, 5) - вот такой вариант тоже очевиден.

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

max(1, 3, 0)

Рубист тебе ответит, что это одни яйца с [a, b].

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

TDrive ★★★★★ ()