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)
Ответ на: комментарий от special-k

При чем тут софт. ФВП это такая же неотъемлемая часть FP, как инкапсуляция и бла-бла-бла часть ООП. Как может быть ненужной основа парадигмы программирования. Ими пользовались, пользуются и будут пользоваться.

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

Лучше взять руби, ведь там все чесночно. Чем руби-то не устраивает?

Много нерегулярностей и лишних сущностей по сравнению с кложурой, тормоза по сравнению с go, более бедные библиотеки по сравнению с питоном.

Да и в питоностиле попадается код.

PolarFox ★★★★★
()
Последнее исправление: PolarFox (всего исправлений: 1)
Ответ на: комментарий от Virtuos86

Ими пользовались, пользуются

Вот в этом я сомневаюсь, но могу смириться с тем, что просто пока не понимаю.

special-k ★★★★
()
Ответ на: комментарий от tailgunner

Ох.. вот прям же цель стоит «победить питон» -_-

special-k ★★★★
()
Ответ на: комментарий от PolarFox

Много нерегулярностей и лишних сущностей по сравнению с кложурой

Ну.. много не мало, давай еще поиграем в однострочники кложура вс руби

бедные библиотеки

Зато синтаксическая бедность питона не позволит сделать такие классные вещи как active_record, например.

тормоза

тут да, жаль не гугл его пилит, или не жаль.. хз.

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

Вот в этом я сомневаюсь

Как раз в последнее время ФВП весьма актуальны. Заменив вызовы map на вызовы pmap (чуть ли не автозаменой в текстовом редакторе) можно бесплатно (без дополнительных затрат со стороны программиста) получить рабочий многопоточный код.

Про комбинацию из map и reduce при написании кластеризуемого кода уж и говорить не приходится.

PolarFox ★★★★★
()
Ответ на: комментарий от special-k

Лениво придумывать что-то своё, поэтому возьму пример из доков. Сумма первых десяти чётных квадратов натуральных чисел:

(->> (range)
     (map #(* % %))
     (filter even?)
     (take 10)
     (reduce +))
PolarFox ★★★★★
()
Ответ на: комментарий от special-k

Немного не то. Мой код берёт не квадрат первых десяти чётных чисел, а первые 10 чётных квадратов, т.е. сумму 0 4 16 36 64 100 144 196 256 324 = 1140.

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

И кто такой код будет поддерживать?

И нижний тоже, заодно. Но его я могу понять, ruby гораздо лучше знаю.

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

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

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

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

[
  [ {a: 1, b: 2} ],
  [ {c: 3, d: 4} ],
  [ {e: 5, f: 6} ],
].map(&:first)
 .inject(:merge)
 .inject({}){|h,(k,v)| h["--#{k}--"]=v; h }
#{"--a--"=>1, "--b--"=>2, "--c--"=>3, "--d--"=>4, "--e--"=>5, "--f--"=>6}

special-k ★★★★
()
Последнее исправление: special-k (всего исправлений: 1)
Ответ на: комментарий от special-k
(def data
    [{:a 1 :b 2}
     {:c 3 :d 4}
     {:e 5 :f 6}])

(->> data
    (apply merge)
    ((fn [x] (zipmap (map #(format "--%s--" (name %)) (keys x))
                     (vals x)))))
{"--e--" 5, "--d--" 4, "--f--" 6, "--b--" 2, "--c--" 3, "--a--" 1}
PolarFox ★★★★★
()
Ответ на: комментарий от special-k

Ок, не заметил. Тогда так:

(def data
    [[{:a 1 :b 2}]
     [{:c 3 :d 4}]
     [{:e 5 :f 6}]])

(->> data
    (flatten)
    (apply merge)
    ((fn [x] (zipmap (map #(format "--%s--" (name %)) (keys x))
                     (vals x)))))

Вместо (flatten) можно написать (map first) или любую другую штуку, которая достанет словарь из обёртки.

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

Угу, примерно так, но я буду настаивать, что вот это

.inject({}){ |h,(k,v)| 
  h["--#{k}--"]=v
  h 
}
значительно проще чем это
((fn [x] (zipmap (map #(format "--%s--" (name %)) (keys x))
                 (vals x)))))
Т.к. реализовано в одно замыкание одним действием.

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

Кому как. Мне синтаксическая конструкция в ruby кажется стрёмной, в то время как в кложуре просто вызов различных функций с различными параметрами.

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

конструкция в ruby кажется стрёмной

Ну уж не знаю..: вложенности нет, элементарное действие. Блоки гибче. Отсутствие блоков принуждает к шаманству.

special-k ★★★★
()
Последнее исправление: special-k (всего исправлений: 1)
Ответ на: комментарий от special-k

(Я не знаю синтаксис руби, а в других языках подобных конструкций я не видел, потому и стрёмно, может оно не так плохо как выглядит на первый взгляд)

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

(defn transform-keys [f x]
    (zipmap (map f (keys x))
            (vals x)))

В дефолтной либе я такой функции не нашёл, видимо трансформация ключей — редкий юзкейс.

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

Плюс функционального подхода

Везде можно несколько операций объединить в функцию и после использовать:)

синтаксис руби

Вызов метода с блоком..

#вот простой вызов
obj.method

#с параметрами
obj.method 1, 2
#или так
obj.method(1,2)

#с блоком (блок это практически лямбда)
obj.method{ 
  #всякие действия
}

#с блоком с параметрами (method передаст в a,b,c какие-то конкретные значения, которые будут доступны для действий внутри блока)
obj.method{|a,b,c|
  #всякие действия
}

#все вместе
obj.method(1,2){|a,b,c|
  #всякие действия
}

редкий юзкейс

Видимо, иногда удобно, иногда не очень.

special-k ★★★★
()
Последнее исправление: special-k (всего исправлений: 2)
Ответ на: комментарий от special-k

А мне интересно, что ты сделаешь, если будет вот так:

Хм, получилось даже универсальнее и проще чем было.

(def data
    [[{:a 1 :b 2}]
     [{:c 3 :d 4}]
     [{:e 5 :f 6}]])

(->> data
    (flatten)
    (apply merge)
    (vec)
    (map (fn [[k v]] [(format "-%s-%s-" (name k) v) v]))
    (flatten)
    (apply hash-map))
PolarFox ★★★★★
()
Последнее исправление: PolarFox (всего исправлений: 1)
Ответ на: комментарий от PolarFox

Прикольно-прикольно, примечательно, что на руби я могу написать примерно так же (с распадом хэша и собиранием обратно). Как я уже говорил на руби можно по-всякому, а на других как-то определенно.. и это «определенно» как-нибудь прогнет под себя однажды.

А что, в кложуре лямбд нет что ли?

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

в кложуре лямбд нет что ли

fn или #(), если под лямбдой ты имеешь в виду созданную на ходу анонимную функцию.

Как я уже говорил на руби можно по-всякому, а на других как-то определенно

В кложуре есть макросы, можно извращаться по всякому. Например магическая стрелка ->>, от которой я так балдею — не часть синтаксиса, а макрос, который подставляет первый аргумент в конец скобок следующего аргумента и так далее. Можно на ходу определять новые синтаксические хреновины, конкретно стрелка определена вот так:

(defmacro ->>
  "Threads the expr through the forms. Inserts x as the
  last item in the first form, making a list of it if it is not a
  list already. If there are more forms, inserts the first form as the
  last item in second form, etc."
  {:added "1.1"} 
  ([x form] (if (seq? form)
              (with-meta `(~(first form) ~@(next form)  ~x) (meta form))
              (list form x)))
  ([x form & more] `(->> (->> ~x ~form) ~@more)))
PolarFox ★★★★★
()
Ответ на: комментарий от special-k

Зато синтаксическая бедность питона не позволит сделать такие классные вещи как active_record, например.

Ты серьезно? Рельсовский active record это жалкое убожество. Код rails моделей представляет собой жуткую смесь ruby кода и кусков sql кода. Rails Active Record это ORM уровня Code Igniter.

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

А где AR реализован не убожески? Исопльзую Rails с AR, все нравится, может мне не с чем сравнить?

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

Любой запрос сложнее where(column: value) превращается в жуткую смесь ruby кода и кусков sql. Разделение «схема БД отдельно, а модели отдельно» тоже ущербная идея, приходится городить костыли типа https://github.com/ctran/annotate_models Кроме того если программист затупит в схеме может получится таблица для которой нет модели. Учитывая что схему никто не смотрит, то таблица там будет жить очень долго. Rails AR из коробки не поддерживает foreign key есть конечно gem https://github.com/matthuhiggins/foreigner но политика партии такая что foreign key это плохо и такие связи должны отслеживаться на уровне rails application. Опять же из коробки нет composite primary key есть gem но его работоспособность и совместимость с другими джемами не гарантируется...

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

Хотя тут и набигают клоуны, с троллингом на тему руби=раилз, но ведь для руби это безусловный плюс, потому что web разработка => rails => ruby

по мойму это очень важно и вполне себе unix-way, ruby=rails это жирный плюс этого языка, единый стек на всех вакансиях.

для других вещей есть другие языки.

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

Рельсовский active record это жалкое убожество.

ах-ха-ха))

Кроме того если программист затупит в схеме может получится таблица для которой нет модели.

кулстори бро

таблица там будет жить очень долго

Вот он, мой новый персонаж ночных кошмаров.

политика партии такая что foreign key это плохо

Политика партии: foreign key это хорошо. Правда запросы это одно, а оптимизация БД - другое.

В целом все предельно ясно, боль на тему: «С active record не нужно знать sql, нельзя допусить!».

Код моих моделей представляет собой жуткую смесь ruby кода и кусков sql

Это печально, а вы не думали сменить поприще..

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

С active record не нужно знать sql

Спасибо, посмеялся! Ты вообще что то сложнее бложика на рельсе делал?

Код моих моделей представляет собой жуткую смесь ruby кода и кусков sql

Жаль тебя.

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

Ты вообще что то сложнее бложика на рельсе делал?

Догадка оказалась верна, иди остуди свой зад, разговор вовсе не об этом.

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

Разговор о том что ты недостаточно компетентный что бы судить о недостатках Rails AR. Твой тон истерички говорит что у руби фанбоя опять попоболь. Не переживай ты так все языки нужны, все языки важны, даже не смотря на то что руби и рейлс редкая какашка.

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

Если бы вы(любители Python) не приходили пообсуждать Python, здесь было бы 1-2 страницы обсуждения по теме, и вряд ли кто-то бы вообще его упоминал. Это достаточно необычная навязчивость. Каковы ее мотивы?

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