Ruby 2.0 продовжує розвиток гілки 1.9.x, не містить революційних змін і, незважаючи на ряд істотних нововведень, зберігає сумісність з Ruby 1.9.3. За словами розробників, завдяки уважному ставленню до забезпечення сумісності з існуючими додатками, міграція з гілки 1.9 на 2.0 повинна пройти помітно легше, ніж з 1.8 на 1.9. Також наголошується, що на відміну від 1.9.0 випуск 2.0.0 є повністю стабільним і готовим для повсюдного впровадження.
Основні поліпшення, додані в Ruby 2.0.0:
- Ключові слова в якості аргументів: наприклад, крім «1.step (20, 2)» можна писати «1.step (by: 2, to: 20)» з визначенням методу як «def step (by: step, to: limit )», що значно покращує читання коду;
- Підтримка конструкції «Refinements» (Module # refine) для підвищення безпеки внесення змін в код на льоту ("monkey patching"). Наприклад, можна застосувати «уточнення» до глобального класу в контексті тільки певного модуля, при цьому зміни будуть застосовані лише до вказаного контексту. Можливість відзначена як експериментальна, тому не виключається, що логіка роботи в майбутньому може помінятися;
- Новий спосіб розширення класів за допомогою конструкції Module # prepend, що дозволяє додати модуль на початок ланцюжка виклику;
- Підтримка літерала «% i», призначеного для спрощеного створення масиву символів («KEYS =% i [foo bar baz]» замість «KEYS = [: foo,: bar,: baz]»);
- Підтримка змінної __ dir__, яка повертає шлях до директорії поточного запущеного файлу (наприклад, File.read (__dir__ + '/. Config'));
- Використання кодування UTF-8 за замовчуванням. При вказівці символів в кодуванні UTF-8 в скриптах відтепер більше немає необхідності у використанні таких хитрощів як спецкомментарій «# encoding: utf-8»;
- Нові методи Enumerable # lazy і Enumerator :: Lazy з реалізацією «ледачих» перерахувань, не виконуються відразу, а тільки при безпосередній необхідності в даних. Lazy-перерахування працюють приблизно в два рази повільніше звичайних;
- Нові методи Enumerator # size і Range # size, що дозволяють обчислити розмір перерахування до того як воно буде виконано;
- Підтримка методу «# to_h» для перетворення класу в хеш (car = Car.new ('Toyota', 'Prius', 2014); car.to_h # => {: make => "Toyota",: model => "Prius ",: year => 2014});
- Нові методи Array # bsearch і Range # bsearch для виконання бінарного пошуку (ary = [0, 4, 7, 10, 12]; ary.bsearch {| x | x> = 6});
- Перехід на Onigmo (форк Oniguruma), новий двигунець для виконання регулярних виразів;
- API для обробки виключень в асинхронному режимі;
- Підтримка системи динамічного налагодження DTrace, за допомогою якої можна організувати діагностику роботи немодифікованого скрипту під час його виконання;
- TracePoint — покращений API для трасування додатків;
- Оптимізація продуктивності збирача сміття, наприклад, застосування техніки маркування по бітовим картам;
- Оптимізація роботи конструкції Kernel # require, що дозволило помітно прискорити запуск Rails;
- Оптимізація роботи віртуальної машини;
- Оптимізація продуктивності операцій з плаваючою комою;
Такі популярні проекти, як Rails та tDiary, вже перевірені на повну сумісність з Ruby 2.0. Тим не менш, ряд змін в новій версії призводить до появи окремих несумісностей:
- кодуванням за замовчуванням є UTF-8;
- видалена підтримка бібліотеки Iconv;
- порушена сумісність ABI (вимагається перезбирання бібліотек-розширень);
- # Lines, # chars, # codepoints і # bytes тепер повертають результат з типом Array замість Enumerator;
- Object # inspect тепер завжди повертає строкові значення.
Немає коментарів:
Дописати коментар