From 0a5e4cb89f6849ddb2a324d119efca08a31b567b Mon Sep 17 00:00:00 2001 From: Andrii Furmanets Date: Mon, 22 Dec 2025 15:03:45 +0200 Subject: [PATCH 1/5] Add Ukrainian locale content and news translations --- 404.md | 2 +- Rakefile | 2 +- _data/languages.yml | 3 + _data/locales/home/ua.yml | 114 ++++ _data/locales/ua.yml | 233 +++++++++ _plugins/translation_status.rb | 2 +- index.html | 2 + ua/404.md | 10 + ua/about/index.md | 236 +++++++++ ua/about/license.txt | 52 ++ ua/about/logo/index.md | 23 + ua/about/website/index.md | 93 ++++ ua/community/conferences/index.md | 45 ++ ua/community/index.md | 60 +++ ua/community/mailing-lists/index.md | 44 ++ .../ruby-talk-guidelines/index.md | 79 +++ ua/community/podcasts/index.md | 42 ++ ua/community/ruby-core/index.md | 135 +++++ .../ruby-core/writing-patches/index.md | 52 ++ ua/community/user-groups/index.md | 48 ++ ua/community/weblogs/index.md | 57 ++ ua/conduct/index.md | 25 + ua/documentation/faq/1/index.md | 337 ++++++++++++ ua/documentation/faq/10/index.md | 144 +++++ ua/documentation/faq/11/index.md | 192 +++++++ ua/documentation/faq/2/index.md | 103 ++++ ua/documentation/faq/3/index.md | 198 +++++++ ua/documentation/faq/4/index.md | 427 +++++++++++++++ ua/documentation/faq/5/index.md | 238 +++++++++ ua/documentation/faq/6/index.md | 294 +++++++++++ ua/documentation/faq/7/index.md | 445 ++++++++++++++++ ua/documentation/faq/8/index.md | 375 +++++++++++++ ua/documentation/faq/9/index.md | 376 +++++++++++++ ua/documentation/faq/index.md | 62 +++ ua/documentation/index.md | 249 +++++++++ ua/documentation/installation/index.md | 438 ++++++++++++++++ ua/documentation/quickstart/2/index.md | 121 +++++ ua/documentation/quickstart/3/index.md | 225 ++++++++ ua/documentation/quickstart/4/index.md | 142 +++++ ua/documentation/quickstart/index.md | 142 +++++ .../ruby-from-other-languages/index.md | 420 +++++++++++++++ .../to-ruby-from-c-and-cpp/index.md | 139 +++++ .../to-ruby-from-java/index.md | 57 ++ .../to-ruby-from-perl/index.md | 66 +++ .../to-ruby-from-php/index.md | 49 ++ .../to-ruby-from-python/index.md | 71 +++ ua/documentation/success-stories/index.md | 81 +++ ua/downloads/branches/index.md | 37 ++ ua/downloads/index.md | 88 ++++ ua/downloads/mirrors/index.md | 49 ++ ua/downloads/releases/index.md | 35 ++ ua/examples/cities.md | 22 + ua/examples/greeter.md | 22 + ua/examples/hello_world.md | 17 + ua/examples/i_love_ruby.md | 17 + ua/feeds/news.rss | 4 + ua/index.html | 15 + ua/libraries/index.md | 135 +++++ ua/news/_posts/2004-01-17-rss-feed-started.md | 10 + .../_posts/2024-12-25-ruby-3-4-0-released.md | 369 +++++++++++++ .../_posts/2024-12-25-ruby-3-4-1-released.md | 39 ++ .../_posts/2025-01-15-ruby-3-3-7-released.md | 43 ++ .../_posts/2025-02-04-ruby-3-2-7-released.md | 42 ++ .../2025-02-10-dos-net-imap-cve-2025-25186.md | 29 + .../_posts/2025-02-14-ruby-3-4-2-released.md | 50 ++ .../_posts/2025-02-26-security-advisories.md | 69 +++ .../_posts/2025-03-26-ruby-3-1-7-released.md | 46 ++ .../_posts/2025-03-26-ruby-3-2-8-released.md | 46 ++ .../_posts/2025-04-09-ruby-3-3-8-released.md | 42 ++ .../_posts/2025-04-14-ruby-3-4-3-released.md | 50 ++ ...2025-04-18-ruby-3-5-0-preview1-released.md | 109 ++++ .../2025-04-28-dos-net-imap-cve-2025-43857.md | 35 ++ .../_posts/2025-05-14-ruby-3-4-4-released.md | 53 ++ .../2025-07-08-dos-resolv-cve-2025-24294.md | 41 ++ .../_posts/2025-07-15-ruby-3-4-5-released.md | 50 ++ .../_posts/2025-07-24-ruby-3-2-9-released.md | 52 ++ .../_posts/2025-07-24-ruby-3-3-9-released.md | 51 ++ .../_posts/2025-09-16-ruby-3-4-6-released.md | 50 ++ .../2025-09-18-dos-rexml-cve-2025-58767.md | 28 + .../_posts/2025-10-07-ruby-3-4-7-released.md | 52 ++ .../_posts/2025-10-07-uri-cve-2025-61594.md | 35 ++ ...25-10-17-rubygems-repository-transition.md | 32 ++ .../_posts/2025-10-23-ruby-3-3-10-released.md | 45 ++ ...2025-11-17-ruby-4-0-0-preview2-released.md | 128 +++++ .../_posts/2025-12-17-ruby-3-4-8-released.md | 50 ++ ...2025-12-18-ruby-4-0-0-preview3-released.md | 495 ++++++++++++++++++ .../2025-12-22-redesign-site-identity.md | 24 + ua/privacy/index.md | 33 ++ ua/security/index.md | 135 +++++ 89 files changed, 9521 insertions(+), 3 deletions(-) create mode 100644 _data/locales/home/ua.yml create mode 100644 _data/locales/ua.yml create mode 100644 ua/404.md create mode 100644 ua/about/index.md create mode 100644 ua/about/license.txt create mode 100644 ua/about/logo/index.md create mode 100644 ua/about/website/index.md create mode 100644 ua/community/conferences/index.md create mode 100644 ua/community/index.md create mode 100644 ua/community/mailing-lists/index.md create mode 100644 ua/community/mailing-lists/ruby-talk-guidelines/index.md create mode 100644 ua/community/podcasts/index.md create mode 100644 ua/community/ruby-core/index.md create mode 100644 ua/community/ruby-core/writing-patches/index.md create mode 100644 ua/community/user-groups/index.md create mode 100644 ua/community/weblogs/index.md create mode 100644 ua/conduct/index.md create mode 100644 ua/documentation/faq/1/index.md create mode 100644 ua/documentation/faq/10/index.md create mode 100644 ua/documentation/faq/11/index.md create mode 100644 ua/documentation/faq/2/index.md create mode 100644 ua/documentation/faq/3/index.md create mode 100644 ua/documentation/faq/4/index.md create mode 100644 ua/documentation/faq/5/index.md create mode 100644 ua/documentation/faq/6/index.md create mode 100644 ua/documentation/faq/7/index.md create mode 100644 ua/documentation/faq/8/index.md create mode 100644 ua/documentation/faq/9/index.md create mode 100644 ua/documentation/faq/index.md create mode 100644 ua/documentation/index.md create mode 100644 ua/documentation/installation/index.md create mode 100644 ua/documentation/quickstart/2/index.md create mode 100644 ua/documentation/quickstart/3/index.md create mode 100644 ua/documentation/quickstart/4/index.md create mode 100644 ua/documentation/quickstart/index.md create mode 100644 ua/documentation/ruby-from-other-languages/index.md create mode 100644 ua/documentation/ruby-from-other-languages/to-ruby-from-c-and-cpp/index.md create mode 100644 ua/documentation/ruby-from-other-languages/to-ruby-from-java/index.md create mode 100644 ua/documentation/ruby-from-other-languages/to-ruby-from-perl/index.md create mode 100644 ua/documentation/ruby-from-other-languages/to-ruby-from-php/index.md create mode 100644 ua/documentation/ruby-from-other-languages/to-ruby-from-python/index.md create mode 100644 ua/documentation/success-stories/index.md create mode 100644 ua/downloads/branches/index.md create mode 100644 ua/downloads/index.md create mode 100644 ua/downloads/mirrors/index.md create mode 100644 ua/downloads/releases/index.md create mode 100644 ua/examples/cities.md create mode 100644 ua/examples/greeter.md create mode 100644 ua/examples/hello_world.md create mode 100644 ua/examples/i_love_ruby.md create mode 100644 ua/feeds/news.rss create mode 100644 ua/index.html create mode 100644 ua/libraries/index.md create mode 100644 ua/news/_posts/2004-01-17-rss-feed-started.md create mode 100644 ua/news/_posts/2024-12-25-ruby-3-4-0-released.md create mode 100644 ua/news/_posts/2024-12-25-ruby-3-4-1-released.md create mode 100644 ua/news/_posts/2025-01-15-ruby-3-3-7-released.md create mode 100644 ua/news/_posts/2025-02-04-ruby-3-2-7-released.md create mode 100644 ua/news/_posts/2025-02-10-dos-net-imap-cve-2025-25186.md create mode 100644 ua/news/_posts/2025-02-14-ruby-3-4-2-released.md create mode 100644 ua/news/_posts/2025-02-26-security-advisories.md create mode 100644 ua/news/_posts/2025-03-26-ruby-3-1-7-released.md create mode 100644 ua/news/_posts/2025-03-26-ruby-3-2-8-released.md create mode 100644 ua/news/_posts/2025-04-09-ruby-3-3-8-released.md create mode 100644 ua/news/_posts/2025-04-14-ruby-3-4-3-released.md create mode 100644 ua/news/_posts/2025-04-18-ruby-3-5-0-preview1-released.md create mode 100644 ua/news/_posts/2025-04-28-dos-net-imap-cve-2025-43857.md create mode 100644 ua/news/_posts/2025-05-14-ruby-3-4-4-released.md create mode 100644 ua/news/_posts/2025-07-08-dos-resolv-cve-2025-24294.md create mode 100644 ua/news/_posts/2025-07-15-ruby-3-4-5-released.md create mode 100644 ua/news/_posts/2025-07-24-ruby-3-2-9-released.md create mode 100644 ua/news/_posts/2025-07-24-ruby-3-3-9-released.md create mode 100644 ua/news/_posts/2025-09-16-ruby-3-4-6-released.md create mode 100644 ua/news/_posts/2025-09-18-dos-rexml-cve-2025-58767.md create mode 100644 ua/news/_posts/2025-10-07-ruby-3-4-7-released.md create mode 100644 ua/news/_posts/2025-10-07-uri-cve-2025-61594.md create mode 100644 ua/news/_posts/2025-10-17-rubygems-repository-transition.md create mode 100644 ua/news/_posts/2025-10-23-ruby-3-3-10-released.md create mode 100644 ua/news/_posts/2025-11-17-ruby-4-0-0-preview2-released.md create mode 100644 ua/news/_posts/2025-12-17-ruby-3-4-8-released.md create mode 100644 ua/news/_posts/2025-12-18-ruby-4-0-0-preview3-released.md create mode 100644 ua/news/_posts/2025-12-22-redesign-site-identity.md create mode 100644 ua/privacy/index.md create mode 100644 ua/security/index.md diff --git a/404.md b/404.md index 2312dbca63..586f1c6bd0 100644 --- a/404.md +++ b/404.md @@ -9,7 +9,7 @@ permalink: /404.html (function() { // Detect language from URL path var path = window.location.pathname; - var match = path.match(/^\/(bg|de|en|es|fr|id|it|ja|ko|pl|pt|ru|tr|vi|zh_cn|zh_tw)\//); + var match = path.match(/^\/(bg|de|en|es|fr|id|it|ja|ko|pl|pt|ru|tr|ua|vi|zh_cn|zh_tw)\//); if (match && match[1] !== 'en') { var lang = match[1]; diff --git a/Rakefile b/Rakefile index 49e2b98856..74a84954d6 100644 --- a/Rakefile +++ b/Rakefile @@ -8,7 +8,7 @@ rescue LoadError => e exit(-1) end -LANGUAGES = %w[bg de en es fr id it ja ko pl pt ru tr vi zh_cn zh_tw].freeze +LANGUAGES = %w[bg de en es fr id it ja ko pl pt ru tr ua vi zh_cn zh_tw].freeze CONFIG = "_config.yml" task default: [:build] diff --git a/_data/languages.yml b/_data/languages.yml index 49daa5cd02..162f129ccb 100644 --- a/_data/languages.yml +++ b/_data/languages.yml @@ -38,6 +38,9 @@ - code: tr name: Turkish native_name: Türkçe +- code: ua + name: Ukrainian + native_name: Українська - code: vi name: Vietnamese native_name: Tiếng Việt diff --git a/_data/locales/home/ua.yml b/_data/locales/home/ua.yml new file mode 100644 index 0000000000..0bcff97218 --- /dev/null +++ b/_data/locales/home/ua.yml @@ -0,0 +1,114 @@ +hero: + since: "Since" + year: "1995" + title: "Ruby" + latest_version_label: "Latest Version:" + download_button: "Download" + or: "або" + learn_more: "Дізнатися більше" + +try_ruby: + title: "Спробуйте Ruby!" + description: "Спробуйте Ruby у браузері просто зараз" + button_url: "https://try.ruby-lang.org/" + bottom_text: "Хочете дізнатися більше або спробувати Ruby?" + bottom_link_url: "https://try.ruby-lang.org/" + +why_ruby: + title: Чому Ruby? + description: Чому програмісти по всьому світу люблять Ruby? Що робить його цікавим? + features: + - id: ecosystem + title: Ecosystem + read: Багаті геми підтримують усі види розробки.
Зрілі інструменти готові до використання. + copy: | + Ruby має велику колекцію бібліотек, що називаються гемами, які підтримують усе — від веброзробки до обробки даних. + Зі зрілими фреймворками на кшталт Rails і комплексними наборами інструментів ви можете поєднувати чудові наявні ресурси + для швидкого створення високоякісних застосунків без повторного винайдення колеса. + comment: + author: + id: matz + name: Yukihiro "Matz" Matsumoto + title: Creator of Ruby + content: | + Коли я випустив Ruby у світ, я й не уявляв, що з нього виросте така багата екосистема. + Понад 200 000 гемів, Ruby on Rails, RSpec, Bundler — усе це створила й підтримувала спільнота. + Моє бажання «зробити програмістів щасливими» здійснилося так, як я не зміг би досягти сам. + - id: simple + title: Simple + read: Легко писати, легко читати.
Природний синтаксис, як у розмовній мові. + copy: | + Ruby має простий та інтуїтивний синтаксис, який читається як природна мова. + Позбуваючись складних символів і багатослівних конструкцій, філософія дизайну Ruby дозволяє вам безпосередньо висловлювати те, що ви хочете. + З мінімумом шаблонного коду й високою читабельністю він дружній для новачків і зручний для досвідчених розробників. + comment: + author: + id: dhh + name: David Heinemeier Hansson + title: Creator of Ruby on Rails + content: | + Ruby — це просто найкрасивіша мова програмування, яку я коли-небудь бачив.
+ І я приділяю чималу увагу новим мовам програмування, що з'являються, + новим середовищам, новим фреймворкам, і досі не бачив нічого, що відповідало б Ruby або перевершило його в чистоті дизайну. + - id: productivity + title: Productivity + read: Робіть більше з меншим обсягом коду.
Інтуїтивний синтаксис прискорює розробку. + copy: | + Виразний синтаксис Ruby дозволяє стисло писати складну логіку. + Використовуючи потужні можливості, як-от метапрограмування та блоки, ви можете зменшити повторення й зосередитися на вирішенні основних задач. + З потужними фреймворками для тестування ви можете зберігати якість і досягати швидких циклів розробки. + comment: + author: + id: pragdave + name: Dave Thomas + title: Author of "The Pragmatic Programmer" + content: | + Ruby швидко перетворює ідеї на код. + Його простота допомагає мені залишатися зосередженим; його виразність дозволяє писати так, як я думаю.
+ Відчуття, ніби мова відходить убік, залишаючи тільки мене і задачу. + З чудовими інструментами та бібліотеками ідеї швидко стають працюючим, елегантним кодом. + + - id: community + title: Community + read: Розробники по всьому світу підтримують одне одного.
Тепла, активна спільнота. + copy: | + Спільнота Ruby дотримується культури "Matz is nice and so we are nice (MINASWAN)", + вітаючи всіх — від новачків до експертів. Конференції та зустрічі по всьому світу сприяють обміну знаннями й налагодженню зв'язків. + Це тепла, стійка спільнота, де люди допомагають один одному й ростуть разом. + comment: + author: + id: amanda + name: Amanda Perino + title: Executive Director of Rails Foundation + content: | + Спільнота Ruby сповнена таланту й креативності — розробників, яких приваблює елегантний синтаксис Ruby і які програмують заради задоволення. + Це яскрава, гостинна спільнота, готова поділитися своєю любов'ю до програмування з усіма. + Цей дух тепла й співпраці — безумовно, найбільша цінність Ruby. + +companies: + title: "Компанії" + heart: "♥" + subtitle: "Ruby" + +community: + title: "Долучайтеся до спільноти" + description_1: "Людей, які взаємодіють із Ruby не лише як користувачі, називають Rubyists." + description_2: "Rubyists, які люблять Ruby, — усі милі #rubyfriends. Активності спільноти бурхливі та веселі." + motto_prefix: "Універсальний девіз —" + motto_minaswan: "MINASWAN" + motto_separator: "—" + motto_translation: "Matz is nice and so we are nice" + links: + - text: "Дізнайтеся більше про спільноту" + url: "/ua/community/" + - text: "Майбутні міжнародні конференції" + url: "https://www.rubyevents.org" + external: true + +news_security: + news: + title: "Новини" + more_link: "Читати більше новин" + security: + title: "Безпека" + more_link: "Читати більше про безпеку" diff --git a/_data/locales/ua.yml b/_data/locales/ua.yml new file mode 100644 index 0000000000..c2eb9a0a8f --- /dev/null +++ b/_data/locales/ua.yml @@ -0,0 +1,233 @@ +--- + +navigation: +- text: Встановлення + url: /ua/documentation/installation/ + submenu: + - text: Встановлення Ruby + url: /ua/documentation/installation/ + - text: Завантаження + url: /ua/downloads/ + - text: Релізи + url: /ua/downloads/releases/ + - text: Гілки + url: /ua/downloads/branches/ + - text: Дзеркала + url: /ua/downloads/mirrors/ + - text: Менеджери пакетів + submenu: + - text: rbenv + url: https://github.com/rbenv/rbenv + external: true + - text: RVM + url: https://rvm.io/ + external: true + - text: RubyInstaller for Windows + url: https://rubyinstaller.org/ + external: true + - text: Bundler + url: https://bundler.io/ + external: true +- text: Документація + url: /ua/documentation/ + submenu: + - text: Документація + url: /ua/documentation/ + - text: Що таке Ruby + url: /ua/about/ + - text: Ruby за двадцять хвилин + url: /ua/documentation/quickstart/ + - text: Ruby з інших мов + url: /ua/documentation/ruby-from-other-languages/ + submenu: + - text: Перехід на Ruby з C та C++ + url: /ua/documentation/ruby-from-other-languages/to-ruby-from-c-and-cpp/ + - text: Перехід на Ruby з Java + url: /ua/documentation/ruby-from-other-languages/to-ruby-from-java/ + - text: Перехід на Ruby з Perl + url: /ua/documentation/ruby-from-other-languages/to-ruby-from-perl/ + - text: Перехід на Ruby з PHP + url: /ua/documentation/ruby-from-other-languages/to-ruby-from-php/ + - text: Перехід на Ruby з Python + url: /ua/documentation/ruby-from-other-languages/to-ruby-from-python/ + - text: Поширені запитання + url: /ua/documentation/faq/ + - text: Почати та дослідити + submenu: + - text: TryRuby + url: https://try.ruby-lang.org/ + external: true + - text: Ruby Reference Manual + url: https://docs.ruby-lang.org/en/3.4/ + external: true + - text: The Ruby Bibliography + url: https://rubybib.org/ + external: true +- text: Бібліотеки + url: /ua/libraries/ + submenu: + - text: Бібліотеки + url: /ua/libraries/ + - text: RubyGems + submenu: + - text: RubyGems.org + url: https://rubygems.org/ + external: true + - text: The Ruby Toolbox + url: https://www.ruby-toolbox.com/ + external: true + - text: Популярні геми + submenu: + - text: Bundler + url: https://bundler.io/ + external: true + - text: Ruby on Rails + url: https://rubyonrails.org/ + external: true + - text: Rack + url: https://github.com/rack/rack + external: true + - text: Rake + url: https://github.com/ruby/rake + external: true + - text: RSpec + url: https://github.com/rspec/rspec + external: true +- text: Внесок у розвиток + url: /ua/community/ruby-core/ + submenu: + - text: Розробка ядра Ruby + url: /ua/community/ruby-core/ + - text: Посібник з репозиторію + url: /en/documentation/repository-guide/ + - text: Поштові розсилки + url: /ua/community/mailing-lists/ + - text: Правила поштових розсилок + url: /ua/community/mailing-lists/ruby-talk-guidelines/ + - text: Посібник з написання патчів + url: /ua/community/ruby-core/writing-patches/ + - text: Інше + submenu: + - text: ruby/ruby + url: https://github.com/ruby/ruby + external: true + - text: Wiki + url: https://github.com/ruby/ruby/wiki + external: true + - text: Система відстеження проблем Ruby + url: https://bugs.ruby-lang.org/ + external: true +- text: Спільнота + url: /ua/community/ + submenu: + - text: Спільнота + url: /ua/community/ + - text: Групи користувачів + url: /ua/community/user-groups/ + - text: Блоги та розсилки + url: /ua/community/weblogs/ + - text: Подкасти + url: /ua/community/podcasts/ + - text: Кодекс поведінки + url: /ua/conduct/ + - text: Події та конференції + submenu: + - text: RubyKaigi + url: https://rubykaigi.org/2025/ + external: true + - text: Ruby Events + url: https://www.rubyevents.org/ + external: true + - text: Організації + submenu: + - text: Асоціація Ruby + url: https://www.ruby.or.jp/en/ + external: true +- text: Новини + url: /ua/news/ + submenu: + - text: Новини + url: /ua/news/ + - text: Безпека + url: /ua/security/ + +syndicate: + text: Підписатися + recent_news: + text: Останні новини (RSS) + url: /ua/feeds/news.rss + +languages_heading: 'Цей сайт іншими мовами:' + +toc: + heading: Зміст + +credits: + Цей вебсайт + з гордістю підтримується членами спільноти Ruby. + +month_names: +- Січень +- Лютий +- Березень +- Квітень +- Травень +- Червень +- Липень +- Серпень +- Вересень +- Жовтень +- Листопад +- Грудень + +posted_by: Опублікував AUTHOR %d-%m-%Y +translated_by: 'Переклав: Andrii Furmanets' + +feed: + title: Новини Ruby + description: Останні новини з ruby-lang.org. + lang_code: uk-UA + +news: + other_news: Інші новини + more_news: Більше новин... + continue: Читати далі... + back_to_year: Назад до архівів %Y року + recent_news: Останні новини + yearly_archive_title: Архіви %Y року + monthly_archive_title: Архіви %B %Y + yearly_archives: Архіви за роками + monthly_archives: Архіви за місяцями + yearly_archive_link: Архіви %Y + monthly_archive_link: "%B %Y" + select_year: "--- Виберіть рік ---" + +footer: + links: + github: + text: ruby/ruby + url: https://github.com/ruby/ruby + slack: + text: ruby-jp.slack.com + url: https://ruby-jp.github.io/ + mailing_list: + text: Поштові розсилки + url: /ua/community/mailing-lists/ + security: + text: Безпека + url: /ua/security/ + about_website: + text: Про цей сайт + url: /ua/about/website/ + logo_page: + text: Про логотип + url: /ua/about/logo/ + news_rss: + text: RSS новин + url: /ua/feeds/news.rss + privacy: + text: Політика конфіденційності + url: /ua/privacy/ + ruby_license: + text: Ліцензія Ruby + url: /ua/about/license.txt diff --git a/_plugins/translation_status.rb b/_plugins/translation_status.rb index 0084ccbf36..43a456ce01 100644 --- a/_plugins/translation_status.rb +++ b/_plugins/translation_status.rb @@ -8,7 +8,7 @@ module Jekyll # Outputs HTML. module TranslationStatus - LANGS = %w[en bg de es fr id it ja ko pl pt ru tr vi zh_cn zh_tw].freeze + LANGS = %w[en bg de es fr id it ja ko pl pt ru tr ua vi zh_cn zh_tw].freeze START_DATE = "2013-04-01" OK_CHAR = "✓" diff --git a/index.html b/index.html index 011cf701cf..e87661aee8 100644 --- a/index.html +++ b/index.html @@ -13,6 +13,8 @@ "pt": "pt", "ru": "ru", "tr": "tr", + "uk": "ua", + "ua": "ua", "zh-CN": "zh_cn", "zh-TW": "zh_tw" }; diff --git a/ua/404.md b/ua/404.md new file mode 100644 index 0000000000..4fbd9c246e --- /dev/null +++ b/ua/404.md @@ -0,0 +1,10 @@ +--- +layout: page +title: "404: Сторінку не знайдено" +lang: ua +permalink: /ua/404.html +--- + +Запитувана сторінка не існує. + +Спробуйте почати з [головної сторінки](/). diff --git a/ua/about/index.md b/ua/about/index.md new file mode 100644 index 0000000000..96afe9120f --- /dev/null +++ b/ua/about/index.md @@ -0,0 +1,236 @@ +--- +layout: page +title: "Про Ruby" +lang: ua +--- + +Цікавитеся, чому Ruby такий популярний? Його прихильники називають його красивою, +витонченою мовою. І водночас кажуть, що він зручний і практичний. Як це можливо? +{: .summary} + +### Ідеали творця Ruby + +Ruby — мова тонкого балансу. Її творець, [Yukihiro “Matz” +Matsumoto][matz], поєднав елементи своїх улюблених мов (Perl, Smalltalk, +Eiffel, Ada та Lisp), щоб створити нову мову, яка врівноважує функціональне +програмування з імперативним. + +Він часто казав, що «намагається зробити Ruby природною, а не простою» +мовою, що відображає життя. + +Продовжуючи цю думку, він додає: + +> Ruby виглядає просто, але всередині дуже складний, як і наше людське тіло[1](#fn1). + +### Про зростання Ruby + +Від моменту публічного релізу в 1995 році Ruby приваблює відданих +розробників у всьому світі. У 2006 році Ruby став масово визнаним: +у великих містах сформувалися активні групи користувачів, а конференції, +присвячені Ruby, були заповнені до межі. + +Ruby-Talk — основна [поштова розсилка](/ua/community/mailing-lists/) для +обговорення Ruby — у 2006 році сягала в середньому 200 повідомлень на день. +У наступні роки цей показник зменшився, оскільки спільнота зростала, а +обговорення переходили з одного центрального списку до багатьох менших. + +Ruby входить до топ-10 більшості індексів, що вимірюють зростання та +популярність мов програмування у світі (наприклад, [індексу TIOBE][tiobe]). +Значна частина зростання пов’язана з популярністю програмного забезпечення, +написаного на Ruby, зокрема вебфреймворку [Ruby on Rails][ror]. + +Ruby також [повністю вільний](/ua/about/license.txt). Він не лише безкоштовний, +а й вільний для використання, копіювання, модифікації та поширення. + +### Бачити все як об’єкти + +Спочатку Matz шукав ідеальний синтаксис в інших мовах. Згадуючи цей пошук, +він сказав: «Я хотів скриптову мову, яка була б потужнішою за Perl і +більш об’єктно-орієнтованою за Python[2](#fn2)». + +У Ruby все є об’єктом. Кожному шматку інформації та коду можна надати +власні властивості й дії. В об’єктно-орієнтованому програмуванні +властивості називають *instance variables*, а дії — *methods*. +Чистий об’єктно-орієнтований підхід Ruby зазвичай демонструють простим +прикладом, де до числа застосовується дія. + +{% highlight ruby %} +5.times { print "We *love* Ruby -- it's outrageous!" } +{% endhighlight %} + +У багатьох мовах числа та інші примітивні типи не є об’єктами. Ruby, +під впливом Smalltalk, надає методи та змінні екземпляра всім типам. +Це спрощує використання Ruby, адже правила для об’єктів однаково +застосовуються до всього Ruby. + +### Гнучкість Ruby + +Ruby вважають гнучкою мовою, оскільки він дозволяє користувачам вільно +змінювати його частини. Важливі частини Ruby можна видаляти або перевизначати +за потреби. Можна також додавати нові. Ruby намагається не обмежувати +розробника. + +Наприклад, додавання виконується оператором плюс (`+`). Але якщо ви хочете +використовувати читабельне слово `plus`, ви можете додати такий метод до +вбудованого класу `Numeric`. + +{% highlight ruby %} +class Numeric + def plus(x) + self.+(x) + end +end + +y = 5.plus 6 +# y тепер дорівнює 11 +{% endhighlight %} + +Оператори Ruby — це синтаксичний цукор для методів. Їх також можна +перевизначати. + +### Блоки: справді виразна можливість + +Блоки Ruby також вважають джерелом великої гнучкості. Розробник може +долучити замикання до будь-якого методу, описавши, як цей метод має +працювати. Таке замикання називається *block* і стало однією з +найпопулярніших можливостей для новачків у Ruby, які переходять з інших +імперативних мов, як-от PHP або Visual Basic. + +Блоки натхненні функціональними мовами. Matz казав: «У замиканнях Ruby +я хотів зберегти культуру Lisp[3](#fn3)». + +{% highlight ruby %} +search_engines = + %w[Google Yahoo MSN].map do |engine| + "http://www." + engine.downcase + ".com" + end +{% endhighlight %} + +У наведеному прикладі блок описано всередині конструкції `do ... end`. +Метод `map` застосовує блок до переданого списку слів. Багато інших методів +Ruby залишають «вікно» для розробника, щоб він міг написати власний блок і +заповнити деталі того, що має робити метод. + +### Ruby і міксини + +На відміну від багатьох об’єктно-орієнтованих мов, Ruby має лише одиничне +наслідування — **свідомо**. Проте Ruby знає концепцію модулів +(у Objective-C вони називаються Categories). Модулі — це колекції методів. + +Класи можуть «підмішувати» модуль і безкоштовно отримувати всі його методи. +Наприклад, будь-який клас, який реалізує метод `each`, може підмішати модуль +`Enumerable`, що додає цілу низку методів, які використовують `each` для +перебору. + +{% highlight ruby %} +class MyArray + include Enumerable +end +{% endhighlight %} + +Загалом Rubyists вважають цей підхід набагато зрозумілішим за множинне +наслідування, яке є складним і може бути надто обмежувальним. + +### Візуальний вигляд Ruby + +Хоча Ruby часто використовує мінімум пунктуації та зазвичай віддає +перевагу англомовним ключовим словам, певна пунктуація застосовується +для оформлення Ruby. Ruby не потребує оголошень змінних. Він має прості +правила іменування для позначення області видимості змінних. + +* `var` може бути локальною змінною. +* `@var` — змінна екземпляра. +* `$var` — глобальна змінна. + +Ці сигіли покращують читабельність, дозволяючи розробнику швидко визначати +роль кожної змінної. Також зникає потреба втомливо додавати `self.` перед +кожним членом екземпляра. + +### Поза основами + +Ruby має багато інших можливостей, серед яких: + +* Ruby має механізми обробки винятків, як у Java чи Python, що спрощують + обробку помилок. + +* Ruby має справжній збирач сміття mark-and-sweep для всіх об’єктів Ruby. + Немає потреби підтримувати лічильники посилань у бібліотеках розширень. + Як каже Matz, «це краще для здоров’я». + +* Писати C-розширення для Ruby простіше, ніж для Perl чи Python, завдяки + елегантному API для викликів Ruby з C. Це також включає можливість + вбудовувати Ruby в програмне забезпечення як скриптову мову. Доступний + також інтерфейс SWIG. + +* Ruby може динамічно завантажувати бібліотеки розширень, якщо ОС це + дозволяє. + +* Ruby має незалежну від ОС багатопотоковість. Отже, на всіх платформах, + де працює Ruby, доступні потоки — незалежно від того, чи підтримує + їх сама ОС, навіть на MS-DOS! + +* Ruby дуже портативний: його переважно розробляють на GNU/Linux, але + він працює на багатьох різновидах UNIX, macOS, Windows, DOS, BeOS, + OS/2 тощо. + +### Інші реалізації Ruby + +Ruby як мова має кілька різних реалізацій. На цій сторінці йдеться про +референсну реалізацію, яку в спільноті часто називають **MRI** +(«Matz’s Ruby Interpreter») або **CRuby** (оскільки написана на C), +але існують і інші. Вони часто корисні в певних ситуаціях, дають +додаткову інтеграцію з іншими мовами чи середовищами, або мають +спеціальні можливості, яких немає в MRI. + +Ось перелік: + +* [JRuby][jruby] — Ruby поверх JVM (Java Virtual Machine), який + використовує оптимізувальні JIT-компілятори JVM, збирачі сміття, + конкурентні потоки, екосистему інструментів і величезну колекцію + бібліотек. +* [Rubinius][rubinius] — «Ruby, написаний на Ruby». Побудований на LLVM, + Rubinius має віртуальну машину, на основі якої також будуються інші мови. +* [TruffleRuby][truffleruby] — високопродуктивна реалізація Ruby поверх + GraalVM. +* [mruby][mruby] — легка реалізація мови Ruby, яку можна зв’язувати та + вбудовувати в застосунки. Її розвиток очолює творець Ruby Yukihiro + “Matz” Matsumoto. +* [IronRuby][ironruby] — реалізація, «тісно інтегрована з .NET Framework». +* [MagLev][maglev] — «швидка, стабільна реалізація Ruby з інтегрованою + персистентністю об’єктів і розподіленим спільним кешем». +* [Cardinal][cardinal] — «компілятор Ruby для віртуальної машини + [Parrot][parrot]» (Perl 6). + +Для повнішого списку див. [Awesome Rubies][awesome-rubies]. + +### Посилання + +1 Matz, виступ на поштовій розсилці Ruby-Talk, [12 травня +2000][blade]. +{: #fn1} + +2 Matz, у [інтерв’ю з творцем Ruby][linuxdevcenter], 29 листопада +2001. +{: #fn2} + +3 Matz, у [Blocks and Closures in Ruby][artima], 22 грудня +2003. +{: #fn3} + + + +[matz]: http://www.rubyist.net/~matz/ +[blade]: https://blade.ruby-lang.org/ruby-talk/2773 +[ror]: http://rubyonrails.org/ +[linuxdevcenter]: http://www.linuxdevcenter.com/pub/a/linux/2001/11/29/ruby.html +[artima]: http://www.artima.com/intv/closures2.html +[tiobe]: http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html +[jruby]: http://jruby.org +[rubinius]: https://rubinius.com +[truffleruby]: https://github.com/oracle/truffleruby +[mruby]: http://www.mruby.org/ +[ironruby]: http://www.ironruby.net +[maglev]: http://maglev.github.io +[cardinal]: https://github.com/parrot/cardinal +[parrot]: http://parrot.org +[awesome-rubies]: https://github.com/planetruby/awesome-rubies diff --git a/ua/about/license.txt b/ua/about/license.txt new file mode 100644 index 0000000000..7f5283ff98 --- /dev/null +++ b/ua/about/license.txt @@ -0,0 +1,52 @@ +Ruby — вільне програмне забезпечення, авторське право належить Yukihiro Matsumoto . +Ви можете поширювати його та/або змінювати згідно з умовами 2‑пунктової ліцензії BSDL +(див. файл BSDL) або на умовах нижче: + + 1. Ви можете робити та без обмежень передавати дослівні копії вихідної форми + програмного забезпечення за умови, що відтворюєте всі оригінальні повідомлення + про авторські права та пов’язані відмови від відповідальності. + + 2. Ви можете змінювати свою копію програмного забезпечення будь-яким способом, + за умови, що виконаєте принаймні ОДНУ з наведених дій: + + a) передасте свої зміни у Public Domain або іншим чином зробите їх вільно + доступними, наприклад, опублікувавши ці зміни в Usenet або еквівалентному + середовищі, або дозволивши автору включити ваші зміни в програмне забезпечення. + + b) використовуватимете змінене програмне забезпечення лише всередині вашої + корпорації чи організації. + + c) надасте нестандартним бінарним файлам нестандартні назви, із зазначенням, + де отримати оригінальний дистрибутив програмного забезпечення. + + d) укладете інші умови поширення з автором. + + 3. Ви можете поширювати програмне забезпечення в об’єктному коді або бінарній формі + за умови, що виконаєте принаймні ОДНУ з наведених дій: + + a) поширюватимете бінарні файли та бібліотеки програмного забезпечення + разом з інструкціями (в довіднику або еквіваленті) про те, де отримати + оригінальний дистрибутив. + + b) супроводите дистрибутив машинозчитуваним вихідним кодом + програмного забезпечення. + + c) надасте нестандартним бінарним файлам нестандартні назви, із зазначенням, + де отримати оригінальний дистрибутив програмного забезпечення. + + d) укладете інші умови поширення з автором. + + 4. Ви можете змінювати та включати частини програмного забезпечення до будь-якого + іншого програмного забезпечення (можливо, комерційного). Але деякі файли в + дистрибутиві написані не автором, тому вони не підпадають під ці умови. + + Перелік таких файлів та умови їх копіювання див. у файлі LEGAL. + + 5. Скрипти та бібліотеки, що постачаються як вхідні дані для програмного забезпечення + або створюються як його вихідні дані, не підпадають автоматично під авторське право + цього програмного забезпечення, а належать тому, хто їх створив; їх можна продавати + на комерційній основі та об’єднувати з цим програмним забезпеченням. + + 6. ЦЕ ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ НАДАЄТЬСЯ «AS IS» БЕЗ БУДЬ-ЯКИХ ЯВНИХ АБО + НЕЯВНИХ ГАРАНТІЙ, У ТОМУ ЧИСЛІ, БЕЗ ОБМЕЖЕНЬ, НЕЯВНИХ ГАРАНТІЙ + ТОВАРНОЇ ПРИДАТНОСТІ ТА ПРИДАТНОСТІ ДЛЯ ПЕВНОЇ МЕТИ. diff --git a/ua/about/logo/index.md b/ua/about/logo/index.md new file mode 100644 index 0000000000..4dc8bbbfbb --- /dev/null +++ b/ua/about/logo/index.md @@ -0,0 +1,23 @@ +--- +layout: page +title: "Логотип Ruby" +lang: ua +--- + +![Логотип Ruby][logo] + +Логотип Ruby захищений авторським правом © 2006, Yukihiro Matsumoto. + +Він ліцензований на умовах ліцензійної угоди +[Creative Commons Attribution-ShareAlike 2.5][cc-by-sa]. + + +## Завантаження + +[Набір логотипу Ruby][logo-kit] містить логотип Ruby у кількох форматах +(PNG, JPG, PDF, AI, SWF, XAR). + + +[logo]: /images/header-ruby-logo.png +[logo-kit]: https://cache.ruby-lang.org/pub/misc/logo/ruby-logo-kit.zip +[cc-by-sa]: http://creativecommons.org/licenses/by-sa/2.5/ diff --git a/ua/about/website/index.md b/ua/about/website/index.md new file mode 100644 index 0000000000..5816652c04 --- /dev/null +++ b/ua/about/website/index.md @@ -0,0 +1,93 @@ +--- +layout: page +title: "Про вебсайт Ruby" +lang: ua +--- + +Цей вебсайт згенеровано на Ruby за допомогою [Jekyll][jekyll],
+його вихідний код розміщено на [GitHub][github-repo]. + +## Дизайн + +Поточний візуальний дизайн створила [Taeko Akatsuka][akatsuka]. +Сайт було оновлено в грудні 2025 року. + +Візуальний дизайн до грудня 2025 року — [Jason Zimdars][jzimdars].
+На основі попереднього дизайну команди Ruby Visual Identity Team. + +Попередній дизайн ruby-lang.org + +## Логотип + +[Логотип Ruby][logo] захищений авторським правом © 2006, Yukihiro Matsumoto. + + +## Повідомлення про проблеми ## + +Щоб повідомити про проблему, використовуйте [issue tracker][github-issues] +або зверніться до нашого [вебмайстра][webmaster] (англійською). + + +## Як долучитися ## + +Цей вебсайт з гордістю підтримується членами спільноти Ruby. + +Якщо ви хочете зробити внесок, ознайомтеся з +[інструкціями для учасників][github-wiki] +і просто відкривайте issues або pull requests! + + +## Подяки ## + +Дякуємо всім комітерам, авторам, перекладачам та іншим учасникам цього +вебсайту. + +Також велика подяка організаціям, які нас підтримують: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[logo]: /ua/about/logo/ +[webmaster]: mailto:webmaster@ruby-lang.org +[jekyll]: http://www.jekyllrb.com/ +[akatsuka]: https://x.com/ken_c_lo +[jzimdars]: https://twitter.com/jasonzimdars +[github-repo]: https://github.com/ruby/www.ruby-lang.org/ +[github-issues]: https://github.com/ruby/www.ruby-lang.org/issues +[github-wiki]: https://github.com/ruby/www.ruby-lang.org/wiki diff --git a/ua/community/conferences/index.md b/ua/community/conferences/index.md new file mode 100644 index 0000000000..57f8ed6b20 --- /dev/null +++ b/ua/community/conferences/index.md @@ -0,0 +1,45 @@ +--- +layout: page +title: "Конференції Ruby" +lang: ua +--- + +Ruby-програмісти по всьому світу долучаються до все більшої кількості +конференцій, де вони збираються, щоб ділитися результатами роботи, +обговорювати майбутнє Ruby та вітати новачків у спільноті Ruby. + +[RubyEvents.org][rc] — це простий список конференцій, присвячених Ruby, +який публікується спільно зі спільнотою Ruby. Там ви знайдете дати подій, +локації, CFP (Call For Proposals) і інформацію про реєстрацію. + + +### Основні конференції Ruby + +[RubyConf][1] +: Щороку з 2001 року [Ruby Central, Inc.][2] проводить RubyConf — + міжнародну конференцію Ruby. RubyConf надає майданчик для доповідей + про Ruby-технології від їхніх творців. + +[RubyKaigi][3] +: Перша японська конференція Ruby, RubyKaigi 2006, відбулася в Одабі. + RubyKaigi щороку пропонує багато нових і захопливих доповідей від Matz + та інших Rubyists. + +[EuRuKo (European Ruby Conference)][4] +: Перша щорічна європейська конференція Ruby (EuRuKo) відбулася у + Карлсруе, Німеччина, у 2003 році. Організована командою німецьких + Rubyists, серед яких Armin Roehrl та Michael Neumann, EuRuKo стала + другою щорічною подією Ruby, стартувавши через два роки після RubyConf. + +### Регіональні конференції Ruby + +Оновлений список регіональних конференцій Ruby доступний на [RubyEvents.org][rc]. + +Там же можна знайти посилання на GitHub-репозиторій, щоб самостійно +додати або оновити інформацію. + +[rc]: https://www.rubyevents.org/ +[1]: http://rubyconf.org/ +[2]: http://rubycentral.org/ +[3]: http://rubykaigi.org/ +[4]: http://euruko.org diff --git a/ua/community/index.md b/ua/community/index.md new file mode 100644 index 0000000000..948c779d22 --- /dev/null +++ b/ua/community/index.md @@ -0,0 +1,60 @@ +--- +layout: page +title: "Спільнота" +lang: ua +--- + +Спільнота, що формується навколо мови програмування, є однією з +найважливіших її переваг. Ruby має активну й зростаючу спільноту, +дружню до людей з будь-яким рівнем підготовки. +{: .summary} + +Якщо ви хочете долучитися, ось кілька місць для початку: + +[Групи користувачів Ruby](user-groups/) +: Місцева група користувачів Ruby — чудовий спосіб познайомитися з іншими + програмістами Ruby. Такі групи організовуються самостійно та зазвичай + проводять щомісячні зустрічі, мають поштову розсилку, вебсайт і, + якщо пощастить, часті codefest-події. + +[Поштові розсилки та новинні групи Ruby](mailing-lists/) +: Ruby має багато списків на різні теми та різними мовами. Якщо у вас + є питання щодо Ruby, звернення до поштової розсилки — чудовий спосіб + отримати відповіді. + +[Сервер Ruby у Discord (посилання-запрошення)][ruby-discord] +: Discord-сервер Ruby — це місце, де ви можете спілкуватися з іншими + Rubyists, отримувати допомогу з питаннями Ruby або допомагати іншим. + Discord — хороший старт для нових розробників і до нього легко приєднатися. + +[Ruby на IRC (#ruby)](https://web.libera.chat/#ruby) +: IRC-канал Ruby — чудовий спосіб поспілкуватися з іншими Rubyists. + +[Ruby Core](ruby-core/) +: Зараз чудовий час стежити за розвитком Ruby. + Якщо ви хочете допомагати Ruby, починайте тут. + +[Блоги та розсилки Ruby](weblogs/) +: Більшість активностей і новин у спільноті Ruby обговорюються через блоги + та розсилки. Ось добірка, яка допоможе залишатися на зв’язку та в курсі. + +[Конференції Ruby](conferences/) +: Ruby-програмісти по всьому світу беруть участь у все більшій кількості + конференцій, де вони діляться результатами роботи, обговорюють майбутнє + Ruby та вітають новачків у спільноті Ruby. + + Додатково ви можете відвідати [RubyEvents.org](https://www.rubyevents.org/), + щоб знайти відео з Ruby-конференцій і доповідей. + +[Подкасти](podcasts/) +: Якщо ви віддаєте перевагу слухати дискусії про Ruby замість читання, + зверніть увагу на ці чудові Ruby-подкасти. Rubyists використовують + подкасти, щоб висвітлювати нові релізи, новини спільноти та брати + інтерв’ю в інших Ruby-розробників. + +[Ruby Central][ruby-central] +: Ruby Central — неприбуткова організація, присвячена підтримці + світової спільноти Ruby. + +[ruby-central]: http://rubycentral.org/ +[ruby-discord]: https://discord.gg/ad2acQFtkh diff --git a/ua/community/mailing-lists/index.md b/ua/community/mailing-lists/index.md new file mode 100644 index 0000000000..e75b8ddf0e --- /dev/null +++ b/ua/community/mailing-lists/index.md @@ -0,0 +1,44 @@ +--- +layout: page +title: "Поштові розсилки" +lang: ua +--- + +Поштові розсилки — чудовий спосіб тримати руку на пульсі спільноти Ruby. +{: .summary} + +Ruby має чотири основні англомовні поштові розсилки: + +Ruby-Talk +: Це найпопулярніша поштовa розсилка для загальних тем про Ruby. + ([Архіви][3], [Правила публікацій][guidelines], [Архів спільноти][rubytalk]) + +Ruby-Core +: Ця розсилка стосується ядра та реалізації Ruby, часто використовується + для розгляду патчів. ([Архіви][4]) + +Ruby-Doc +: Ця розсилка призначена для обговорення стандартів і інструментів + документації Ruby. ([Архіви][5]) + +Ruby-CVS +: Ця розсилка повідомляє про всі коміти до репозиторію Ruby у Subversion. + +Група новин comp.lang.ruby +: Ті, хто віддає перевагу Usenet замість поштових розсилок, можуть + звернутися до групи [comp.lang.ruby](news:comp.lang.ruby). ([FAQ][clrFAQ]) + +## Підписка або відписка + +Дивіться [https://ml.ruby-lang.org/mailman3/lists/](https://ml.ruby-lang.org/mailman3/lists/) +для додаткової інформації про всі поштові розсилки на ruby-lang.org, +включно зі списками японською мовою. + + + +[guidelines]: ruby-talk-guidelines/ +[clrFAQ]: http://rubyhacker.com/clrFAQ.html +[3]: https://ml.ruby-lang.org/archives/list/ruby-talk@ml.ruby-lang.org/ +[4]: https://ml.ruby-lang.org/archives/list/ruby-core@ml.ruby-lang.org +[5]: https://ml.ruby-lang.org/archives/list/ruby-doc@ml.ruby-lang.org/ +[rubytalk]: https://rubytalk.org/ diff --git a/ua/community/mailing-lists/ruby-talk-guidelines/index.md b/ua/community/mailing-lists/ruby-talk-guidelines/index.md new file mode 100644 index 0000000000..5059d1292a --- /dev/null +++ b/ua/community/mailing-lists/ruby-talk-guidelines/index.md @@ -0,0 +1,79 @@ +--- +layout: page +title: "Правила публікацій для розсилки Ruby-Talk" +lang: ua +--- + +Дотримуйтеся цих правил під час публікацій у розсилці ruby-talk. +{: .summary} + + +1. **Завжди** будьте дружніми, уважними, тактовними й коректними. Ми хочемо + зберегти цю розсилку гостинною для зростаючої кількості новачків, дуже + молодих людей і їхніх учителів, а також не обмежувати «вогнедишних + чарівників». :-) + +2. Тримайте зміст релевантним і зрозумілим. Намагайтеся писати коротко й + по суті, але водночас включайте всю важливу інформацію. + + 1. Загальні правила оформлення (нетикет) — це питання здорового глузду + і звичайної ввічливості, які полегшують іншим людям читання (у режимі + реального часу або під час перегляду архівів): + + * **Зверніть увагу:** + Вставляйте цитований текст з попередніх повідомлень **перед** вашими + відповідями і **вибірково** цитуйте лише релевантне. + * Використовуйте **звичайний текст**; не використовуйте HTML, RTF або Word. + Більшість поштових програм має таку опцію; якщо ваша не має — + встановіть (безкоштовну) програму або скористайтеся вебсервісом. + * Додавайте приклади з файлів як **вбудований** текст; не використовуйте + вкладення. + + 2. Якщо повідомляєте про проблему, надайте **усю** релевантну інформацію + одразу; це не група для екстрасенсів. :-) + + За можливості додайте: + + * приклад (бажано простий), який відтворює проблему + * фактичні повідомлення про помилки + * версію Ruby (`ruby -v`) + * тип і версію ОС (`uname -a`) + * назву та версію компілятора, яким було зібрано Ruby + +3. Зробіть тему повідомлення максимально інформативною, щоб ті, кому це + цікаво, прочитали ваш допис, а ті, кому ні — могли легко його оминути. + + **Змістовно** описуйте, про що ваш допис. + + Це нормально: + + * "How can I do x with y on z?" + * "Problem: did x, expected y, got z." + * "BUG: doing x with module y crashed z." + + Це **не** нормально: + + * "Please help!!!" + * "Newbie question" + * "Need Ruby guru to tell me what's wrong" + + Такі префікси стали поширеними для тем: + + * `[ANN]` (для оголошень) + * `[BUG]` (для звітів про помилки) + * `[OT]` (для off-topic, якщо вже дуже треба) + +4. І наостанок, будьте уважними: не лінуйтеся. Якщо шукаєте інформацію, + спочатку докладіть розумних зусиль, щоб знайти її самостійно. За потреби + перегляньте [домашню сторінку Ruby][ruby-lang], + [FAQ Ruby][faq] та іншу документацію, + скористайтеся пошуковиком для пошуку в архівах, тощо. + + +_Ці правила запозичено з [FAQ comp.lang.ruby][clrFAQ]._ + + + +[ruby-lang]: /ua/ +[faq]: /ua/documentation/faq/ +[clrFAQ]: http://rubyhacker.com/clrFAQ.html diff --git a/ua/community/podcasts/index.md b/ua/community/podcasts/index.md new file mode 100644 index 0000000000..4b879c9c89 --- /dev/null +++ b/ua/community/podcasts/index.md @@ -0,0 +1,42 @@ +--- +layout: page +title: "Подкасти" +lang: ua +--- + +Слухайте новини, інтерв’ю та обговорення про Ruby і його спільноту. + +[On Rails][onrails] +: Розробники Ruby on Rails діляться реальними технічними викликами, + архітектурними рішеннями та стратегіями масштабування. Долучайтеся до + досвідчених інженерів для технічних занурень і ретроспектив побудови + production-застосунків на Rails. + +[Ruby Rogues][rogues] +: Подкаст Ruby Rogues — це панельні обговорення тем, пов’язаних із + програмуванням, кар’єрою, спільнотою та Ruby. + +[Ruby on Rails Podcast][rorpodcast] +: Ruby on Rails Podcast — щотижнева розмова про Ruby on Rails, + open source та професію програміста. + +[Remote Ruby][remote_ruby] +: Віртуальний meetup, що став подкастом. Remote Ruby відзначає та + підсвічує спільноту Ruby в неформальному форматі. + +[Rooftop Ruby][rooftop_ruby] +: Collin і Joel обговорюють Ruby, розробку ПЗ, open source, кар’єру + та багато іншого разом із гостями. + +### Як долучитися + +Ведучі подкастів завжди шукають гостей. Якщо у вас є Ruby-досвід, яким +ви хочете поділитися, зв’яжіться з авторами цих шоу. + +Ви також можете створити власний Ruby-подкаст і додати його до цього списку! + +[onrails]: https://onrails.buzzsprout.com/ +[rooftop_ruby]: https://www.rooftopruby.com +[remote_ruby]: https://www.remoteruby.com +[rorpodcast]: https://www.therubyonrailspodcast.com +[rogues]: https://rubyrogues.com diff --git a/ua/community/ruby-core/index.md b/ua/community/ruby-core/index.md new file mode 100644 index 0000000000..180f1b7660 --- /dev/null +++ b/ua/community/ruby-core/index.md @@ -0,0 +1,135 @@ +--- +layout: page +title: "Ruby Core" +lang: ua +--- + +Зараз чудовий час, щоб стежити за розвитком Ruby. З огляду на підвищену +увагу до Ruby в останні роки, зростає потреба в талановитих людях, які +допоможуть покращувати Ruby та документувати його частини. +Тож з чого почати? +{: .summary} + +Тут розглядаються такі теми розвитку Ruby: + +* [Використання Git для відстеження розвитку Ruby](#following-ruby) +* [Покращення Ruby, патч за патчем](#patching-ruby) +* [Примітка про гілки](#branches-ruby) + +### Використання Git для відстеження розвитку Ruby +{: #following-ruby} + +Поточний основний репозиторій найсвіжішого вихідного коду Ruby — +[git.ruby-lang.org/ruby.git][gitrlo]. +Також є [дзеркало на GitHub][7]. Зазвичай, будь ласка, використовуйте саме це дзеркало. + +Отримати найновіший вихідний код Ruby можна за допомогою Git. +У командному рядку: + +{% highlight sh %} +$ git clone https://github.com/ruby/ruby.git +{% endhighlight %} + +Каталог `ruby` тепер міститиме найновіший вихідний код +для девелоперської версії Ruby (ruby-trunk). + +Див. також [Non-committer’s HOWTO to join our development][noncommitterhowto]. + +Якщо у вас є доступ для комітів і ви хочете щось запушити, +використовуйте основний репозиторій. + +{% highlight sh %} +$ git clone git@git.ruby-lang.org:ruby.git +{% endhighlight %} + +### Покращення Ruby, патч за патчем +{: #patching-ruby} + +Команда core підтримує [issue tracker][10] для подання патчів і звітів +про помилки для Matz і команди. Ці повідомлення також надходять до +[поштової розсилки Ruby-Core][mailing-lists] для обговорення, тож ви можете +бути впевнені, що ваш запит не залишиться непоміченим. Ви також можете +надсилати патчі безпосередньо до розсилки. У будь-якому разі вас +заохочують долучатися до обговорення. + +Будь ласка, перегляньте [Посібник з написання патчів][writing-patches] +для порад від Matz про те, як зробити так, щоб ваші патчі розглядалися. + +Коротко, кроки створення патча: + +1. Клонувати вихідний код Ruby з GitHub. + Зазвичай патчі для виправлення помилок або нових можливостей слід + подавати для trunk гілки Ruby. + + $ git clone https://github.com/ruby/ruby.git + + Якщо ви виправляєте помилку, специфічну для однієї гілки підтримки, + переключіться на відповідну гілку. + + $ git checkout ruby_X_X + + X_X слід замінити на версію, яку ви хочете отримати. + +2. Додайте свої покращення в код. + +3. Створіть патч. + + $ git diff > ruby-changes.patch + +4. Створіть тікет в [issue tracker][10] або надішліть патч до + [поштової розсилки Ruby-Core][mailing-lists] із записом ChangeLog, + що описує патч. + +5. Якщо щодо патча не виникло проблем, комітерам буде надано + дозвіл на його застосування. + +**Зверніть увагу:** патчі слід подавати як [unified diff][12]. +Більше про те, як патчі об’єднуються, дивіться у +[довідці diffutils][13]. + +Обговорення розвитку Ruby зосереджується в +[поштовій розсилці Ruby-Core][mailing-lists]. Тож якщо вам цікаво, +чи вартий ваш патч уваги, або якщо ви хочете започаткувати обговорення +про майбутнє Ruby — сміливо долучайтеся. Зауважте, що офтоп-обговорення +в цій розсилці не допускаються: рівень шуму має бути дуже низьким, +теми — точними, добре продуманими та добре сформульованими. Ми звертаємося +до творця Ruby, тож тримаймо відповідний рівень поваги. + +Пам’ятайте, що багато core-розробників Ruby живуть у Японії, і хоча +багато хто добре володіє англійською, існує значна різниця в часових +поясах. Також існує цілий набір японськомовних розсилок розробки, що +функціонують паралельно з англомовними. Будьте терплячими: якщо ваше +питання не вирішено, наполягайте — спробуйте ще раз через кілька днів. + + +### Примітка про гілки +{: #branches-ruby} + +Вихідний код Ruby керувався репозиторієм Subversion до 22 квітня 2019 року. +Тож деякі гілки й досі можуть підтримуватися у Subversion. +Ви можете переглянути SVN-репозиторій. + +* [<URL:https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?root=ruby>][svn-viewvc] + +Проте вам не потрібно про це турбуватися (якщо тільки ви не супроводжуєте гілку). +Ви можете переключатися на гілки у своїй робочій копії Git. +Наприклад, виконайте таку команду: + +{% highlight sh %} +$ git checkout ruby_X_X +{% endhighlight %} + +X_X слід замінити на версію, яку ви хочете отримати. + +Якщо ви хочете змінювати гілки, відкрийте issue у нашому [issue tracker][10]. +Дивіться також наступний розділ. + +[gitrlo]: https://git.ruby-lang.org/ruby.git +[mailing-lists]: /ua/community/mailing-lists/ +[writing-patches]: /ua/community/ruby-core/writing-patches/ +[noncommitterhowto]: https://github.com/shyouhei/ruby/wiki/noncommitterhowto +[svn-viewvc]: https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?root=ruby +[7]: https://github.com/ruby/ruby +[10]: https://bugs.ruby-lang.org/ +[12]: http://www.gnu.org/software/diffutils/manual/html_node/Unified-Format.html +[13]: http://www.gnu.org/software/diffutils/manual/html_node/Merging-with-patch.html#Merging%20with%20patch diff --git a/ua/community/ruby-core/writing-patches/index.md b/ua/community/ruby-core/writing-patches/index.md new file mode 100644 index 0000000000..fbc9d8e5a3 --- /dev/null +++ b/ua/community/ruby-core/writing-patches/index.md @@ -0,0 +1,52 @@ +--- +layout: page +title: "Посібник з написання патчів" +lang: ua +--- + +Нижче наведено поради від Matz щодо того, як зробити так, щоб ваші +патчі розглядалися. +{: .summary} + +Ці настанови взято з [допису Matz][ruby-core-post] +у поштовій розсилці Ruby-Core: + +* Одна зміна — один патч + + Це найбільша проблема для більшості відкладених патчів. Коли ви + надсилаєте патч, який одночасно виправляє кілька помилок (і додає + нові можливості), нам доводиться розділяти їх перед застосуванням. + Для зайнятих розробників це доволі складно, тому такі патчі часто + відкладаються. Будь ласка, не надсилайте великі патчі. + +* Додавайте описи + + Іноді сам патч недостатньо описує проблему, яку він виправляє. + Кращий опис (яку проблему виправляє, передумови, платформа тощо) + допоможе швидше об’єднати патч. + +* Diff для останньої ревізії + + Вашу проблему могло бути виправлено в останній ревізії. Або код уже + може бути зовсім іншим. Перед надсиланням патча спробуйте отримати + найновішу версію (гілка `trunk` для найновішої версії розробки, + `{{ site.svn.stable.branch }}` для {{ site.svn.stable.version }}) + з репозиторію Subversion. + +* Використовуйте `diff -u` + + Ми віддаємо перевагу unified diff-патчам `diff -u` над `diff -c` + або будь-яким іншим стилем. Їх значно легше переглядати. + Не надсилайте змінені файли — ми не хочемо створювати diff самостійно. + +* Додавайте тест-кейси (необов’язково) + + Патч із тест-кейсами (бажано патч до `test/*/test_*.rb`) + допоможе нам зрозуміти патч і ваші наміри. + +Ми можемо перейти до Git-стилю push/pull workflow у майбутньому. +Але до того часу дотримання цих рекомендацій допоможе вам уникнути +розчарувань. + + +[ruby-core-post]: https://blade.ruby-lang.org/ruby-core/25139 diff --git a/ua/community/user-groups/index.md b/ua/community/user-groups/index.md new file mode 100644 index 0000000000..5257ea0ae2 --- /dev/null +++ b/ua/community/user-groups/index.md @@ -0,0 +1,48 @@ +--- +layout: page +title: "Групи користувачів" +lang: ua +--- + +У спільноті програмування групи користувачів формують мережі підтримки +для людей, зацікавлених у певних темах. Це чудове місце, щоб підвищувати +навички та спілкуватися з іншими програмістами. Групи користувачів +неформальні, і їхня структура може відрізнятися від групи до групи. +Кожен може створити власну групу та встановити свої правила й розклад. +{: .summary} + +### Групи користувачів Ruby + +Якщо ви хочете зустрічатися з іншими Ruby-програмістами, місцева група +користувачів може бути саме тим, що потрібно. Групи користувачів Ruby +повністю присвячені Ruby. Зазвичай вони проводять щомісячні зустрічі, +мають поштову розсилку, вебсайт і, якщо пощастить, часті hacking-сесії +(зустрічі, присвячені написанню коду Ruby). + +Інформацію про групи користувачів Ruby можна знайти на різних сайтах: + +- [Ruby Meetup Groups на meetup.com][meetup]. Значна кількість груп + користувачів Ruby обрала Meetup як свій дім. Meetup надає низку + інструментів для груп користувачів, зокрема: приватні форуми, + місце для оголошень, автоматичні нагадування про зустрічі та + зручну систему RSVP. +- [RubyEvents.org][rc-meetups] тепер має список Ruby Meetup-подій + з усього світу. +- Існує [Google Group][meetups-google-group] для організаторів Ruby Meetup. +- [OnRuby][onruby] — також багато груп користувачів можна знайти на OnRuby. + OnRuby — це open source платформа, написана на Ruby, яку можна + використовувати для організації зустрічей. Вона [доступна на GitHub][onruby-github]. + +### Організація власної групи + +Якщо ви зацікавлені у створенні власної групи, переконайтеся, що у вашому +регіоні ще немає групи користувачів Ruby. Спробуйте групу організаторів +meetup, якщо вам потрібні поради, як розпочати власну групу. + + + +[meetup]: https://www.meetup.com/topics/ruby/ +[onruby]: https://www.onruby.eu/ +[onruby-github]: https://github.com/phoet/on_ruby +[rc-meetups]: https://www.rubyevents.org/events +[meetups-google-group]: https://groups.google.com/g/ruby-meetups diff --git a/ua/community/weblogs/index.md b/ua/community/weblogs/index.md new file mode 100644 index 0000000000..b4ffa122fe --- /dev/null +++ b/ua/community/weblogs/index.md @@ -0,0 +1,57 @@ +--- +layout: page +title: "Блоги та розсилки" +lang: ua +--- + +Останніми роками Ruby-блоги та розсилки стрімко зросли, і якщо добре +пошукати, можна знайти сотні блогів, що діляться фрагментами коду Ruby, +описують нові підходи або міркують про майбутнє Ruby. +{: .summary} + +### Розсилки + +* [**Ruby Weekly**][ruby-weekly]: розсилка, яка щотижня добирає найцікавіші статті та новини про Ruby. +* [**Short Ruby Newsletter**][short-ruby-newsletter]: щотижневий підсумок статей, обговорень і новин зі спільноти Ruby. + +### Пошук Ruby-блогів + +* [**RubyFlow**][rubyflow], «linklog спільноти Ruby та Rails», + — новинний сайт про Ruby із посиланнями на бібліотеки, блог-пости, + туторіали та інші Ruby-ресурси. +* [**Rubyland**][rubyland] агрегує новини та блог-пости про Ruby + з RSS-стрічок. + +### Помітні блоги + +Кілька помітних блогів вирізняються частотою та оперативністю оновлень. + +* [**DEV Ruby Tag**][dev-ruby-tag] — колекція всіх дописів із тегом Ruby + у спільноті DEV. DEV — це мережа тисяч розробників, які пишуть блоги + та обговорюють код. +* [**Ruby on Rails Blog**][ruby-on-rails-blog] — офіційний груповий блог + команди Ruby on Rails. Якщо ви використовуєте Rails, цей блог є + ключовим для повідомлень про оновлення безпеки та загальної картини + спільноти Rails. +* [**Rails at Scale**][rails-at-scale] містить дописи про значну частину + нещодавніх робіт, спрямованих на розвиток і Ruby, і Rails. + +### Поширюймо інформацію + +Якщо ви хочете писати для будь-якого з наведених вище блогів, зв’яжіться +з авторами. + +Ruby також часто обговорюють на [reddit][reddit] і [Hacker News][hn] +у відповідних програмістських новинах. Якщо знайдете чудовий код — +обов’язково поділіться! + + +[rubyflow]: http://www.rubyflow.com/ +[rubyland]: http://rubyland.news/ +[ruby-weekly]: https://rubyweekly.com/ +[dev-ruby-tag]: https://dev.to/t/ruby +[ruby-on-rails-blog]: https://rubyonrails.org/blog/ +[reddit]: http://www.reddit.com/r/ruby +[hn]: http://news.ycombinator.com/ +[short-ruby-newsletter]: https://newsletter.shortruby.com/ +[rails-at-scale]: https://railsatscale.com/ diff --git a/ua/conduct/index.md b/ua/conduct/index.md new file mode 100644 index 0000000000..740d7c8de8 --- /dev/null +++ b/ua/conduct/index.md @@ -0,0 +1,25 @@ +--- +layout: page +title: "Рекомендації щодо поведінки спільноти Ruby" +lang: ua +--- + +Ми обрали такі рекомендації щодо поведінки, базовані на ранньому проєкті +CoC спільноти PostgreSQL, для спільноти розробників Ruby — щоб забезпечити +безпечну та продуктивну співпрацю. +Кожна Ruby-спільнота (конференція тощо) може обирати власний Кодекс поведінки. +{: .summary} + +Цей документ містить рекомендації для спільноти щодо створення безпечного, +шанобливого, продуктивного та орієнтованого на співпрацю середовища для будь-якої +людини, яка бажає долучитися до спільноти Ruby. Він застосовується до +всіх "просторів співпраці", під якими маються на увазі канали комунікації +спільноти (наприклад, поштові розсилки, надіслані патчі, коментарі до +комітів тощо). + + * Учасники будуть терпимими до протилежних поглядів. + * Учасники мають стежити, щоб їхня мова та дії не містили особистих атак і + принизливих зауважень. + * Інтерпретуючи слова та дії інших, учасники мають завжди припускати добрі + наміри. + * Поведінка, яку можна обґрунтовано вважати домаганням, не буде терпимою. diff --git a/ua/documentation/faq/1/index.md b/ua/documentation/faq/1/index.md new file mode 100644 index 0000000000..bfcc0e360d --- /dev/null +++ b/ua/documentation/faq/1/index.md @@ -0,0 +1,337 @@ +--- +layout: page +title: "Офіційний FAQ Ruby" +lang: ua + +header: | +
+ Зміст + | + 1 + | + 2 + | + 3 + | + 4 + | + 5 + | + 6 + | + 7 + | + 8 + | + 9 + | + 10 + | + 11 +
+

Офіційний FAQ Ruby

+ +--- + +{% include faq-notice.md %} + +## Загальні питання + +### Що таке Ruby? + +Ruby — проста й потужна об’єктно-орієнтована мова програмування, створена +Yukihiro Matsumoto (у цьому документі та в поштових розсилках він +використовує псевдонім “Matz”). + +Як і Perl, Ruby добре підходить для обробки тексту. Як і Smalltalk, у Ruby +все є об’єктом, і Ruby має блоки, ітератори, метакласи та інші корисні +можливості. + +Ruby можна використовувати для написання серверів, швидких прототипів і +повсякденних задач програмування. Як повністю інтегрована об’єктно- +орієнтована мова, Ruby добре масштабується. + +Особливості Ruby: + +* Простий синтаксис, +* Базові ООП-можливості (класи, методи, об’єкти тощо), +* Спеціальні ООП-можливості (міксини, синглтон-методи, перейменування тощо), +* Перевантаження операторів, +* Обробка винятків, +* Ітератори та замикання, +* Збирання сміття, +* Динамічне завантаження (залежно від архітектури), +* Висока портативність (працює на різних Unix, Windows, DOS, macOS, OS/2, + Amiga тощо). + +### Покажіть трохи Ruby-коду! + +Давайте визначимо клас `Person` з іменем та віком. Ми протестуємо код, +створивши кілька людей і переглянувши їх. + +~~~ +class Person + attr_accessor :name, :age + + def initialize(name, age) + @name = name + @age = age.to_i + end + + def inspect + "#{name} (#{age})" + end +end + +p1 = Person.new("Elmo", 4) +p2 = Person.new("Zoe", 7) + +p1 # => Elmo (4) +p2 # => Zoe (7) +~~~ + +Тепер заповнимо масив людей, зчитуючи імена та вік із файлу `ages`, +який містить рядки на кшталт: + +~~~ +Bert: 8 +Cookie: 11 +Elmo: 4 +Ernie: 8 +Zoe: 7 +~~~ + +Код використовує регулярні вирази, щоб парсити послідовні рядки з файлу, +створювати новий об’єкт `Person` для кожного збігу та додавати його +в кінець масиву `people`. + +~~~ +people = Array.new + +File.foreach("ages") do |line| + people << Person.new($1, $2) if line =~ /(.*):\s+(\d+)/ +end + +people # => [Bert (8), Cookie (11), Elmo (4), Ernie (8), Zoe (7)] +~~~ + +Тепер відсортуймо результат за віком людини. Є багато способів це зробити. +Ми можемо визначити блок сортування, який повідомляє Ruby, як порівнювати +двох людей: + +~~~ +sorted = people.sort {|a, b| a.age <=> b.age } +sorted # => [Elmo (4), Zoe (7), Bert (8), Ernie (8), Cookie (11)] +~~~ + +Інший спосіб — змінити метод порівняння для класу `Person`: + +~~~ +class Person + def <=>(other) + age <=> other.age + end +end +people.sort # => [Elmo (4), Zoe (7), Bert (8), Ernie (8), Cookie (11)] +~~~ + +### Чому назва “Ruby”? + +Під впливом Perl Matz хотів використати назву коштовного каменю для +своєї нової мови, тож назвав Ruby на честь каменю народження колеги. + +Згодом він зрозумів, що Ruby йде одразу після Perl у кількох ситуаціях. +У каменях народження: перли — для червня, рубін — для липня. У вимірюванні +розміру шрифтів: pearl — 5pt, ruby — 5.5pt. Він вважав Ruby доброю назвою +для мови програмування, новішої (і, сподіваємося, кращої) за Perl. + +(На основі пояснення Matz у [\[ruby-talk:00394\]][ruby-talk:00394] +від 11 червня 1999 року.) + +[ruby-talk:00394]: https://blade.ruby-lang.org/ruby-talk/394 + +### Яка історія Ruby? + +Нижче наведено стислий виклад повідомлення Matz у +[\[ruby-talk:00382\]][ruby-talk:00382] від 4 червня 1999 року. +(День народження Ruby був уточнений у +[\[ruby-list:15977\]][ruby-list:15977].) + +> Отже, Ruby народився 24 лютого 1993 року. Я обговорював з колегою +> можливість об’єктно-орієнтованої скриптової мови. Я знав Perl +> (Perl4, не Perl5), але насправді мені він не подобався, бо мав відтінок +> “іграшкової мови” (і досі має). Об’єктно-орієнтована скриптова мова +> здавалася дуже перспективною. + +> Я тоді знав Python. Але він мені не подобався, бо я не вважав його +> справжньою об’єктно-орієнтованою мовою — ООП-можливості виглядали як +> надбудова над мовою. Як маніяк мов і прихильник ООП протягом 15 років, +> я дуже хотів справжню об’єктно-орієнтовану, просту у використанні +> скриптову мову. Я шукав, але не міг знайти. + +> Тож я вирішив створити її. На те, щоб інтерпретатор запрацював, пішло +> кілька місяців. Я додав туди можливості, які хотів бачити у своїй мові, +> такі як ітератори, обробка винятків, збирання сміття. + +> Потім я reorganізував можливості Perl у бібліотеку класів і +> реалізував їх. Я опублікував Ruby 0.95 у японських внутрішніх +> групах новин у грудні 1995 року. + +> Відтоді були створені дуже активні поштові розсилки та вебсторінки. + +[ruby-talk:00382]: https://blade.ruby-lang.org/ruby-talk/382 +[ruby-list:15977]: https://blade.ruby-lang.org/ruby-list/15977 + +### Де головна сторінка Ruby? + +Офіційна головна сторінка Ruby — [www.ruby-lang.org](/ua/). +Окрім англійської та японської версій, існують переклади багатьма іншими +мовами. + +Хороші стартові точки для пошуку інформації про Ruby — +[Документація](/ua/documentation/) і [Спільнота](/ua/community/). + +### Чи є група новин Ruby? + +comp.lang.ruby була створена в травні 2000 року (завдяки зусиллям +[Conrad Schneiker](mailto:schneiker@jump.net)). + +### Чи є поштові розсилки Ruby? + +Є кілька поштових розсилок про Ruby. Дивіться сторінку +[Поштові розсилки](/ua/community/mailing-lists/) +для додаткової інформації. + +Архіви розсилок можна шукати за адресою +[https://ml.ruby-lang.org/archives/list/ruby-talk@ml.ruby-lang.org/](https://ml.ruby-lang.org/archives/list/ruby-talk@ml.ruby-lang.org/). +(Це URL для розсилки ruby-talk; для інших змінюйте за аналогією). + +### Як зробити thread у mutt? + +{% include warnings/faq-out-of-date.html %} + +Для деяких розсилок Ruby програмне забезпечення додає префікс до тем, +наприклад `ruby-core:1234`. Це може збивати threading у деяких +поштових клієнтах. + +У mutt можна налаштувати threading за допомогою такого параметра: + +~~~ +# reply regexp, to support MLs like ruby-talk. +set reply_regexp="^(\[[a-z0-9:-]+\][[:space:]]*)?(re([\[0-9\]+])*|aw):[[:space:]]*" +~~~ + +### Як правильно: “Ruby” чи “ruby”? + +Офіційно мова називається “Ruby”. На більшості систем вона запускається +командою `ruby`. Використовувати “ruby” замість “Ruby” — нормально. + +Будь ласка, не використовуйте “RUBY” як назву мови. + +Спочатку, історично, вона називалася “ruby”. + +### Чи є книги про Ruby? + +{% include warnings/faq-out-of-date.html %} + +* Programming Ruby: The Pragmatic Programmer's Guide, + (the Pickaxe Book) by David Thomas and Andrew Hunt: ISBN 0-20171-089-7, + Addison-Wesley, October 2000. + +* A Japanese language Ruby reference book by Matz et al. and published by + ASCII is available in Japan (ISBN 4-7561-3254-5). An English translation, + “The Ruby Programming Language”, is available from O'Reilly & Associates + (ISBN 978-0596516178). + +* A Japanese language “Ruby Pocket Reference” is published by O'Reilly Japan + (ISBN 4-87311-023-8). Let O'Reilly in the US know if you'd like to see a + translation. + +* In addition, “Mastering Regular Expressions”, by Jeffrey Friedl, + (the Hip Owl Book): ISBN 1-56592-257-3 from O'Reilly & Associates, + is a reference work that covers the art and implementation of regular + expressions in various programming languages. Most of it is highly + relevant to Ruby regular expressions. + +### Які редактори підтримують Ruby? + +{% include warnings/faq-out-of-date.html %} + +* [Emacs](http://www.gnu.org/software/emacs/emacs.html) + або [XEmacs](http://www.xemacs.org/): `ruby-mode.el` постачається в + дистрибутиві Ruby. У деяких версіях XEmacs може знадобитися додати + `(load "font-lock")` до файлу `.emacs`, щоб дозволити `ruby-mode.el` + виявляти пакет підсвічування синтаксису, який ви використовуєте. +* [Vim](http://www.vim.org/): Vim 5.7 і новіші мають файли синтаксису Ruby + як стандарт у пакеті runtime. Для попередніх версій файл синтаксису Ruby + доступний за адресою + [http://www.xs4all.nl/~hipster/lib/ruby/ruby.vim](http://www.xs4all.nl/~hipster/lib/ruby/ruby.vim). +* [Jedit](http://jedit.sourceforge.net/): портативний редактор, написаний на Java, + має підтримку Ruby. +* [Nedit](http://www.nedit.org): Eric Santonacci написав підтримку Ruby для + Nedit, доступну за адресою + [ftp://ftp.talc.fr/pub/ruby/ruby.nedit-0.1.tar.gz](ftp://ftp.talc.fr/pub/ruby/ruby.nedit-0.1.tar.gz). +* Barry Shultz написав файл визначення Ruby для TextPad, доступний за адресою + [https://www.textpad.com/add-ons/synn2t.html](https://www.textpad.com/add-ons/synn2t.html). + +### Як додавати до Ruby-коду результати виконання? + +{% include warnings/faq-out-of-date.html %} + +Зазвичай результати виконання Ruby-коду додають як коментарі до кожного +рядка. Наприклад, у наступному коді показано, що присвоєння створює +рядок "Billy Bob", а потім результат витягування підрядків. + +~~~ +str = "Billy" + " Bob" # => "Billy Bob" +str[0,1] + str[2,1] + str[-2,2] # => "Blob" +~~~ + +Користувачі Emacs і vim можуть інтегрувати це зі своїм середовищем редагування, +що корисно, якщо ви хочете надсилати людям електронні листи з анотованим +Ruby-кодом. Встановивши `xmp`, користувачі Emacs можуть додати таке до +свого `.emacs` файлу: + +~~~ +(defun ruby-xmp-region (reg-start reg-end) + "Pipe the region through Ruby's xmp utility and replace the region with + the result." + (interactive "r") + (shell-command-on-region reg-start reg-end + "ruby -r xmp -n -e 'xmp($_, \"%l\t\t# %r\n\")'" + t)) +(global-set-key [(meta f10)] 'ruby-xmp-region) +~~~ + +Користувачі Vim можуть використати мапінг (дякуємо hipster): + +~~~ +map :!ruby -r xmp -n -e 'xmp($_, "\%l\t\t\# \%r\n")' +~~~ + +У обох випадках виділіть фрагмент коду й натисніть Meta-F10, щоб додати +анотації. + +### Я не можу зрозуміти Ruby навіть після прочитання мануалу! + +{% include warnings/faq-out-of-date.html %} + +Синтаксис Ruby доволі стабільний із Ruby 1.0, але нові можливості +час від часу додаються. Тому книги та онлайн-документація можуть +відставати. + +Якщо у вас є проблема, сміливо запитуйте в поштовій розсилці +(див. [сторінку поштових розсилок](/ua/community/mailing-lists/)). +Зазвичай ви швидко отримаєте відповіді від самого Matz, автора мови, +від інших гуру та від тих, хто вже вирішував подібні проблеми. + +Будь ласка, включайте вивід `ruby -v` разом із проблемним вихідним кодом. + +Якщо у вас проблема з [`irb`](../10/#irb), +майте на увазі, що він має певні обмеження. +Спробуйте запустити скрипт з `irb --single-irb` або безпосередньо +командою `ruby`. + +Можливо, схожі питання вже є в розсилці, і хорошою практикою netiquette +є переглянути останні листи (RFC1855:3.1.1, 3.1.2) перед тим, як питати. +Але все ж запитуйте — і правильну відповідь буде отримано. diff --git a/ua/documentation/faq/10/index.md b/ua/documentation/faq/10/index.md new file mode 100644 index 0000000000..1a8e8600ee --- /dev/null +++ b/ua/documentation/faq/10/index.md @@ -0,0 +1,144 @@ +--- +layout: page +title: "Офіційний FAQ Ruby" +lang: ua + +header: | +
+ Зміст + | + 1 + | + 2 + | + 3 + | + 4 + | + 5 + | + 6 + | + 7 + | + 8 + | + 9 + | + 10 + | + 11 +
+

Офіційний FAQ Ruby

+ +--- + +{% include faq-notice.md %} + +## Бібліотеки розширень + +### Як використовувати Ruby інтерактивно? +{: #irb} + +{% include warnings/faq-out-of-date.html %} + +Спробуйте використати `irb`. Далі наведено переказ зі слів Kentaro Goto +(Gotoken), який уперше з’явився у [\[ruby-talk:444\]][ruby-talk:444]. + +1. Завантажте найсвіжіший tarball `irb` із + [contrib directory](ftp://ftp.netlab.co.jp/pub/lang/ruby/contrib/) + в архіві Ruby. +2. Розпакуйте дерево каталогу `irb`. +3. Додайте шлях до каталогу `irb/` у змінну середовища `$RUBYLIB`. +4. Створіть символічне посилання з `$RUBYLIB/irb/irb.rb` на файл `irb` + десь у вашому `PATH`. +5. `chmod +x $RUBYLIB/irb/irb.rb` +6. Можливо, використайте `rehash`, щоб повідомити вашу оболонку + про нову команду. +7. Наберіть `irb`. + +Якщо модуль розширення readline працює з вашим інтерпретатором, +`irb` стане набагато приємнішим у використанні. + +У каталозі `samples/` дистрибутива Ruby також є проста програма `eval`. +Вона дозволяє вводити вирази та переглядати їхні значення. +Ви можете скопіювати `eval` у каталог `site_ruby` у дереві Ruby і +запускати так: + +~~~ +ruby -r eval -e0 +~~~ + +[ruby-talk:444]: https://blade.ruby-lang.org/ruby-talk/444 + +### Чи є налагоджувач для Ruby? + +Є налагоджувач на кшталт gdb для Ruby. + +~~~ +ruby -r debug your_program +~~~ + +### Як використовувати бібліотеку, написану на C, з Ruby? + +З усіх скриптових мов Ruby, мабуть, найпростіше розширювати. Тут немає +проблем із підрахунком посилань і типами змінних, і потрібно вивчити дуже +мало інтерфейсів. Ба більше, C-код для розширення Ruby часто дивовижно +нагадує сам Ruby-код. + +Спочатку прочитайте файл `doc/extension.rdoc` у вихідному коді Ruby +або перегляньте [extension.rdoc на docs.ruby-lang.org][extension-rdoc]. +Це хороший документ не лише для написання бібліотек розширень, але й для +глибшого розуміння Ruby. + +Далі сайт RubyGems пропонує +[гід зі створення gem із розширеннями][rubygems-guide]. +Він показує, як налаштувати gem із C-розширеннями, що збираються під час +встановлення. Також там є посилання на деякі наявні gem, які обгортають +бібліотеки C, і на додаткові матеріали. + +Також варто подивитися на вихідний код інтерпретатора та на різні +постачувані розширення в каталозі `ext/` +(ви можете переглянути [репозиторій Ruby на GitHub][ruby-github]). + +[extension-rdoc]: https://docs.ruby-lang.org/en/master/extension_rdoc.html +[rubygems-guide]: http://guides.rubygems.org/gems-with-extensions/ +[ruby-github]: https://github.com/ruby/ruby + +### Чи можу я використовувати Tcl/Tk у Ruby? + +{% include warnings/faq-out-of-date.html %} + +У стандартному дистрибутиві є два інтерфейси до Tcl/Tk. Один розміщений +у `ext/tcltk/` і завантажується через `require "tcltk"`. Синтаксис дуже +близький до Tcl, який передається інтерпретатору Tcl. На жаль, опис цієї +бібліотеки написаний японською. + +Інший розміщений у `ext/tk/` і завантажується через `require "tk"`. +Його синтаксис ближчий до стилю інтерфейсу Tk, який надають інтерфейси +Perl і Python. + +### Tk не працює. Чому? + +{% include warnings/faq-out-of-date.html %} + +Ваша версія Tk може бути застарілою, спробуйте новішу. + +### Чи можу я використовувати інтерфейси gtk+ або xforms у Ruby? + +{% include warnings/faq-out-of-date.html %} + +Ви знайдете `ruby-gtk-x.xx.tar.gz` і `ruby-forms-x.x.tar.gz` +у `contrib/` на Ruby FTP-сайтах. + +### Як виконувати арифметику дат? + +{% include warnings/faq-out-of-date.html %} + +Об’єкт `Time` може виражати лише дати між 1 січня 1970 та 19 січня 2038. + +Доступні два модулі бібліотек розширень: +`require "date"`, який простий і використовує англійський календар, +і `require "date2"`, який є більш загальним. + +Також дивіться `sample/cal.rb`. diff --git a/ua/documentation/faq/11/index.md b/ua/documentation/faq/11/index.md new file mode 100644 index 0000000000..8f57471cdd --- /dev/null +++ b/ua/documentation/faq/11/index.md @@ -0,0 +1,192 @@ +--- +layout: page +title: "Офіційний FAQ Ruby" +lang: ua + +header: | +
+ Зміст + | + 1 + | + 2 + | + 3 + | + 4 + | + 5 + | + 6 + | + 7 + | + 8 + | + 9 + | + 10 + | + 11 +
+

Офіційний FAQ Ruby

+ +--- + +{% include faq-notice.md %} + +## Інші можливості + +### Що означає `a ? b : c`? + +Це так званий «тернарний оператор» і це те саме, що +`if a then b else c end`. + +### Як порахувати кількість рядків у файлі? + +Наступний код може дати найшвидший результат. + +~~~ +File.readlines("example").size # => 3 +~~~ + +### Що повертають `MatchData#begin` і `MatchData#end`? + +Вони працюють разом із `$~` і повертають індекс початку та індекс кінця +збігу в початковому рядку. Див. приклад у +[розгортанні табуляцій](../9/#tab-expansion). + +### Як підсумувати елементи масиву? + +{% include warnings/faq-out-of-date.html %} + +Замість розв’язувати конкретну задачу, розв’яжімо загальну. +Перше, що ми зробимо — напишемо метод, який проходитиме по об’єкту +`Enumerable` і збиратиме один результат. У Smalltalk цей метод називають +inject, тож і ми його так назвемо: + +~~~ +module Enumerable + + # inject(n) {|n, i| ...} + def inject(n) + each {|i| n = yield(n, i) } + + n + end +end +~~~ + +Зверніть увагу, що ми додали метод до `Enumerable`. Це означає, що все, +що включає `Enumerable`, тепер може використовувати `inject`. Але як ним +користуватися? Він приймає один аргумент `n` і блок. Для кожного елемента +в переліку він викликає блок, передаючи `n` і сам елемент. Результат +блоку присвоюється назад у `n`. Отже, щоб визначити `sum`, можна написати: + +~~~ +module Enumerable + def sum + inject(0) {|n, i| n + i } + end +end + +[1,3,5,7,9].sum # => 25 +(1..100).sum # => 5050 +~~~ + +### Як використовувати continuations? + +{% include warnings/faq-out-of-date.html %} + +Continuations у Ruby дозволяють створювати об’єкт, що представляє місце +в програмі Ruby, і повертатися до цього місця будь-коли (навіть якщо воно +нібито вийшло з області видимості). Continuations можна використовувати +для реалізації складних керувальних структур, але зазвичай вони корисніші +як спосіб заплутати людей. + +У [\[ruby-talk:4482\]][ruby-talk:4482] Jim Weirich навів такі приклади +continuations: + +~~~ +# -------------------------------------------------------------------- +# Simple Producer/Consumer +# -------------------------------------------------------------------- +# Connect a simple counting task and a printing task together using +# continuations. +# +# Usage: count(limit) + +def count_task(count, consumer) + (1..count).each do |i| + callcc {|cc| consumer.call cc, i } + end + nil +end + +def print_task() + producer, i = callcc { |cc| return cc } + print "#{i} " + callcc { |cc| producer.call } +end + +def count(limit) + count_task(limit, print_task()) + print "\n" +end +~~~ + + +~~~ +# -------------------------------------------------------------------- +# Filtering Out Multiples of a Given Number +# -------------------------------------------------------------------- +# Create a filter that is both a consumer and producer. Insert it +# between the counting task and the printing task. +# +# Usage: omit(2, limit) + +def filter_task(factor, consumer) + producer, i = callcc { |cc| return cc } + if (i%factor) != 0 then + callcc { |cc| consumer.call cc, i } + end + producer.call +end + +def omit(factor, limit) + printer = print_task() + filter = filter_task(factor, printer) + count_task(limit, filter) + print "\n" +end +~~~ + + +~~~ +# -------------------------------------------------------------------- +# Prime Number Generator +# -------------------------------------------------------------------- +# Create a prime number generator. When a new prime number is +# discovered, dynamically add a new multiple filter to the chain of +# producers and consumers. +# +# Usage: primes(limit) + +def prime_task(consumer) + producer, i = callcc { |cc| return cc } + if i >= 2 then + callcc { |cc| consumer.call cc, i } + consumer = filter_task(i, consumer) + end + producer.call +end + +def primes(limit) + printer = print_task() + primes = prime_task(printer) + count_task(limit, primes) + print "\n" +end +~~~ + +[ruby-talk:4482]: https://blade.ruby-lang.org/ruby-talk/4482 diff --git a/ua/documentation/faq/2/index.md b/ua/documentation/faq/2/index.md new file mode 100644 index 0000000000..ddc551fe69 --- /dev/null +++ b/ua/documentation/faq/2/index.md @@ -0,0 +1,103 @@ +--- +layout: page +title: "Офіційний FAQ Ruby" +lang: ua + +header: | +
+ Зміст + | + 1 + | + 2 + | + 3 + | + 4 + | + 5 + | + 6 + | + 7 + | + 8 + | + 9 + | + 10 + | + 11 +
+

Офіційний FAQ Ruby

+ +--- + +{% include faq-notice.md %} + +## Як Ruby порівнюється з...? + +### Як Ruby порівнюється з Python? + +Python і Ruby — об’єктно-орієнтовані мови, які забезпечують плавний +перехід від процедурного стилю програмування до ООП. Smalltalk, навпаки, +є лише об’єктною — ви не можете нічого робити, доки не зрозумієте об’єкти, +наслідування та значну ієрархію класів Smalltalk. Надаючи процедурні +“тренувальні колеса”, Python і Ruby “виправляють” одну з особливостей, +яка могла стримувати Smalltalk від широкого поширення. Обидві мови +підходять до цього рішення з протилежних боків. + +Python — гібридна мова. Вона має функції для процедурного програмування +та об’єкти для ООП. Python поєднує два світи, дозволяючи взаємне +перетворення функцій і методів через явний параметр `self` у визначенні +кожного методу. Коли функція вставляється в об’єкт, перший аргумент +автоматично стає посиланням на одержувача. + +Ruby — чиста ООП-мова, яка може виглядати як процедурна. У неї немає +функцій, лише виклики методів. У методі Ruby одержувач, також званий +`self`, — прихований аргумент, як `this` у C++. Оператор `def` поза +визначенням класу, який у Python визначає функцію, насправді визначає +метод у Ruby. Ці псевдофункції стають приватними методами класу Object, +кореня ієрархії класів Ruby. Процедурне програмування вирішується з +іншого боку — все є об’єктом. Якщо користувач ще не розуміє об’єкти, +він може просто вважати, що `def` — це визначення функції, і все одно +отримувати корисний результат. + +ООП-чистота Ruby дає низку можливостей, яких Python не має або ще +намагається досягти: єдина ієрархія типів/класів, метакласи, можливість +успадковувати від будь-чого та уніфікований виклик методів (немає цієї +плутанини “`len()` — це функція, але `items()` — метод”). Ruby, як і +Smalltalk, підтримує лише одиничне наслідування, проте має дуже потужну +концепцію міксинів: визначення класу може включати модуль, який вставляє +методи, константи тощо цього модуля в клас. + +Ruby, як і Smalltalk, надає замикання та блоки коду і використовує їх з +такою ж користю. Класичні колекції Ruby та ітератори є відмінними — +набагато потужнішими й елегантнішими, ніж ad hoc рішення, які з’являються +в Python (лямбди та list comprehensions). + +Синтаксис і філософія дизайну Ruby сильно вплинулися Perl. Він має багато +синтаксичної варіативності. Модифікатори операторів (`if`, `unless`, +`while`, `until` тощо) можуть з’являтися наприкінці будь-якого оператора. +Деякі ключові слова необов’язкові (наприклад, `then` в операторі `if`). +Дужки інколи можна опускати у викликах методів. Одержувача методу також +часто можна опускати. +Багато, дуже багато речей запозичено безпосередньо з Perl. +Вбудовані регулярні вирази, `$_` і компанія, heredoc-и, відмінність між +рядками в одинарних та подвійних лапках, префікси `$` і `@` для +розрізнення типів імен тощо. + +Якщо вам подобається Perl, Ruby вам сподобається і ви почуватиметеся як +удома з його синтаксисом. Якщо вам подобається Smalltalk, Ruby вам +сподобається і ви почуватиметеся як удома з його семантикою. Якщо вам +подобається Python, вас може відштовхнути або не відштовхнути величезна +різниця у філософії дизайну між Python і Ruby/Perl. + +Ruby значно складніший за Python, але його можливості здебільшого добре +узгоджені між собою. Ruby добре спроєктований і повний гарних ідей, які +можна використати для P3K. Я не впевнений, скільки Python-програмістів +будуть ним зацікавлені — мене він поки не переконав (ще). Але він вартий +серйозного вивчення і може стати реальною загрозою для Perl. + +Опубліковано [John Dell'Aquila](mailto:jbd@alum.mit.edu) у comp.lang.python, +11/17/2000. Відтворено з дозволу. diff --git a/ua/documentation/faq/3/index.md b/ua/documentation/faq/3/index.md new file mode 100644 index 0000000000..ae1d9913f8 --- /dev/null +++ b/ua/documentation/faq/3/index.md @@ -0,0 +1,198 @@ +--- +layout: page +title: "Офіційний FAQ Ruby" +lang: ua + +header: | +
+ Зміст + | + 1 + | + 2 + | + 3 + | + 4 + | + 5 + | + 6 + | + 7 + | + 8 + | + 9 + | + 10 + | + 11 +
+

Офіційний FAQ Ruby

+ +--- + +{% include faq-notice.md %} + +## Встановлення Ruby + +Актуальну інформацію про завантаження та встановлення Ruby дивіться на +сторінці [Встановлення](/ua/documentation/installation/) +або [Завантаження](/ua/downloads/). + +### Які операційні системи підтримують Ruby? + +{% include warnings/faq-out-of-date.html %} + +Ruby розробляється під Linux і написаний досить простим C. +Він працює на Linux та інших UNIX-подібних ОС, macOS, +Windows, DOS, BeOS, Amiga, Acorn Risc OS і OS/2. + +### Де можна отримати вихідні коди Ruby? + +Останню версію Ruby можна завантажити з: +[www.ruby-lang.org/ua/downloads/](/ua/downloads/). +Дзеркальні сайти також перелічені на цій сторінці. + +Також на цій сторінці є посилання на нічний снапшот гілки розробки. + +### Чи можна отримати доступ до дерева джерел розробки? + +{% include warnings/faq-out-of-date.html %} + +Якщо у вас є клієнт CVS, ви можете отримати поточне дерево джерел так: + +~~~ +$ cvs -d :pserver:anonymous@cvs.netlab.co.jp:/home/cvs login +(Logging in to anonymous@cvs.netlab.co.jp) +CVS password: guest +$ cvs -d :pserver:anonymous@cvs.netlab.co.jp:/home/cvs co ruby +~~~ + +Якщо у вас немає CVS, ви можете отримати нічний снапшот джерел розробки +з +[https://cache.ruby-lang.org/pub/ruby/snapshot.tar.gz](https://cache.ruby-lang.org/pub/ruby/snapshot.tar.gz). + +### Як компілювати Ruby? + +У Unix Ruby використовує систему `autoconf` для налаштування середовища +збирання. Вам не потрібна команда `autoconf`, щоб зібрати Ruby з +дистрибутива; просто використайте команди: + +~~~ +$ ./configure [configure options] +$ make +$ make test +$ make install +~~~ + +Вам можуть знадобитися права суперкористувача, щоб встановити Ruby, +якщо ви не змінюєте стандартне місце встановлення (`/usr/local`). +Повний список параметрів `configure` можна отримати так: + +~~~ +$ ./configure --help +~~~ + +Якщо ви працюєте з репозиторію вихідного коду, може знадобитися +запустити `autoconf` перед `configure`. + +### Як повідомити Ruby, де шукати бібліотеки? + +{% include warnings/faq-out-of-date.html %} + +У деяких системах процес збирання може не знайти бібліотеки, які +використовуються модулями розширень (наприклад, бібліотеки `dbm`). + +Ви можете повідомити Ruby, де шукати бібліотеки, через параметри `configure`. +З [\[ruby-talk:5041\]][ruby-talk:5041]: + +~~~ +$ ./configure --with-xxx-yyy=DIR +~~~ + +де xxx — це один із: + +~~~ +opt extra software path in general +dbm path for dbm library +gdbm path for gdbm library +x11 ...for X11.. +tk ...for Tk... +tcl ...for Tcl... +~~~ + +а yyy — один із: + +~~~ +dir specifies -I DIR/include -L DIR/lib +include specifies -I DIR +lib specifies -L DIR +~~~ + +На HP-UX можуть виникати проблеми зі збиранням через `gcc`. +Спробуйте використовувати нативний компілятор. WATANABE Tetsuya рекомендує: + +~~~ +$ CC="cc -Ae" CFLAGS=-O ./configure --prefix=/opt/gnu +~~~ + +Також можуть виникати проблеми з нативним `sed` від HP. +Він рекомендує встановити GNU-еквівалент. + +[ruby-talk:5041]: https://blade.ruby-lang.org/ruby-talk/5041 + +### Чи доступні готові бінарні файли? + +Є один завантажуваний пакет, який містить усе потрібне для запуску Ruby +під різними версіями Windows. Він доступний на [RubyInstaller](https://rubyinstaller.org/). + +[Reuben Thomas](mailto:Reuben.Thomas@cl.cam.ac.uk) пише: + +> Ви могли б згадати, що існує порт для Acorn RISC OS, наразі версії 1.4.3. +> Я зробив цей порт і не планую його підтримувати, але я надіслав патчі +> Matz, тож новіші версії, ймовірно, також компілюватимуться. + +### Що таке “cygwin”, “mingw” і “djgpp”? + +{% include warnings/faq-out-of-date.html %} + +Ruby написаний так, щоб використовувати багаті можливості Unix-середовища. +На жаль, Windows не має деяких функцій і реалізує інші інакше. У результаті +потрібен певний шар сумісності, щоб запускати Ruby (та інші Unix-орієнтовані +програми) у Windows. + +Ви можете зустріти різні версії виконуваного файлу Ruby, що використовують +різні wrapper-шари сумісності. + +Версія rbdj — це автономна версія Windows-бінарника Ruby. +Вона використовує інструменти DJ Delorie +([http://www.delorie.com](http://www.delorie.com)). + +Версія rbcw — це Windows-бінарник Ruby, який потребує бібліотеку cygwin, +доступну на [http://www.cygwin.com](http://www.cygwin.com) або зі сторінок +завантаження Ruby. Cygwin — це і шар емуляції, і набір утиліт, спочатку +створених Cygnus Solutions (нині частина Redhat). +Версія Ruby під cygwin, ймовірно, має найповніший набір можливостей у Windows, +тому більшість програмістів захочуть використовувати саме її. + +Щоб використати rbcw-версію, потрібно окремо встановити cygwin .dll. +Після встановлення cygwin на комп’ютер скопіюйте `cygwin1.dll` (яка +знаходиться в підкаталозі `bin` дистрибутива cygwin) у папку +`Windows\System32` (або в інше місце, яке є у вашому PATH). + +Дякуємо Anders Schneiderman за основу цього опису. + +### Чому не працює графіка Tk у Windows? + +{% include warnings/faq-out-of-date.html %} + +Чи правильно встановлено Tk на вашій Windows-машині? Перейдіть до +[https://wiki.tcl-lang.org/page/Binary+Distributions](https://wiki.tcl-lang.org/page/Binary+Distributions#85b8647b1ec80c2fa1698c3c7e76204a944a95db2487347c51773f26b9dad6ae) +і знайдіть готовий бінарний дистрибутив Tcl/Tk для вашої системи. + +Чи вказують змінні середовища `TCL_LIBRARY` і `TK_LIBRARY` на каталоги, +що містять tcl і tk? + +Чи знаходиться бібліотека tk у вашому PATH? diff --git a/ua/documentation/faq/4/index.md b/ua/documentation/faq/4/index.md new file mode 100644 index 0000000000..7532be9968 --- /dev/null +++ b/ua/documentation/faq/4/index.md @@ -0,0 +1,427 @@ +--- +layout: page +title: "Офіційний FAQ Ruby" +lang: ua + +header: | +
+ Зміст + | + 1 + | + 2 + | + 3 + | + 4 + | + 5 + | + 6 + | + 7 + | + 8 + | + 9 + | + 10 + | + 11 +
+

Офіційний FAQ Ruby

+ +--- + +{% include faq-notice.md %} + +## Змінні, константи та аргументи + +### Чи створює присвоєння нову копію об’єкта? +{: #assignment} + +Усі змінні та константи посилаються (вказують) на якийсь об’єкт. +(За винятком неініціалізованих локальних змінних, які ні на що не +посилаються. При використанні вони викликають виняток `NameError`.) +Коли ви присвоюєте значення змінній або ініціалізуєте константу, ви +встановлюєте об’єкт, на який вона посилається. + +Отже, саме по собі присвоєння ніколи не створює нову копію об’єкта. + +Є трохи глибше пояснення для певних особливих випадків. Екземпляри +`Fixnum`, `NilClass`, `TrueClass` і `FalseClass` зберігаються безпосередньо +в змінних або константах — посилання не використовується. Змінна, що +містить число `42`, або константа `true` фактично містить значення, а не +посилання на нього. Відповідно, присвоєння фізично створює копію об’єктів +цих типів. Детальніше про це — у +[Immediate and Reference Objects](../6/#immediate). + +### Яка область видимості локальної змінної? + +Нова область видимості для локальної змінної з’являється у: +(1) верхньому рівні (main), +(2) визначенні класу (або модуля), або +(3) визначенні методу. + +~~~ +var = 1 # (1) +class Demo + var = 2 # (2) + def method + var = 3 # (3) + puts "in method: var = #{var}" + end + puts "in class: var = #{var}" +end +puts "at top level: var = #{var}" +Demo.new.method +~~~ + +Виведе: + +~~~ +in class: var = 2 +at top level: var = 1 +in method: var = 3 +~~~ + +(Зверніть увагу, що визначення класу — це виконуваний код: повідомлення +виводиться під час визначення класу). + +Блок (`{ ... }` або `do ... end`) майже створює нову область видимості ;-) +Локальні змінні, створені всередині блоку, недоступні поза блоком. +Однак, якщо локальна змінна в блоці має те саме ім’я, що й існуюча локальна +змінна в області виклику, нова змінна не створюється, і ви зможете +звертатися до цієї змінної поза блоком. + +~~~ +a = 0 +1.upto(3) do |i| + a += i + b = i*i +end +a # => 6 +# b is not defined here +~~~ + +Це стає важливим при використанні потоків — кожен потік отримує свою +власну копію змінних, локальних для блоку потоку: + +~~~ +threads = [] + +["one", "two"].each do |name| + threads << Thread.new do + local_name = name + a = 0 + 3.times do |i| + Thread.pass + a += i + puts "#{local_name}: #{a}" + end + end +end + +threads.each {|t| t.join } +~~~ + +Може дати (якщо планувальник перемикає потоки, як підказує `Thread.pass`; +це залежить від ОС і процесора): + +~~~ +one: 0 +two: 0 +one: 1 +two: 1 +one: 3 +two: 3 +~~~ + +`while`, `until` і `for` — це керувальні структури, а не блоки, тому +локальні змінні всередині них доступні в зовнішньому середовищі. +`loop`, натомість, є методом і пов’язаний блок вводить нову область видимості. + +### Коли локальна змінна стає доступною? + +Насправді питання краще сформулювати так: “у який момент Ruby вирішує, +що щось є змінною?” Проблема в тому, що простий вираз `a` може бути або +змінною, або викликом методу без параметрів. Щоб визначити, що це, +Ruby шукає оператори присвоєння. Якщо десь у джерелі до використання `a` +він бачить присвоєння, він вирішує трактувати `a` як змінну; інакше +розглядає це як метод. Як дещо патологічний випадок, розгляньте фрагмент +коду, спочатку надісланий Clemens Hintze: + +~~~ +def a + puts "method `a' called" + + 99 +end + +[1, 2].each do |i| + if i == 2 + puts "a = #{a}" + else + a = 1 + puts "a = #{a}" + end +end +~~~ + +Виведе: + +~~~ +a = 1 +method `a' called +a = 99 +~~~ + +Під час парсингу Ruby бачить використання `a` у першому `puts` і, оскільки +ще не бачив присвоєння `a`, вважає це викликом методу. Але до другого +`puts` він уже бачив присвоєння, і тому трактує `a` як змінну. + +Зверніть увагу: присвоєння не обов’язково має виконатися — Ruby достатньо +просто побачити його. Ця програма не викликає помилку: + +~~~ +a = 1 if false; a # => nil +~~~ + +Ця особливість зі змінними зазвичай не є проблемою. Якщо вона вас +турбує, спробуйте додати присвоєння `a = nil` перед першим доступом до +змінної. Це також має додаткову перевагу — пришвидшує доступ до локальних +змінних, які потім використовуються у циклах. + +### Яка область видимості константи? + +Константа, визначена у класі або модулі, може бути доступна безпосередньо +в межах визначення цього класу або модуля. + +Ви можете напряму звертатися до констант зовнішніх класів і модулів +зсередини вкладених класів і модулів. + +Також можна напряму звертатися до констант суперкласів і включених модулів. + +Окрім цих випадків, доступ до констант класів і модулів здійснюється через +оператор `::`, `ModuleName::CONST1` або `ClassName::CONST2`. + +### Як передаються аргументи? + +Фактичний аргумент присвоюється формальному аргументу під час виклику методу. +(Дивіться [присвоєння](#assignment) для деталей семантики присвоєння.) + +~~~ +def add_one(number) + number += 1 +end + +a = 1 +add_one(a) # => 2 +a # => 1 +~~~ + +Оскільки ви передаєте посилання на об’єкти, метод може змінити вміст +змінюваного об’єкта, який йому передали. + +~~~ +def downer(string) + string.downcase! +end + +a = "HELLO" # => "HELLO" +downer(a) # => "hello" +a # => "hello" +~~~ + +Еквівалента семантиці pass-by-reference інших мов немає. + +### Чи впливає присвоєння формальному аргументу на фактичний аргумент? + +Формальний аргумент — це локальна змінна. Усередині методу присвоєння +формальному аргументу просто змінює посилання на інший об’єкт. + +### Що відбувається, коли я викликаю метод через формальний аргумент? + +Усі змінні Ruby (включно з аргументами методів) діють як посилання на +об’єкти. Ви можете викликати методи цих об’єктів, щоб отримувати або +змінювати стан об’єкта і змушувати об’єкт щось робити. Це можна робити +з об’єктами, переданими в методи. Будьте обережні з цим, адже такі +побічні ефекти можуть ускладнювати розуміння програм. + +### Що означає `*`, додана перед аргументом? + +Якщо використовується у списку формальних параметрів, зірочка дозволяє +передати довільну кількість аргументів у метод, збираючи їх у масив і +присвоюючи цей масив параметру зі зірочкою. + +~~~ +def foo(prefix, *all) + all.each do |element| + puts "#{prefix}#{element}" + end +end + +foo("val = ", 1, 2, 3) +~~~ + +Виведе: + +~~~ +val = 1 +val = 2 +val = 3 +~~~ + +Коли `*` використовується у виклику методу, вона розгортає масив, +передаючи його елементи як аргументи. + +~~~ +a = [1, 2, 3] +foo(*a) +~~~ + +Ви можете ставити `*` перед останнім аргументом у: + +1. Лівій частині множинного присвоєння. +2. Правій частині множинного присвоєння. +3. Визначенні формальних аргументів методу. +4. Фактичних аргументах у виклику методу. +5. У `when`-гілці конструкції `case`. + +Наприклад: + +~~~ +x, *y = [7, 8, 9] +x # => 7 +y # => [8, 9] +x, = [7, 8, 9] +x # => 7 +x = [7, 8, 9] +x # => [7, 8, 9] +~~~ + +### Що означає `&`, додана перед аргументом? + +Якщо останній формальний аргумент методу має префікс амперсанда (`&`), +блок після виклику методу буде перетворено на об’єкт `Proc` і присвоєно +формальному параметру. + +Якщо останній фактичний аргумент під час виклику методу — це об’єкт `Proc`, +ви можете додати перед його ім’ям амперсанд, щоб перетворити його на блок. +Метод потім може викликати його через `yield`. + +~~~ +def meth1(&b) + puts b.call(9) +end + +meth1 {|i| i + i } + +def meth2 + puts yield(8) +end + +square = proc {|i| i * i } + +meth2 {|i| i + i } +meth2 &square +~~~ + +Виведе: + +~~~ +18 +16 +64 +~~~ + +### Як задати значення за замовчуванням для формального аргументу? + +~~~ +def greet(p1="hello", p2="world") + puts "#{p1} #{p2}" +end + +greet +greet("hi") +greet("morning", "mom") +~~~ + +Виведе: + +~~~ +hello world +hi world +morning mom +~~~ + +Значення за замовчуванням (яким може бути довільний вираз) обчислюється +під час виклику методу. Воно обчислюється в області видимості методу. + +### Як передавати аргументи в блок? + +Формальні параметри блоку розташовуються між вертикальними рисками на +початку блоку: + +~~~ +proc {|a, b| a <=> b } +~~~ + +Ці параметри — локальні змінні. Якщо на момент виконання блоку існує +локальна змінна з таким самим ім’ям, вона буде змінена викликом блоку. +Це може бути як добре, так і не дуже. + +Зазвичай аргументи передаються в блок через `yield` (або ітератор, що +викликає `yield`), або через метод `Proc.call`. + +### Чому мій об’єкт несподівано змінився? + +~~~ +A = a = b = "abc" +b.concat("d") # => "abcd" +a # => "abcd" +A # => "abcd" +~~~ + +Змінні тримають посилання на об’єкти. Присвоєння `A = a = b = "abc"` +поміщає посилання на рядок `"abc"` у `A`, `a` і `b`. + +Коли ви викликаєте `b.concat("d")`, ви викликаєте метод `concat` на цьому +об’єкті, змінюючи його з `"abc"` на `"abcd"`. Оскільки `a` і `A` також +посилаються на той самий об’єкт, їхні видимі значення також змінюються. + +На практиці це менш проблемно, ніж може здаватися. + +Крім того, усі об’єкти можна заморозити, захистивши їх від змін. + +### Чи змінюється значення константи? + +Константа — це змінна, ім’я якої починається з великої літери. +Константи не можна переприсвоювати зсередини методів екземпляра, +але в інших місцях їх можна змінювати за бажанням. +Коли константі присвоюється нове значення, видається попередження. + +### Чому не можна завантажити змінні з окремого файлу? + +Припустімо, що `file1.rb` містить: + +~~~ +var1 = 99 +~~~ + +а інший файл завантажує його: + +~~~ +require_relative "file1" +puts var1 +~~~ + +Виведе: + +~~~ +prog.rb:2:in `
': undefined local variable or method `var1' for main:Object (NameError) +~~~ + +Виникає помилка, оскільки `load` і `require` зберігають локальні змінні +у окремому анонімному просторі імен, фактично відкидаючи їх. Це зроблено, +щоб захистити ваш код від «забруднення». diff --git a/ua/documentation/faq/5/index.md b/ua/documentation/faq/5/index.md new file mode 100644 index 0000000000..290e90239f --- /dev/null +++ b/ua/documentation/faq/5/index.md @@ -0,0 +1,238 @@ +--- +layout: page +title: "Офіційний FAQ Ruby" +lang: ua + +header: | +
+ Зміст + | + 1 + | + 2 + | + 3 + | + 4 + | + 5 + | + 6 + | + 7 + | + 8 + | + 9 + | + 10 + | + 11 +
+

Офіційний FAQ Ruby

+ +--- + +{% include faq-notice.md %} + +## Ітератори + +### Що таке ітератор? + +Ітератор — це метод, який приймає блок або об’єкт `Proc`. У вихідному +файлі блок розташовується одразу після виклику методу. Ітератори +використовуються для створення користувацьких керувальних структур — +особливо циклів. + +Розгляньмо приклад, щоб побачити, як це працює. Ітератори часто +використовуються для повторення тієї самої дії над кожним елементом +колекції, наприклад так: + +~~~ +data = [1, 2, 3] +data.each do |i| + puts i +end +~~~ + +Виведе: + +~~~ +1 +2 +3 +~~~ + +Методу `each` масиву `data` передається блок `do ... end`, і він +виконується багато разів. При кожному виклику блоку передається +черговий елемент масиву. + +Ви можете визначати блоки за допомогою `{ ... }` замість `do ... end`. + +~~~ +data = [1, 2, 3] +data.each { |i| + puts i +} +~~~ + +Виведе: + +~~~ +1 +2 +3 +~~~ + +Цей код має те саме значення, що й попередній приклад. Однак у деяких +випадках питання пріоритетів робить `do ... end` і `{ ... }` різними. + +~~~ +foobar a, b do ... end # foobar is the iterator. +foobar a, b { ... } # b is the iterator. +~~~ + +Це тому, що `{ ... }` прив’язується до попереднього виразу сильніше, +ніж блок `do ... end`. Перший приклад еквівалентний +`foobar(a, b) do ... end`, тоді як другий — `foobar(a, b { ... })`. + +### Як передати блок до ітератора? + +Просто розмістіть блок після виклику ітератора. Ви також можете +передати об’єкт `Proc`, додавши `&` перед іменем змінної або константи, +що посилається на `Proc`. + +### Як використовується блок в ітераторі? + +{% include warnings/faq-out-of-date.html %} + +Є три способи виконати блок з методу-ітератора: +(1) керувальна структура `yield`; (2) виклик аргументу `Proc` +(створеного з блоку) через `call`; (3) використання `Proc.new`, +після якого слідує виклик. + +Оператор `yield` викликає блок, за потреби передаючи один або більше +аргументів. + +~~~ +def my_iterator + yield 1, 2 +end + +my_iterator {|a, b| puts a, b } +~~~ + +Виведе: + +~~~ +1 +2 +~~~ + +Якщо визначення методу має аргумент блоку (останній формальний параметр +має префікс амперсанда `&`), він отримає приєднаний блок, перетворений +на об’єкт `Proc`. Його можна викликати через `prc.call(args)`. + +~~~ +def my_iterator(&b) + b.call(1, 2) +end + +my_iterator {|a, b| puts a, b } +~~~ + +Виведе: + +~~~ +1 +2 +~~~ + +`Proc.new` (або еквівалентні виклики `proc` чи `lambda`), коли +використовується у визначенні ітератора, бере блок, переданий у метод, +і створює з нього процедурний об’єкт. +(`proc` і `lambda` фактично є синонімами.) + +_[Потрібне оновлення: `lambda` поводиться трохи інакше і +генерує попередження `tried to create Proc object without a block`.]_ + +~~~ +def my_iterator + Proc.new.call(3, 4) + proc.call(5, 6) + lambda.call(7, 8) +end + +my_iterator {|a, b| puts a, b } +~~~ + +Виведе: + +~~~ +3 +4 +5 +6 +7 +8 +~~~ + +Можливо, несподівано, `Proc.new` і подібні методи жодним чином не +“споживають” блок, прикріплений до методу — кожен виклик `Proc.new` +створює новий процедурний об’єкт з того самого блоку. + +Ви можете дізнатися, чи є блок, пов’язаний із методом, викликавши +`block_given?`. + +### Що робить `Proc.new` без блоку? + +`Proc.new` без блоку не може створити процедурний об’єкт і викликає помилку. +Проте у визначенні методу `Proc.new` без блоку припускає наявність блоку +на момент виклику методу, тож помилки не буде. + +### Як запускати ітератори паралельно? + +Ось адаптація рішення від Matz, із +[\[ruby-talk:5252\]][ruby-talk:5252], що використовує потоки: + +~~~ +require "thread" + +def combine(*iterators) + queues = [] + threads = [] + + iterators.each do |it| + queue = SizedQueue.new(1) + th = Thread.new(it, queue) do |i, q| + send(i) {|x| q << x } + end + queues << queue + threads << th + end + + loop do + ary = [] + queues.each {|q| ary << q.pop } + yield ary + + iterators.size.times do |i| + return if !threads[i].status && queues[i].empty? + end + end +end + +def it1 + yield 1; yield 2; yield 3 +end + +def it2 + yield 4; yield 5; yield 6 +end + +combine(:it1, :it2) do |x| + # x is [1, 4], then [2, 5], then [3, 6] +end +~~~ + +[ruby-talk:5252]: https://blade.ruby-lang.org/ruby-talk/5252 diff --git a/ua/documentation/faq/6/index.md b/ua/documentation/faq/6/index.md new file mode 100644 index 0000000000..47233a11e0 --- /dev/null +++ b/ua/documentation/faq/6/index.md @@ -0,0 +1,294 @@ +--- +layout: page +title: "Офіційний FAQ Ruby" +lang: ua + +header: | +
+ Зміст + | + 1 + | + 2 + | + 3 + | + 4 + | + 5 + | + 6 + | + 7 + | + 8 + | + 9 + | + 10 + | + 11 +
+

Офіційний FAQ Ruby

+ +--- + +{% include faq-notice.md %} + +## Синтаксис + +### У чому різниця між безпосереднім значенням і посиланням? +{: #immediate} + +{% include warnings/faq-out-of-date.html %} + +`Fixnum`, `true`, `nil` і `false` реалізовані як безпосередні значення. +Для безпосередніх значень змінні зберігають самі об’єкти, а не +посилання на них. + +Для таких об’єктів не можна визначати singleton-методи. Два `Fixnum` +з однаковим значенням завжди представляють той самий екземпляр об’єкта, +тому (наприклад) змінні екземпляра для `Fixnum` зі значенням `1` +спільні для всіх `1` у системі. Це робить неможливим визначення +singleton-методу лише для одного з них. + +### У чому різниця між `nil` і `false`? + +Спочатку про схожість: `nil` і `false` — єдині два об’єкти, +які в булевому контексті оцінюються як `false`. +(Інакше кажучи: це єдині «falsy»-значення, усі інші +об’єкти — «truthy».) + +Однак `nil` і `false` — це екземпляри різних класів +(`NilClass` і `FalseClass`) і в інших місцях поводяться по-різному. + +Ми рекомендуємо, щоб предикатні методи (ті, чия назва закінчується знаком +питання) повертали `true` або `false`. Інші методи, яким потрібно +позначити невдачу, мають повертати `nil`. + +### Чому порожній рядок не є `false`? + +П: Порожній рядок (`""`) повертає `true` в умовному виразі! +У Perl це `false`. + +В: Але Ruby — не Perl ;-). Все дуже просто: у Ruby лише `nil` +і `false` є хибними в умовних контекстах. + +Можна використати `empty?`, порівняти рядок із `""` або порівняти його +`size` чи `length` із `0`, щоб дізнатися, чи рядок порожній. + +### Що означає `:name`? + +Двокрапка перед іменем створює об’єкт Symbol, який однозначно відповідає +ідентифікатору. Протягом виконання програми для певного імені або рядка +буде створено той самий об’єкт Symbol. Символи також можна створити +за допомогою `"name".intern` або `"name".to_sym`. + +Об’єкти Symbol можуть представляти ідентифікатори методів, змінних тощо. +Деякі методи, такі як `define_method`, `method_missing` або `trace_var`, +потребують символ. Інші методи, наприклад `attr_accessor`, `send` +або `autoload`, також приймають рядок. + +Оскільки вони створюються лише один раз, символи часто використовують як +ключі хешів. Рядкові ключі хешів створювали б новий об’єкт для кожного +використання, спричиняючи певні витрати пам’яті. +Є навіть спеціальний синтаксис для ключів-символів: + +~~~ +person_1 = { :name => "John", :age => 42 } +person_2 = { name: "Jane", age: 24 } # alternate syntax +~~~ + +Символи також можна використовувати як значення переліків +або для присвоєння унікальних значень константам: + +~~~ +status = :open # :closed, ... + +NORTH = :NORTH +SOUTH = :SOUTH +~~~ + +### Як отримати значення символу? + +Щоб отримати значення змінної, що відповідає символу, можна використати +`symbol.to_s` або `"#{symbol}"`, щоб отримати ім’я змінної, а потім +виконати це через `eval` у відповідній області видимості й отримати +вміст змінної: + +~~~ +a = "This is the content of `a'" +b = eval("#{:a}") +a.object_id == b.object_id # => true +~~~ + +Також можна використати + +~~~ +b = binding.local_variable_get(:a) +~~~ + +Якщо ваш символ відповідає імені методу, можна використати `send`: + +~~~ +class Demo + def hello + "Hello, world" + end +end + +demo = Demo.new +demo.send(:hello) +~~~ + +Або можна використати `Object#method`, щоб повернути відповідний об’єкт +`Method`, який потім можна викликати: + +~~~ +m = demo.method(:hello) # => # +m.call # => "Hello, world" +~~~ + +### Чи є `loop` керувальною структурою? + +Хоча `loop` виглядає як керувальна структура, насправді це метод, +визначений у `Kernel`. Блок, що йде за ним, створює нову область +видимості для локальних змінних. + +### У Ruby немає циклу з перевіркою в кінці + +П: У Ruby немає конструкції `do { ... } while`, тож як реалізувати +цикли, що перевіряють умову наприкінці? + +Клеменс Гінце каже: можна використати поєднання `begin ... end` +та модифікаторів `while` або `until`, щоб досягти того самого ефекту: + +~~~ +i = 0 +begin + puts "i = #{i}" + i += 1 +end until i > 4 +~~~ + +Виведе: + +~~~ +i = 0 +i = 1 +i = 2 +i = 3 +i = 4 +~~~ + +### Чому не можна передати літерал хеша до методу: `p {}`? + +`{}` розбирається як блок, а не як конструктор `Hash`. Можна змусити +`{}` трактуватися як вираз, явно вказавши, що це параметр: `p({})`. + +### Не можу змусити `def pos=(val)` працювати! + +У мене є такий код, але я не можу використовувати метод `pos = 1`. + +~~~ +def pos=(val) + @pos = val + puts @pos +end +~~~ + +Методи з `=` наприкінці потрібно викликати з явним отримувачем +(без отримувача ви просто присвоюєте значення локальній змінній). +Викликайте його як `self.pos = 1`. + +### У чому різниця між `'\1'` і `'\\1'`? + +Вони мають те саме значення. У рядку в одинарних лапках перетворюються +лише `\'` і `\\`, інші комбінації залишаються незмінними. + +Проте в рядку в подвійних лапках `"\1"` — це байт `\001` +(вісімковий бітовий шаблон), тоді як `"\\1"` — це рядок із двох символів: +зворотний слеш і символ `"1"`. + +### У чому різниця між `..` і `...`? + +`..` включає праву межу діапазону, `...` — ні: + +~~~ +(5..8).to_a # => [5, 6, 7, 8] +(5...8).to_a # => [5, 6, 7] +~~~ + +### У чому різниця між `or` і `||`? + +П: `p(nil || "Hello")` друкує `"Hello"`, тоді як `p(nil or "Hello")` +дає синтаксичну помилку. Чому? + +В: `or` має дуже низький пріоритет, `p( (nil or "Hello") )` спрацює. + +Пріоритет `or`, наприклад, також нижчий, ніж у `=`, +тоді як `||` має вищий пріоритет: + +~~~ +foo = nil || "Hello" # parsed as: foo = (nil || "Hello") +foo # => "Hello" + +# but perhaps surprisingly: + +foo = nil or "Hello" # parsed as: (foo = nil) or "Hello" +foo # => nil +~~~ + +`or` (і так само `and`) найкраще використовувати **не** для поєднання +булевих виразів, а для керування потоком виконання, наприклад + +~~~ +do_something or raise "some error!" +~~~ + +де `do_something` повертає `false` або `nil`, коли стається помилка. + +### Чи є в Ruby вказівники на функції? + +Об’єкт `Proc`, створений `Proc.new`, `proc` або `lambda`, можна зберегти +в змінній, тож така змінна може вважатися вказівником на функцію. Також +можна отримати посилання на методи конкретного екземпляра об’єкта +за допомогою `object.method`. + +### У чому різниця між `load` і `require`? + +`load` завантажує і виконує програму Ruby (`*.rb`). + +`require` також завантажує програми Ruby, але ще й бінарні модулі +розширень Ruby (спільні бібліотеки або DLL). Крім того, `require` +гарантує, що один і той самий компонент не буде завантажено більше +одного разу. + +### Чи є в Ruby обробка винятків? + +Ruby підтримує гнучку схему обробки винятків: + +~~~ +begin + statements which may raise exceptions +rescue [exception class names] + statements when an exception occurred +rescue [exception class names] + statements when an exception occurred +ensure + statements that will always run +end +~~~ + +Якщо в блоці `begin` виникає виняток, виконується `rescue` із +відповідною назвою винятку. Блок `ensure` виконується незалежно від того, +чи стався виняток. Частини `rescue` та `ensure` можна опустити. + +Якщо для `rescue` не вказано клас винятку, мається на увазі +`StandardError`, і перехоплюються винятки, що перебувають у відношенні +`is_a?` до `StandardError`. + +Цей вираз повертає значення блоку `begin`. + +Останній виняток доступний через глобальну змінну `$!` +(і тому його тип можна визначити за допомогою `$!.type`). diff --git a/ua/documentation/faq/7/index.md b/ua/documentation/faq/7/index.md new file mode 100644 index 0000000000..c035ebbb98 --- /dev/null +++ b/ua/documentation/faq/7/index.md @@ -0,0 +1,445 @@ +--- +layout: page +title: "Офіційний FAQ Ruby" +lang: ua + +header: | +
+ Зміст + | + 1 + | + 2 + | + 3 + | + 4 + | + 5 + | + 6 + | + 7 + | + 8 + | + 9 + | + 10 + | + 11 +
+

Офіційний FAQ Ruby

+ +--- + +{% include faq-notice.md %} + +## Методи + +### Як Ruby вибирає, який метод викликати? + +Ruby динамічно прив’язує всі повідомлення до методів. Спершу він шукає +singleton-методи в отримувачі, потім методи, визначені у власному класі +отримувача, і нарешті методи, визначені в суперкласах отримувача +(включно з будь-якими модулями, які могли бути домішані). Порядок пошуку +можна побачити, вивівши `ClassName.ancestors`, який показує класи-предки +та модулі `ClassName`. + +Якщо після пошуку серед альтернатив відповідний метод не знайдено, +Ruby намагається викликати метод `method_missing`, повторюючи ту саму +процедуру пошуку для нього. Це дає змогу обробляти повідомлення +до невідомих методів і часто використовується для надання динамічних +інтерфейсів класам. + +~~~ +module Emphasizable + def emphasize + "**#{self}**" + end +end + +class String + include Emphasizable +end + +String.ancestors + # => [String, Emphasizable, Comparable, Object, Kernel, BasicObject] + +"Wow!".emphasize # => "**Wow!**" +~~~ + +Коли під час пошуку методу `emphasize` його не знаходять у класі `String`, +Ruby далі шукає в модулі `Emphasizable`. + +Щоб перевизначити метод, який уже існує в класі отримувача, +наприклад `String#capitalize`, потрібно вставити модуль у ланцюжок +предків перед цим класом, використавши `prepend`: + +~~~ +module PrettyCapitalize + def capitalize + "**#{super}**" + end +end + +class String + prepend PrettyCapitalize +end + +String.ancestors + # => [PrettyCapitalize, String, Comparable, Object, Kernel, BasicObject] + +"hello".capitalize # => "**Hello**" +~~~ + +### Чи є `+`, `-`, `*`, ... операторами? + +`+`, `-` та подібні — це не оператори, а виклики методів. +Тому їх можна перевантажувати новими визначеннями. + +~~~ +class MyString < String + def -(other) + self[0...other.size] # self truncated to other's size + end +end +~~~ + +Однак наведені нижче — вбудовані керувальні структури, а не методи, +тому їх не можна перевизначити: + +~~~ +=, .., ..., not, ||, &&, and, or, :: +~~~ + +Щоб перевантажити або визначити унарні оператори `+` і `-`, +потрібно використовувати `+@` і `-@` як назви методів. + +Оператор `=` використовується для визначення методу, що встановлює +атрибут об’єкта: + +~~~ +class Test + def attribute=(val) + @attribute = val + end +end + +t = Test.new +t.attribute = 1 +~~~ + +Якщо визначені оператори на кшталт `+` і `-`, Ruby автоматично обробляє +форми самоприсвоєння (`+=`, `-=` тощо). + +### Де `++` і `--`? + +У Ruby немає операторів автоінкременту та автодекременту. +Замість них можна використати `+= 1` і `-= 1`. + +### Що таке singleton-метод? +{: #singleton-method} + +Singleton-метод — це метод екземпляра, пов’язаний з одним конкретним +об’єктом. + +Singleton-метод створюють, включаючи об’єкт у визначення: + +~~~ +class Foo; end + +foo = Foo.new +bar = Foo.new + +def foo.hello + puts "Hello" +end + +foo.hello +bar.hello +~~~ + +Виведе: + +~~~ +Hello +prog.rb:11:in `
': undefined method `hello' for # (NoMethodError) +~~~ + +Singleton-методи корисні, коли потрібно додати метод до об’єкта, а +створення нового підкласу недоцільне. + +### Усі ці об’єкти — добре, але чи має Ruby прості функції? + +І так, і ні. У Ruby є методи, які виглядають як функції в мовах на кшталт +C або Perl: + +~~~ +def hello(name) + puts "Hello, #{name}!" +end + +hello("World") +~~~ + +Виведе: + +~~~ +Hello, World! +~~~ + +Однак насправді це виклики методів без явного отримувача. +У цьому випадку Ruby вважає, що отримувач — це `self`. + +Отже, `hello` схожа на функцію, але насправді це метод, що належить класу +`Object`, і надсилається як повідомлення прихованому отримувачу `self`. +Ruby — чисто об’єктно-орієнтована мова. + +Звісно, ви можете використовувати такі методи так, ніби це функції. + +### Звідки беруться всі ці методи, схожі на функції? + +Майже всі класи в Ruby походять від класу `Object`. Визначення класу +`Object` домішує методи, визначені в модулі `Kernel`. +Тому ці методи доступні в кожному об’єкті системи. + +Навіть якщо ви пишете просту програму Ruby без класів, ви фактично +працюєте всередині класу `Object`. + +### Чи можу я отримати доступ до змінних екземпляра об’єкта? + +Змінні екземпляра об’єкта (ті, що починаються з `@`) безпосередньо +недоступні поза об’єктом. Це забезпечує хорошу інкапсуляцію. +Проте Ruby спрощує визначення методів доступу до цих змінних екземпляра +так, щоб користувачі вашого класу могли поводитися з ними як з атрибутами. +Просто використайте один або кілька з `attr_reader`, `attr_writer` +чи `attr_accessor`. + +~~~ +class Person + attr_reader :name # read only + attr_accessor :wearing_a_hat # read/write + + def initialize(name) + @name = name + end +end + +p = Person.new("Dave") +p.name # => "Dave" +p.wearing_a_hat # => nil +p.wearing_a_hat = true +p.wearing_a_hat # => true +~~~ + +Ви також можете визначити власні методи доступу (наприклад, для валідації +або обробки похідних атрибутів). Метод читання — це просто метод без +параметрів, а метод присвоєння — це метод із назвою, що закінчується на +`=`, і який приймає один параметр. Хоча у визначенні методу між назвою +методу та `=` не може бути пробілу, під час виклику можна вставляти +пробіли, і це виглядатиме як звичайне присвоєння. Також можна +використовувати самоприсвоєння на кшталт `+=` і `-=`, якщо визначені +відповідні методи `+` або `-`. + +### У чому різниця між `private` і `protected`? + +Ключове слово видимості `private` робить метод викличним лише у +функціональній формі, без явного отримувача, і тому його отримувачем може +бути лише `self`. Приватний метод можна викликати лише в межах класу, +в якому він визначений, або в його підкласах. + +~~~ +class Test + def foo + 99 + end + + def test(other) + p foo + p other.foo + end +end + +t1 = Test.new +t2 = Test.new + +t1.test(t2) + +# Now make `foo' private + +class Test + private :foo +end + +t1.test(t2) +~~~ + +Виведе: + +~~~ +99 +99 +99 +prog.rb:8:in `test': private method `foo' called for # (NoMethodError) + from prog.rb:23:in `
' +~~~ + +Захищені методи також можна викликати лише всередині свого класу або +його підкласів, але їх можна викликати як у функціональній формі, +так і з отримувачем. Наприклад: + +~~~ +def <=>(other) + age <=> other.age +end +~~~ + +Код скомпілюється, якщо `age` — захищений метод, але не якщо він приватний. + +Ці можливості допомагають контролювати доступ до внутрішньої реалізації +вашого класу. + +### Як змінити видимість методу? + +Видимість методів змінюють за допомогою `private`, `protected` і `public`. +Якщо використовувати їх без параметрів під час визначення класу, вони +впливають на видимість наступних методів. Якщо використовувати з +параметрами, вони змінюють видимість названих методів. + +~~~ +class Foo + def test + puts "hello" + end + private :test +end + +foo = Foo.new +foo.test +~~~ + +Виведе: + +~~~ +prog.rb:9:in `
': private method `test' called for # (NoMethodError) +~~~ + +Зробити метод класу приватним можна за допомогою `private_class_method`. + +~~~ +class Foo + def self.test + puts "hello" + end + private_class_method :test +end + +Foo.test +~~~ + +Виведе: + +~~~ +prog.rb:8:in `
': private method `test' called for Foo:Class (NoMethodError) +~~~ + +Видимість за замовчуванням для методів, визначених у класі, — `public`. +Виняток — метод ініціалізації екземпляра `initialize`. + +Методи, визначені на верхньому рівні, також є `public` за замовчуванням. + +### Чи може ідентифікатор, що починається з великої літери, бути назвою методу? + +Так, може, але робити так не варто без потреби! Якщо Ruby бачить назву з +великої літери, за якою йде пробіл, він, ймовірно (залежно від контексту), +вважатиме її константою, а не назвою методу. Тож якщо ви використовуєте +імена методів з великої літери, завжди пам’ятайте ставити список +параметрів у дужках і розміщувати дужки відразу після імені методу без +пробілів. (Остання порада корисна в будь-якому разі!) + +### Виклик `super` спричиняє `ArgumentError`. + +Виклик `super` без параметрів у методі передає всі аргументи цього методу +методу з таким самим ім’ям у суперкласі. Якщо кількість аргументів у +початкового методу не збігається з кількістю у методу вищого рівня, +виникає `ArgumentError`. Щоб обійти це, просто викличте `super` і +передайте потрібну кількість аргументів. + +### Як викликати метод з таким самим ім’ям на два рівні вище? + +`super` викликає однойменний метод на один рівень вище. Якщо ви +перевантажуєте метод у більш віддаленому предку, використайте `alias`, +щоб надати йому нове ім’я до того, як замаскуєте його своїм визначенням +методу. Потім можна викликати його за цим псевдонімом. + +### Як викликати оригінальний вбудований метод після його перевизначення? + +Усередині визначення методу можна використати `super`. Також можна +застосувати `alias`, щоб надати йому іншу назву. Нарешті, можна викликати +оригінальний метод як singleton-метод `Kernel`. + +### Що таке деструктивний метод? +{: #destructive-method} + +Деструктивний метод — це метод, що змінює стан об’єкта. `String`, +`Array`, `Hash` та інші мають такі методи. Часто є дві версії методу: +одна зі звичайною назвою, інша — з тією ж назвою, але з `!` наприкінці. +Звичайна версія створює копію отримувача, вносить до неї зміни й +повертає копію. Версія з `!` модифікує отримувача на місці. + +Втім, слід пам’ятати, що є чимало деструктивних методів без `!`, зокрема +методи присвоєння (`name=`), присвоєння елементів масиву (`[]=`) і методи +на кшталт `Array.delete`. + +### Чому деструктивні методи можуть бути небезпечними? + +Пам’ятайте, що присвоєння в більшості випадків лише копіює посилання на +об’єкт, а передавання параметрів еквівалентне присвоєнню. Це означає, що +ви можете отримати кілька змінних, які посилаються на той самий об’єкт. +Якщо одна з них викликає деструктивний метод, зміниться об’єкт, на який +посилаються всі. + +~~~ +def foo(str) + str.sub!(/foo/, "baz") +end + +obj = "foo" +foo(obj) # => "baz" +obj # => "baz" +~~~ + +У цьому випадку змінюється фактичний аргумент. + +### Чи можу я повертати з методу кілька значень? + +Так і ні. + +~~~ +def m1 + return 1, 2, 3 +end + +def m2 + [1, 2, 3] +end + +m1 # => [1, 2, 3] +m2 # => [1, 2, 3] +~~~ + +Отже, повертається лише одна річ, але нею може бути довільно складний +об’єкт. У випадку масивів можна використати множинне присвоєння, щоб +отримати ефект кількох повернених значень. Наприклад: + +~~~ +def foo + [20, 4, 17] +end + +a, b, c = foo +a # => 20 +b # => 4 +c # => 17 +~~~ diff --git a/ua/documentation/faq/8/index.md b/ua/documentation/faq/8/index.md new file mode 100644 index 0000000000..5b959c65b7 --- /dev/null +++ b/ua/documentation/faq/8/index.md @@ -0,0 +1,375 @@ +--- +layout: page +title: "Офіційний FAQ Ruby" +lang: ua + +header: | +
+ Зміст + | + 1 + | + 2 + | + 3 + | + 4 + | + 5 + | + 6 + | + 7 + | + 8 + | + 9 + | + 10 + | + 11 +
+

Офіційний FAQ Ruby

+ +--- + +{% include faq-notice.md %} + +## Класи та модулі + +### Чи можна повторно визначати клас? + +Клас можна визначати повторно. Кожне визначення додається до +попереднього. Якщо метод перевизначено, попередній перевизначається +і втрачається. + +### Чи існують змінні класу? + +Так. Змінна з двома знаками `@` (`@@`) — це змінна класу, доступна як у +методах екземпляра, так і в методах класу. + +~~~ +class Entity + + @@instances = 0 + + def initialize + @@instances += 1 + @number = @@instances + end + + def who_am_i + "I'm #{@number} of #{@@instances}" + end + + def self.total + @@instances + end +end + +entities = Array.new(9) { Entity.new } + +entities[6].who_am_i # => "I'm 7 of 9" +Entity.total # => 9 +~~~ + +Однак, найімовірніше, варто використовувати _змінні екземпляра класу_. + +### Що таке змінна екземпляра класу? + +Ось приклад із попереднього розділу, переписаний із використанням змінної +екземпляра класу: + +~~~ +class Entity + + @instances = 0 + + class << self + attr_accessor :instances # provide class methods for reading/writing + end + + def initialize + self.class.instances += 1 + @number = self.class.instances + end + + def who_am_i + "I'm #{@number} of #{self.class.instances}" + end + + def self.total + @instances + end +end + +entities = Array.new(9) { Entity.new } + +entities[6].who_am_i # => "I'm 7 of 9" +Entity.instances # => 9 +Entity.total # => 9 +~~~ + +Тут `@instances` — це _змінна екземпляра_ класу. Вона не належить +екземпляру класу `Entity`, а належить об’єкту класу `Entity`, який є +екземпляром класу `Class`. + +Змінні екземпляра класу безпосередньо доступні лише в методах класу. + +### У чому різниця між змінними класу та змінними екземпляра класу? + +Головна різниця — у поведінці щодо наслідування: змінні класу спільні для +класу та всіх його підкласів, тоді як змінні екземпляра класу належать +лише одному конкретному класу. + +Змінні класу певною мірою можна розглядати як глобальні змінні в контексті +ієрархії наслідування, з усіма проблемами, притаманними глобальним змінним. +Наприклад, змінна класу може (випадково) бути переприсвоєна будь-яким із +підкласів, що вплине на всі інші класи: + +~~~ +class Woof + + @@sound = "woof" + + def self.sound + @@sound + end +end + +Woof.sound # => "woof" + +class LoudWoof < Woof + @@sound = "WOOF" +end + +LoudWoof.sound # => "WOOF" +Woof.sound # => "WOOF" (!) +~~~ + +Або клас-предка можуть згодом повторно відкрити й змінити, що може мати +несподівані наслідки: + +~~~ +class Foo + + @@var = "foo" + + def self.var + @@var + end +end + +Foo.var # => "foo" (as expected) + +class Object + @@var = "object" +end + +Foo.var # => "object" (!) +~~~ + +Тож якщо ви точно не знаєте, що робите, і вам справді не потрібна така +поведінка, краще використовуйте змінні екземпляра класу. + +### Чи має Ruby методи класу? +{: #class-method} + +Singleton-метод об’єкта класу називається методом класу. +(Насправді метод класу визначається в метакласі, але це здебільшого +прозоро). Інакше кажучи, метод класу — це метод, отримувачем якого є клас. + +Зводиться все до того, що методи класу можна викликати без екземплярів +цього класу (об’єктів) як отримувача. + +Створімо singleton-метод класу `Foo`: + +~~~ +class Foo + def self.test + "this is foo" + end +end + +# It is invoked this way. + +Foo.test # => "this is foo" +~~~ + +У цьому прикладі `Foo.test` — метод класу. + +Методи екземпляра, визначені в класі `Class`, можна використовувати як +методи класу для кожного(!) класу. + +### Що таке singleton-клас? + +Singleton-клас — це анонімний клас, створений шляхом наслідування класу, +пов’язаного з конкретним об’єктом. Singleton-класи — ще один спосіб +розширити функціональність, пов’язану лише з одним об’єктом. + +Візьмімо скромний `Foo`: + +~~~ +class Foo + def hello + "hello" + end +end + +foo = Foo.new +foo.hello # => "hello" +~~~ + +А тепер уявімо, що потрібно додати функціональність рівня класу лише для +цього одного екземпляра: + +~~~ +class << foo + attr_accessor :name + + def hello + "hello, I'm #{name}" + end +end + +foo.name = "Tom" +foo.hello # => "hello, I'm Tom" +Foo.new.hello # => "hello" +~~~ + +Ми налаштували `foo`, не змінюючи характеристики `Foo`. + +### Що таке функція модуля? + +{% include warnings/faq-out-of-date.html %} + +Функція модуля — це приватний singleton-метод, визначений у модулі. +По суті, це схоже на [метод класу](#class-method), оскільки його можна +викликати у вигляді `Module.method`: + +~~~ +Math.sqrt(2) # => 1.414213562 +~~~ + +Проте, оскільки модулі можна домішувати до класів, функції модуля можна +використовувати і без префікса (саме так функції `Kernel` стають +доступними об’єктам): + +~~~ +include Math +sqrt(2) # => 1.414213562 +~~~ + +Використайте `module_function`, щоб зробити метод функцією модуля. + +~~~ +module Test + def thing + # ... + end + module_function :thing +end +~~~ + +### У чому різниця між класом і модулем? + +Модулі — це колекції методів і констант. Вони не можуть створювати +екземпляри. Класи можуть створювати екземпляри (об’єкти) і мають стан на +рівні екземпляра (змінні екземпляра). + +Модулі можна домішувати до класів і інших модулів. Константи й методи +домішаного модуля змішуються з власними константами й методами класу, +розширюючи його функціональність. Натомість класи не можна домішувати +ні до чого. + +Клас може успадковувати інший клас, але не модуль. + +Модуль не може наслідувати нічого. + +### Чи можна успадковувати модулі? + +Ні. Однак модуль можна включити до класу або іншого модуля, щоб імітувати +множинне наслідування (механізм mixin). + +Це не створює підклас (для цього потрібне наслідування), але створює +зв’язок `is_a?` між класом і модулем. + +### Наведіть приклад mixin + +Модуль `Comparable` надає різноманітні оператори порівняння +(`<`, `<=`, `==`, `>=`, `>`, `between?`). Він визначає їх через виклики +загального методу порівняння `<=>`. Однак сам `<=>` він не визначає. + +Припустімо, ви хочете створити клас, у якому порівняння ґрунтуються на +кількості ніг тварини: + +~~~ +class Animal + include Comparable + + attr_reader :legs + + def initialize(name, legs) + @name, @legs = name, legs + end + + def <=>(other) + legs <=> other.legs + end + + def inspect + @name + end +end + +c = Animal.new("cat", 4) +s = Animal.new("snake", 0) +p = Animal.new("parrot", 2) + +c < s # => false +s < c # => true +p >= s # => true +p.between?(s, c) # => true +[p, s, c].sort # => [snake, parrot, cat] +~~~ + +Все, що потрібно `Animal`, — визначити власну семантику оператора `<=>` +і домішати модуль `Comparable`. Методи `Comparable` стають +невідрізненними від методів `Animal`, і ваш клас раптово отримує нову +функціональність. А оскільки той самий модуль `Comparable` використовують +багато класів, ваш новий клас матиме узгоджену й добре зрозумілу семантику. + +### Чому існує два способи визначення методів класу? + +Метод класу можна визначити всередині визначення класу, а також на +верхньому рівні. + +~~~ +class Demo + def self.class_method + end +end + +def Demo.another_class_method +end +~~~ + +Між ними є лише одна суттєва різниця. У визначенні класу можна звертатися +до констант класу безпосередньо, оскільки вони в області видимості. +На верхньому рівні потрібно використовувати нотацію `Class::CONST`. + +### У чому різниця між `include` і `extend`? + +{% include warnings/faq-out-of-date.html %} + +`include` домішує модуль до класу або іншого модуля. Методи з цього +модуля викликаються у функціональному стилі (без отримувача). + +`extend` використовується, щоб включити модуль в об’єкт (екземпляр). +Методи модуля стають методами об’єкта. + +### Що означає `self`? + +`self` — це поточний отримувач виконання, об’єкт, до якого +застосовується метод. Виклик методу у функціональному стилі +передбачає `self` як отримувача. diff --git a/ua/documentation/faq/9/index.md b/ua/documentation/faq/9/index.md new file mode 100644 index 0000000000..f9f08a27a0 --- /dev/null +++ b/ua/documentation/faq/9/index.md @@ -0,0 +1,376 @@ +--- +layout: page +title: "Офіційний FAQ Ruby" +lang: ua + +header: | +
+ Зміст + | + 1 + | + 2 + | + 3 + | + 4 + | + 5 + | + 6 + | + 7 + | + 8 + | + 9 + | + 10 + | + 11 +
+

Офіційний FAQ Ruby

+ +--- + +{% include faq-notice.md %} + +## Вбудовані бібліотеки + +### Що повертає `instance_methods(false)`? + +Метод `instance_methods` повертає масив із назвами методів екземпляра +в класі або модулі-отримувачі. Це включає методи суперкласів і +домішаних модулів. + +`instance_methods(false)` або `instance_methods(nil)` повертає назви +лише тих методів, що визначені в отримувачі. + +### Як працюють зерна генератора випадкових чисел? + +Якщо `rand` викликається без попереднього виклику `srand`, генератор +псевдовипадкових чисел Ruby використовує довільне (майже випадкове) +зерно, яке, серед іншого, бере ентропію з джерела ОС, якщо воно доступне. +Послідовні запуски програми, що не використовує `srand`, генеруватимуть +різні послідовності випадкових чисел. + +Для тестування можна отримати передбачувану поведінку з однаковою +послідовністю чисел при кожному запуску, викликавши `srand` із +фіксованим зерном. + +### Я прочитав файл і змінив його, але файл на диску не змінився. + +~~~ +File.open("example", "r+").readlines.each_with_index do |line, i| + line[0,0] = "#{i+1}: " +end +~~~ + +Ця програма _не_ додає номери рядків до файла `example`. Вона читає +вміст файла і для кожного рядка додає номер на початку, але дані +ніколи не записуються назад. Наведений нижче код _дійсно_ оновлює +файл (хоча це дещо небезпечно, бо перед оновленням не створюється +резервна копія): + +~~~ +File.open("example", "r+") do |f| + lines = f.readlines + lines.each_with_index {|line, i| line[0,0] = "#{i+1}: " } + f.rewind + f.puts lines +end +~~~ + +### Як опрацювати файл і оновити його вміст? + +Використовуючи параметр командного рядка `-i` або вбудовану змінну `$-i`, +можна читати файл і замінювати його. + +Код із попереднього запитання, який додавав номери рядків до файла, +найкраще записати цим способом: + +~~~ +$ ruby -i -ne 'print "#$.: #$_"' example +~~~ + +Якщо потрібно зберегти оригінальний файл, використайте `-i.bak`, щоб +створити резервну копію. + +### Я записав файл, скопіював його, але кінець копії ніби втрачено. + +Цей код працюватиме неправильно: + +~~~ +require "fileutils" + +File.open("file", "w").puts "This is a file." +FileUtils.cp("file", "newfile") +~~~ + +Оскільки введення/виведення буферизується, `file` копіюється до того, як +його вміст записано на диск. `newfile`, імовірно, буде порожнім. Однак +коли програма завершується, буфери скидаються, і `file` має очікуваний +вміст. + +Проблеми не буде, якщо переконатися, що `file` закритий перед копіюванням: + +~~~ +require "fileutils" + +File.open("file", "w") {|f| f.puts "This is a file." } +FileUtils.cp("file", "newfile") +~~~ + +### Як отримати номер рядка в поточному вхідному файлі? + +Під час читання з файла Ruby збільшує лічильник рядків у глобальній +змінній `$.`. Це також доступно через атрибут `lineno` об’єкта `File`. + +Спеціальна константа `ARGF` — це об’єкт, схожий на файл, який можна +використовувати для читання всіх вхідних файлів, вказаних у командному +рядку (або стандартного вводу, якщо файлів немає). `ARGF` неявно +використовується в такому коді: + +~~~ +while gets + print $_ +end +~~~ + +У цьому випадку `$.` буде кумулятивною кількістю рядків, прочитаних +у всіх вхідних файлах. Щоб отримати номер рядка в поточному файлі, +використайте + +~~~ +ARGF.file.lineno +~~~ + +Також можна отримати назву поточного файла через `ARGF.file.path`. + +### Як використовувати `less` для показу виводу програми? + +Я спробував таке, але нічого не вивелося: + +~~~ +open("|less", "w").puts "abc" +~~~ + +Це тому, що програма завершується одразу, і `less` не встигає побачити те, +що ви йому записали, не кажучи вже про відображення. Переконайтеся, що +потік правильно закривається, і він чекатиме, доки завершиться `less`. + +~~~ +open("|less", "w") {|f| f.puts "abc" } +~~~ + +### Що відбувається з об’єктом `File`, на який більше ніхто не посилається? + +Об’єкт `File`, на який більше немає посилань, стає придатним для +збирання сміття. Файл буде закрито автоматично, коли об’єкт `File` буде +зібрано. + +### Мені не по собі, якщо я не закриваю файл. + +Є принаймні чотири добрі способи гарантувати, що файл буде закрито: + +~~~ +# (1) +f = File.open("file") +begin + f.each {|line| print line } +ensure + f.close +end + +# (2) +File.open("file") do |f| + f.each {|line| print line } +end + +# (3) +File.foreach("file") {|line| print line } + +# (4) +File.readlines("file").each {|line| print line } +~~~ + +### Як відсортувати файли за часом зміни? + +~~~ +Dir.glob("*").sort {|a, b| File.mtime(b) <=> File.mtime(a) } +~~~ + +Хоча це працює (повертає список у зворотному хронологічному порядку), +це не дуже ефективно, адже під час кожного порівняння отримує час +модифікації файлів з ОС. + +Більшої ефективності можна досягти ціною додаткової складності: + +~~~ +Dir.glob("*").map {|f| [File.mtime(f), f] }. + sort {|a, b| b[0] <=> a[0] }.map(&:last) +~~~ + +### Як порахувати частоту слів у файлі? + +~~~ +freq = Hash.new(0) +File.read("example").scan(/\w+/) {|word| freq[word] += 1 } +freq.keys.sort.each {|word| puts "#{word}: #{freq[word]}" } +~~~ + +Виведе: + +~~~ +and: 1 +is: 3 +line: 3 +one: 1 +this: 3 +three: 1 +two: 1 +~~~ + +### Як відсортувати рядки в алфавітному порядку? + +Якщо ви хочете, щоб рядки сортувалися як 'AAA', 'BBB', ..., 'ZZZ', +'aaa', 'bbb', то вбудоване порівняння працюватиме чудово. + +Якщо потрібно сортувати без урахування регістру, порівнюйте зведені до +нижнього регістру рядки в блоці сортування: + +~~~ +array = %w( z bB Bb bb Aa BB aA AA aa a A ) +array.sort {|a, b| a.downcase <=> b.downcase } + # => ["a", "A", "Aa", "aA", "AA", "aa", "bB", "Bb", "bb", "BB", "z"] +~~~ + +Якщо потрібно сортувати так, щоб 'A' і 'a' йшли поруч, але 'a' вважалася +більшою за 'A' (тобто 'Aa' після 'AA', але перед 'AB'), використайте: + +~~~ +array.sort {|a, b| (a.downcase <=> b.downcase).nonzero? || a <=> b } + # => ["A", "a", "AA", "Aa", "aA", "aa", "BB", "Bb", "bB", "bb", "z"] +~~~ + +### Як перетворити табуляції на пробіли? +{: #tab-expansion} + +Якщо `a` містить рядок, який потрібно розгорнути, можна використати один із: + +~~~ +1 while a.sub!(/(^[^\t]*)\t(\t*)/){$1+" "*(8-$1.size%8+8*$2.size)} +# or +1 while a.sub!(/\t(\t*)/){" "*(8-$~.begin(0)%8+8*$1.size)} +# or +a.gsub!(/([^\t]{8})|([^\t]*)\t/n){[$+].pack("A8")} +~~~ + +### Як екранувати зворотний слеш у регулярному виразі? + +`Regexp.quote('\\')` екранує зворотний слеш. + +Складніше, якщо ви використовуєте `sub` і `gsub`. Скажімо, ви пишете +`gsub(/\\/, '\\\\')`, сподіваючись замінити кожен зворотний слеш двома. +Другий аргумент перетворюється на `'\\'` під час синтаксичного +аналізу. Коли відбувається підстановка, механізм регулярних виразів +перетворює це на `'\'`, тож у підсумку кожен окремий зворотний слеш +замінюється іншим окремим зворотним слешем. Треба писати +`gsub(/\\/, '\\\\\\')`! + +Втім, з урахуванням того, що `\&` містить збіг, можна також написати +`gsub(/\\/, '\&\&')`. + +Якщо ви використовуєте блочну форму `gsub`, тобто +`gsub(/\\/) { '\\\\' }`, рядок для підстановки аналізується лише +один раз (під час синтаксичного проходу) і результат буде таким, як ви +й задумували. + +### У чому різниця між `sub` і `sub!`? + +У `sub` створюється копія отримувача, до неї застосовується заміна, +і вона повертається. + +У `sub!` отримувач змінюється і повертається, якщо знайдено збіг. +Інакше повертається `nil`. + +Методи на кшталт `sub!`, які змінюють стан отримувача, називаються +[деструктивними методами](../7/#destructive-method). +Зазвичай, якщо є два схожі методи і один із них деструктивний, +деструктивний має суфікс `!`. + +~~~ +def foo(str) + str.sub(/foo/, "baz") +end + +obj = "foo" +foo(obj) # => "baz" +obj # => "foo" + +def foo(str) + str.sub!(/foo/, "baz") +end + +foo(obj) # => "baz" +obj # => "baz" +~~~ + +### Де спрацьовує `\Z`? + +`\Z` збігається безпосередньо перед останнім `\n` (переведенням рядка), +якщо рядок закінчується на `\n`, інакше — в кінці рядка. + +### У чому різниця між `thread` і `fork`? + +{% include warnings/faq-out-of-date.html %} + +Потоки Ruby реалізовані всередині інтерпретатора, тоді як `fork` +викликає операційну систему для створення окремого підпроцесу. + +`thread` і `fork` мають такі характеристики: + +* `fork` повільний, `thread` — ні. +* `fork` не розділяє адресний простір пам’яті. +* `thread` не спричиняє thrashing. +* `thread` працює на DOS. +* Коли `thread` потрапляє у взаємне блокування, весь процес зупиняється. +* `fork` може скористатися паузами очікування завершення вводу/виводу, + `thread` — ні (принаймні без додаткової допомоги). + +Ймовірно, не варто змішувати `fork` і `thread`. + +### Як використовувати `Marshal`? + +`Marshal` використовується для збереження об’єкта у файлі або рядку з +подальшим відновленням. Об’єкти можна зберігати так: + +~~~ +Marshal.dump( obj [, io ] [, lev] ) +~~~ + +`io` — записуваний об’єкт `IO`, `lev` задає рівень, до якого об’єкти +дереференціюються і зберігаються. Якщо виконано `lev` рівнів +дереференціювання і все ще існують посилання на об’єкти, тоді `dump` +зберігає лише посилання, а не сам об’єкт. Це погано, бо такі об’єкти +неможливо відновити згодом. + +Якщо `io` пропущено, маршалізовані об’єкти повертаються у вигляді рядка. + +Повернути об’єкти можна так: + +~~~ +obj = Marshal.load(io) +# or +obj = Marshal.load(str) +~~~ + +де `io` — читаний об’єкт `IO`, а `str` — збережений рядок. + +### Як використовувати `trap`? + +`trap` пов’язує блоки коду із зовнішніми подіями (сигналами). + +~~~ +trap("PIPE") { raise "SIGPIPE" } +~~~ diff --git a/ua/documentation/faq/index.md b/ua/documentation/faq/index.md new file mode 100644 index 0000000000..201e3c8361 --- /dev/null +++ b/ua/documentation/faq/index.md @@ -0,0 +1,62 @@ +--- +layout: page +title: "Офіційний FAQ Ruby" +lang: ua + +header: | +
+ Зміст + | + 1 + | + 2 + | + 3 + | + 4 + | + 5 + | + 6 + | + 7 + | + 8 + | + 9 + | + 10 + | + 11 +
+

Офіційний FAQ Ruby

+ +--- + +Цей документ містить відповіді на поширені запитання про Ruby. +{: .summary} + +Цей FAQ базується на "[The Ruby Language FAQ][original-faq]", спочатку +скомпільованому Shugo Maeda та перекладеному англійською Kentaro Goto. +Дякуємо Zachary Scott і Marcus Stollsteimer за включення FAQ на сайт +і за суттєве оновлення змісту. + +Приклади коду в цьому документі виконано на Ruby 2.3. + +[original-faq]: http://ruby-doc.org/docs/ruby-doc-bundle/FAQ/FAQ.html + +{% include faq-notice.md %} + +## Зміст + +* [Загальні питання](1/) +* [Як Ruby порівнюється з...?](2/) +* [Встановлення Ruby](3/) +* [Змінні, константи та аргументи](4/) +* [Ітератори](5/) +* [Синтаксис](6/) +* [Методи](7/) +* [Класи та модулі](8/) +* [Вбудовані бібліотеки](9/) +* [Бібліотека розширень](10/) +* [Інші можливості](11/) diff --git a/ua/documentation/index.md b/ua/documentation/index.md new file mode 100644 index 0000000000..d89cf70257 --- /dev/null +++ b/ua/documentation/index.md @@ -0,0 +1,249 @@ +--- +layout: page +title: "Документація" +lang: ua +--- + +Посібники, туторіали та довідкові матеріали, які допоможуть дізнатися більше про Ruby +{: .summary} + +### Встановлення Ruby + +Хоча ви можете легко [спробувати Ruby у браузері][1], ви також можете +переглянути [посібник зі встановлення](installation/), щоб отримати +допомогу зі встановленням Ruby. + +### Офіційна документація Ruby + +[docs.ruby-lang.org/en][docs-rlo]: список документації для всіх версій Ruby, випущених після 2.1. + +[docs.ruby-lang.org/en/3.4][docs-rlo-3.4]: документація для Ruby 3.4. + +[docs.ruby-lang.org/en/master][docs-rlo-master]: документація для гілки master Ruby. + +[Посібник зі створення C-розширень][docs-rlo-extension]: поглиблений посібник зі створення C-розширень для Ruby. + +### Початок роботи + +[Try Ruby][1] +: Ви можете спробувати Ruby прямо у браузері. + +[Learn to Program][8] +: Невеликий чудовий туторіал від Chris Pine для новачків у програмуванні. + Якщо ви не вмієте програмувати, почніть тут. + +[Ruby за двадцять хвилин][rubyin20] +: Невеликий туторіал Ruby, який має зайняти не більше 20 хвилин. + +[The Odin Project][odin] +: Open source навчальна програма з full stack. + +[Exercism][exercism] +: 120 вправ з автоматичною перевіркою та персональним менторингом. + +[Codecademy][codecademy] +: Онлайн bootcamp з кодування з різними темами. + +### Посібники / Книги + +#### Початковий рівень + +[Programming Ruby 3.3][pickaxe] +: Класична праця про Ruby англійською мовою. Нещодавно оновлена до Ruby 3.3. + +[The Well-Grounded Rubyist][grounded] +: Туторіал, що починається з вашої першої програми на Ruby й веде аж до + складних тем, як-от reflection, threading і рекурсія. + +#### Середній рівень + +[Practical OOD in Ruby (POODR)][poodr] +: Історія програміста про те, як писати об’єктно-орієнтований код. + +#### Просунутий рівень + +[Metaprogramming][meta] +: Пояснює метапрограмування в простому, приземленому стилі. + +[Ruby Under a Microscope (RUM)][microscope] +: Ілюстрований путівник внутрішнім устроєм Ruby. + +### Документація спільноти + +Ці сайти з документацією підтримує спільнота Ruby. + +[RubyDoc.info][16] +: Єдиний вебсайт для довідкової документації про gem-и Ruby та Ruby-проєкти + на GitHub. + +[RubyAPI.org][rubyapi-org] +: Зручно знаходити та переглядати класи, модулі й методи Ruby. + +[ruby-doc.org][39] +: Онлайн документація API + +[DevDocs.io][40] +: Онлайн документація API + +[Ruby QuickRef][42] +: Швидка довідка Ruby + +[rubyreferences][43] +: Повний довідник мови + детальний changelog змін мови. + +### Керівництва зі стилю + +[rubystyle.guide][44] +: Керівництво зі стилю Ruby від RuboCop + +[RuboCop][45] +: Автоматизоване застосування їхнього керівництва зі стилю. + +[Shopify][46] +: Керівництво зі стилю Ruby від Shopify + +[GitLab][47] +: Керівництво зі стилю Ruby від Gitlab + +[Airbnb][48] +: Керівництво зі стилю Ruby від Airbnb + +[w3resource][49] +: Керівництво зі стилю Ruby від W3 + +# Інструменти + +[IRB][50] +: Інтерактивний Ruby Read-Eval-Print-Loop (REPL) + +[Pry][51] +: Альтернативний Ruby REPL + +[Rake][52] +: Утиліта збірки для Ruby на кшталт make. + +[RI][53] +: (Ruby Information) — утиліта командного рядка Ruby, що надає швидкий + і зручний доступ до документації Ruby. + +[RBS][54] +: Типові сигнатури для Ruby + +[TypeProf][55] +: Експериментальний інтерпретатор Ruby на рівні типів для тестування + та розуміння коду Ruby. + +[Steep][56] +: Статичний перевіряч типів для Ruby. + +### Редактори та IDE + +Для написання коду на Ruby можна використовувати стандартний редактор +вашої операційної системи. Проте для ефективнішого кодування варто +обирати редактор із базовою підтримкою Ruby (наприклад, підсвічуванням +синтаксису, переглядом файлів) або інтегроване середовище розробки +з розширеними можливостями (наприклад, автодоповнення, рефакторинг, +підтримка тестів). + +Ось список популярних редакторів, якими користуються Rubyists, поділений +за кривою навчання: + +* Дні + * [Sublime Text][37] (платний) + * [Visual Studio Code][vscode] + * [Zed][zed] +* Місяці + * [RubyMine][27] (платний) +* "Роки" (тобто ви роками будете вивчати нові речі про нього) + * [Emacs][20] із [Ruby mode][21] або [Enhanced Ruby mode][enh-ruby-mode] + * [Vim][25] із плагіном [vim-ruby][26] + * [NeoVim][neovim] + +Усі ці редактори підтримують Language Server Protocol (LSP), +або за замовчуванням, або через плагіни LSP. Shopify [ruby-lsp][ruby-lsp] +— один із найпопулярніших language server для Ruby і +[підтримує всі перелічені редактори][ruby-lsp-supported-editors]. + +### Старі матеріали / ресурси + +Ці посилання раніше були більш помітними, але давно не оновлювалися. + +[Ruby Koans][2] +: Koans ведуть вас шляхом просвітлення, щоб вивчити Ruby. Мета — + опанувати мову Ruby, її синтаксис, структуру та деякі типові функції + й бібліотеки. Ми також навчаємо культурі. + +[Ruby Essentials][7] +: Безкоштовна онлайн-книга, створена як стислий і простий посібник + для вивчення Ruby. + +[Why’s (Poignant) Guide to Ruby][5] +: Нетрадиційна, але цікава книга, що навчає Ruby через історії, гумор + та комікси. Спочатку створена *why the lucky stiff*, ця книга + залишається класикою для тих, хто вивчає Ruby. + +[Learn Ruby the Hard Way][38] +: Дуже хороший набір вправ із поясненнями, які ведуть вас від основ Ruby + до ООП і веброзробки. + +[Programming Ruby][9] +: Класична праця про Ruby англійською мовою, перше видання + [книги Pragmatic Programmers][10] доступне безкоштовно онлайн. + +[The Ruby Programming Wikibook][12] +: Безкоштовний онлайн-посібник з матеріалами для початкового та середнього + рівня плюс ґрунтовний довідник мови. + +[1]: https://try.ruby-lang.org/ +[2]: https://rubykoans.com/ +[5]: https://poignant.guide +[7]: https://www.techotopia.com/index.php/Ruby_Essentials +[8]: https://pine.fm/LearnToProgram/ +[9]: https://ruby-doc.com/docs/ProgrammingRuby/ +[10]: https://pragprog.com/titles/ruby5/programming-ruby-3-3-5th-edition/ +[12]: https://en.wikibooks.org/wiki/Ruby_programming_language +[16]: https://www.rubydoc.info/ +[20]: https://www.gnu.org/software/emacs/ +[21]: https://www.emacswiki.org/emacs/RubyMode +[25]: https://www.vim.org/ +[26]: https://github.com/vim-ruby/vim-ruby +[27]: https://www.jetbrains.com/ruby/ +[37]: https://www.sublimetext.com/ +[38]: https://learncodethehardway.org/ruby/ +[39]: https://ruby-doc.org/ +[40]: https://devdocs.io/ruby/ +[42]: https://www.zenspider.com/ruby/quickref.html +[43]: https://rubyreferences.github.io/ +[44]: https://rubystyle.guide/ +[45]: https://github.com/rubocop/ruby-style-guide +[46]: https://ruby-style-guide.shopify.dev/ +[47]: https://docs.gitlab.com/ee/development/backend/ruby_style_guide.html +[48]: https://github.com/airbnb/ruby +[49]: https://www.w3resource.com/ruby/ruby-style-guide.php +[50]: https://github.com/ruby/irb +[51]: https://github.com/pry/pry +[52]: https://github.com/ruby/rake +[53]: https://ruby.github.io/rdoc/RI_md.html +[54]: https://github.com/ruby/rbs +[55]: https://github.com/ruby/typeprof +[56]: https://github.com/soutaro/steep +[codecademy]: https://www.codecademy.com/learn/learn-ruby +[docs-rlo]: https://docs.ruby-lang.org/en +[docs-rlo-3.4]: https://docs.ruby-lang.org/en/3.4 +[docs-rlo-master]: https://docs.ruby-lang.org/en/master +[docs-rlo-extension]: https://docs.ruby-lang.org/en/master/extension_rdoc.html +[enh-ruby-mode]: https://github.com/zenspider/enhanced-ruby-mode/ +[exercism]: https://exercism.org/tracks/ruby +[grounded]: https://www.manning.com/books/the-well-grounded-rubyist-third-edition +[meta]: https://pragprog.com/titles/ppmetr2/metaprogramming-ruby-2/ +[microscope]: https://patshaughnessy.net/ruby-under-a-microscope +[neovim]: https://neovim.io/ +[odin]: https://www.theodinproject.com/paths/full-stack-ruby-on-rails/courses/ruby +[pickaxe]: https://pragprog.com/titles/ruby5/programming-ruby-3-3-5th-edition/ +[poodr]: https://www.poodr.com/ +[ruby-lsp]: https://github.com/Shopify/ruby-lsp +[ruby-lsp-supported-editors]: https://github.com/Shopify/ruby-lsp#editor-plugins +[rubyapi-org]: https://rubyapi.org/ +[rubyin20]: /ua/documentation/quickstart/ +[vscode]: https://code.visualstudio.com/ +[zed]: https://zed.dev/ diff --git a/ua/documentation/installation/index.md b/ua/documentation/installation/index.md new file mode 100644 index 0000000000..1b05486eae --- /dev/null +++ b/ua/documentation/installation/index.md @@ -0,0 +1,438 @@ +--- +layout: page +title: "Встановлення Ruby" +lang: ua +--- + +За допомогою пакетних менеджерів або сторонніх інструментів у вас є +багато варіантів для встановлення й керування Ruby. +{: .summary} + +Можливо, Ruby уже встановлений на вашому комп’ютері. Перевірте це у +[термінальному емуляторі][terminal], ввівши: + +{% highlight sh %} +ruby -v +{% endhighlight %} + +Має відобразитися інформація про встановлену версію Ruby. + +## Оберіть метод встановлення + +Є кілька способів встановити Ruby: + +* У UNIX-подібній ОС найпростіше використовувати **пакетний менеджер** + системи. Однак пакетна версія Ruby може бути не найновішою. +* **Інсталятори** можна використовувати для встановлення конкретної або + кількох версій Ruby. Також є інсталятор для Windows. +* **Менеджери** допомагають перемикатися між кількома версіями Ruby + у вашій системі. +* Зрештою, ви можете **зібрати Ruby з вихідного коду**. + +У Windows 10 ви також можете використовувати +[Windows Subsystem for Linux][wsl], щоб установити одну з підтримуваних +дистрибутивів Linux і застосувати будь-який із доступних методів +встановлення в цій системі. + +Ось доступні методи встановлення: + +* [Пакетні менеджери](#package-management-systems) + * [Debian, Ubuntu](#apt) + * [CentOS, Fedora, RHEL](#yum) + * [Snap](#snap) + * [Gentoo](#portage) + * [Arch Linux](#pacman) + * [macOS](#homebrew) + * [FreeBSD](#freebsd) + * [OpenBSD](#openbsd) + * [OpenIndiana](#openindiana) + * [Windows Package Manager](#winget) + * [Chocolatey package manager для Windows](#chocolatey) + * [Інші дистрибутиви](#other-systems) +* [Інсталятори](#installers) + * [ruby-build](#ruby-build) + * [ruby-install](#ruby-install) + * [RubyInstaller](#rubyinstaller) (Windows) + * [Ruby Stack](#rubystack) +* [Менеджери](#managers) + * [asdf-vm](#asdf-vm) + * [chruby](#chruby) + * [mise-en-place](#mise-en-place) + * [rbenv](#rbenv) + * [rbenv для Windows](#rbenv-for-windows) + * [RVM](#rvm) + * [uru](#uru) +* [Збирання з вихідного коду](#building-from-source) + + +## Пакетні менеджери +{: #package-management-systems} + +Якщо ви не можете компілювати Ruby самостійно і не хочете використовувати +сторонні інструменти, скористайтеся пакетним менеджером вашої системи +для встановлення Ruby. + +Деякі члени спільноти Ruby вважають, що пакетних менеджерів для встановлення +Ruby слід уникати й натомість використовувати спеціалізовані інструменти. + +Можливо, основні пакетні менеджери встановлять старіші версії Ruby замість +найновішого релізу. Щоб використовувати найновіший реліз, перевірте, що +назва пакета відповідає номеру версії. Або використовуйте спеціалізований +[інсталятор][installers]. + + +### apt (Debian або Ubuntu) +{: #apt} + +Debian GNU/Linux і Ubuntu використовують пакетний менеджер apt. Ви можете +скористатися ним так: + +{% highlight sh %} +$ sudo apt-get install ruby-full +{% endhighlight %} + + +### yum (CentOS, Fedora або RHEL) +{: #yum} + +CentOS, Fedora і RHEL використовують пакетний менеджер yum. +Ви можете скористатися ним так: + +{% highlight sh %} +$ sudo yum install ruby +{% endhighlight %} + +Встановлена версія зазвичай є найновішою версією Ruby, доступною на момент +випуску відповідної версії дистрибутива. + + +### snap (Ubuntu або інші дистрибутиви Linux) +{: #snap} + +Snap — пакетний менеджер, розроблений компанією Canonical. +Він доступний «з коробки» в Ubuntu, але також працює у багатьох +інших дистрибутивах Linux. +Використовуйте так: + +{% highlight sh %} +$ sudo snap install ruby --classic +{% endhighlight %} + +Ми маємо кілька каналів для кожної молодшої серії Ruby. +Наприклад, ці команди перемикаються на Ruby 2.3: + +{% highlight sh %} +$ sudo snap switch ruby --channel=2.3/stable +$ sudo snap refresh +{% endhighlight %} + + +### portage (Gentoo) +{: #portage} + +Gentoo використовує пакетний менеджер portage. + +{% highlight sh %} +$ sudo emerge dev-lang/ruby +{% endhighlight %} + +Щоб встановити конкретну версію, встановіть `RUBY_TARGETS` у вашому `make.conf`. +Дивіться [сайт Gentoo Ruby Project][gentoo-ruby] для деталей. + + +### pacman (Arch Linux) +{: #pacman} + +Arch Linux використовує пакетний менеджер pacman. +Щоб отримати Ruby, виконайте: + +{% highlight sh %} +$ sudo pacman -S ruby +{% endhighlight %} + +Це має встановити останню стабільну версію Ruby. + + +### Homebrew (macOS) +{: #homebrew} + +Версії Ruby 2.0 і вище включені за замовчуванням у релізи macOS +принаймні з El Capitan (10.11). + +[Homebrew][homebrew] — поширений пакетний менеджер у macOS. +Встановити Ruby через Homebrew легко: + +{% highlight sh %} +$ brew install ruby +{% endhighlight %} + +Це має встановити останню версію Ruby. + + +### FreeBSD +{: #freebsd} + +FreeBSD пропонує як попередньо зібрані, так і вихідні способи встановлення Ruby. +Попередньо зібрані пакунки можна встановити через інструмент pkg: + +{% highlight sh %} +$ pkg install ruby +{% endhighlight %} + +Вихідний спосіб встановлення доступний через +[колекцію Ports][freebsd-ports-collection]. Це корисно, якщо ви хочете +налаштувати параметри збірки. + +Детальніше про Ruby та екосистему на FreeBSD — на сайті +[FreeBSD Ruby Project][freebsd-ruby]. + + +### OpenBSD +{: #openbsd} + +OpenBSD, а також його дистрибутив adJ мають пакети для трьох основних +версій Ruby. Наступна команда дозволяє переглянути доступні версії та +встановити одну з них: + +{% highlight sh %} +$ doas pkg_add ruby +{% endhighlight %} + +Ви можете встановлювати кілька основних версій поруч, оскільки їхні +бінарні файли мають різні назви (наприклад, `ruby27`, `ruby26`). + +Гілка `HEAD` колекції портів OpenBSD може містити найсвіжішу версію Ruby +для цієї платформи через кілька днів після релізу; дивіться +[каталог lang/ruby у найсвіжішій колекції портів][openbsd-current-ruby-ports]. + + +### Ruby на OpenIndiana +{: #openindiana} + +Щоб встановити Ruby на [OpenIndiana][openindiana], використовуйте клієнт +Image Packaging System (IPS). +Він встановить бінарні файли Ruby і RubyGems безпосередньо з репозиторіїв +OpenIndiana. Це просто: + +{% highlight sh %} +$ pkg install runtime/ruby +{% endhighlight %} + +Проте сторонні інструменти можуть бути хорошим способом отримати +найновішу версію Ruby. + +### Windows Package Manager +{: #winget} + +У Windows можна використовувати +[Windows Package Manager CLI](https://github.com/microsoft/winget-cli) +для встановлення Ruby: + +{% highlight ps1 %} +> winget install RubyInstallerTeam.Ruby.{MAJOR}.{MINOR} +# Example +> winget install RubyInstallerTeam.Ruby.3.2 +# To see all versions available +> winget search RubyInstallerTeam.Ruby +# Note: if you are installing ruby for projects, you may want to install RubyWithDevKit +> winget install RubyInstallerTeam.RubyWithDevKit.3.2 +{% endhighlight %} + +### Chocolatey package manager для Windows +{: #chocolatey} + +У Windows також можна використовувати +[Chocolatey Package Manager](https://chocolatey.org/install) +для встановлення Ruby: + +{% highlight sh %} +> choco install ruby +{% endhighlight %} + +Він повторно використає наявний `msys2` або встановить власний для +повного середовища розробки Ruby. + +### Інші дистрибутиви +{: #other-systems} + +В інших системах ви можете знайти Ruby у репозиторії пакетів вашого +дистрибутива Linux. Альтернативно ви можете використати +[сторонній інсталятор][installers]. + + +## Інсталятори +{: #installers} + +Якщо версія Ruby, яку надає ваша система або пакетний менеджер, застаріла, +новішу можна встановити за допомогою стороннього інсталятора. + +Деякі інсталятори дозволяють встановлювати кілька версій на одній системі; +пов’язані менеджери допомагають перемикатися між різними Ruby. + +Якщо ви плануєте використовувати [RVM](#rvm) як менеджер версій, окремий +інсталятор не потрібен — він має власний. + + +### ruby-build +{: #ruby-build} + +[ruby-build][ruby-build] — плагін для [rbenv](#rbenv), який дозволяє +компілювати та встановлювати різні версії Ruby. ruby-build також може +використовуватися як окрема програма без rbenv. Він доступний для macOS, +Linux та інших UNIX-подібних ОС. + + +### ruby-install +{: #ruby-install} + +[ruby-install][ruby-install] дозволяє компілювати та встановлювати різні +версії Ruby у довільні каталоги. [chruby](#chruby) — допоміжний інструмент +для перемикання між версіями Ruby. Доступний для macOS, Linux та інших +UNIX-подібних ОС. + + +### RubyInstaller +{: #rubyinstaller} + +У Windows [RubyInstaller][rubyinstaller] надає все необхідне для +налаштування повного середовища розробки Ruby. + +Просто завантажте його, запустіть і готово! + + +### Ruby Stack +{: #rubystack} + +Якщо ви встановлюєте Ruby для використання Ruby on Rails, +можете скористатися таким інсталятором: + +* [Bitnami Ruby Stack][rubystack] надає повне середовище розробки для Rails. + Підтримує macOS, Linux, Windows, віртуальні машини та образи для хмари. + + +## Менеджери +{: #managers} + +Багато Rubyists використовують менеджери Ruby для керування кількома +версіями Ruby. Вони дозволяють легко або навіть автоматично перемикатися +між версіями Ruby залежно від проєкту, а також мають інші переваги, але +офіційно не підтримуються. Втім, підтримку можна знайти у відповідних +спільнотах. + + +### asdf-vm +{: #asdf-vm} + +[asdf-vm][asdf-vm] — розширюваний менеджер версій, який може керувати +версіями runtime кількох мов на рівні проєкту. Вам знадобиться плагін +[asdf-ruby][asdf-ruby] (який, своєю чергою, використовує [ruby-build](#ruby-build)) +для встановлення Ruby. + + +### chruby +{: #chruby} + +[chruby][chruby] дозволяє перемикатися між кількома Ruby. Він може +керувати Ruby, встановленими через [ruby-install](#ruby-install), або +збірками з вихідного коду. + + +### mise-en-place +{: #mise-en-place} + +[mise-en-place][mise-en-place] дозволяє перемикатися між кількома Ruby без +потреби в додаткових інструментах. Він автоматично керує встановленнями й +містить [gem backend](https://mise.jdx.dev/dev-tools/backends/gem.html) +для керування версіями CLI, написаних на Ruby. Підтримує UNIX-подібні та +Windows ОС. + + +### rbenv +{: #rbenv} + +[rbenv][rbenv] дозволяє керувати кількома встановленнями Ruby. За +замовчуванням він не встановлює Ruby, але його плагін [ruby-build](#ruby-build) +може. Обидва інструменти доступні для macOS, Linux та інших UNIX-подібних ОС. + + +### rbenv для Windows +{: #rbenv-for-windows} + +[rbenv for Windows][rbenv-for-windows] дозволяє встановлювати й керувати +кількома встановленнями Ruby у Windows. Він написаний на PowerShell, що +надає нативний спосіб використання Ruby для користувачів Windows. +Крім того, інтерфейс командного рядка сумісний з [rbenv][rbenv] +на UNIX-подібних системах. + + +### RVM ("Ruby Version Manager") +{: #rvm} + +[RVM][rvm] дозволяє встановлювати й керувати кількома встановленнями +Ruby у вашій системі. Він також може керувати різними gemset-ами. +Доступний для macOS, Linux та інших UNIX-подібних ОС. + + +### RVM 4 Windows +{: #rvm-windows} + +[RVM 4 Windows][rvm-windows] дозволяє встановлювати й керувати кількома +встановленнями Ruby у Windows. Це клон оригінального RVM і підтримує +класичний командний рядок, а також PowerShell, надаючи той самий +інтерфейс командного рядка, що й оригінальний RVM. + + +### uru +{: #uru} + +[Uru][uru] — легкий кросплатформний інструмент командного рядка, що +допомагає використовувати кілька Ruby на macOS, Linux або Windows. + + +## Збирання з вихідного коду +{: #building-from-source} + +Звісно, Ruby можна встановити з вихідного коду. +[Завантажте][download] та розпакуйте tarball, після чого виконайте: + +{% highlight sh %} +$ ./configure +$ make +$ sudo make install +{% endhighlight %} + +За замовчуванням Ruby буде встановлено у `/usr/local`. +Щоб змінити це, передайте опцію `--prefix=DIR` до скрипта `./configure`. + +Більше інформації про збирання з вихідного коду можна знайти в +[інструкціях збирання Ruby][building-ruby]. + +Втім, використання сторонніх інструментів або пакетних менеджерів може бути +кращою ідеєю, адже встановлений Ruby не буде керуватися жодними інструментами. + + +[rvm]: http://rvm.io/ +[rvm-windows]: https://github.com/magynhard/rvm-windows#readme +[rbenv]: https://github.com/rbenv/rbenv#readme +[rbenv-for-windows]: https://github.com/RubyMetric/rbenv-for-windows#readme +[ruby-build]: https://github.com/rbenv/ruby-build#readme +[ruby-install]: https://github.com/postmodern/ruby-install#readme +[chruby]: https://github.com/postmodern/chruby#readme +[uru]: https://bitbucket.org/jonforums/uru +[rubyinstaller]: https://rubyinstaller.org/ +[rubystack]: http://bitnami.com/stack/ruby/installer +[openindiana]: http://openindiana.org/ +[gentoo-ruby]: http://www.gentoo.org/proj/en/prog_lang/ruby/ +[freebsd-ruby]: https://wiki.freebsd.org/Ruby +[freebsd-ports-collection]: https://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/ports-using.html +[homebrew]: http://brew.sh/ +[terminal]: https://en.wikipedia.org/wiki/List_of_terminal_emulators +[download]: /ua/downloads/ +[installers]: /ua/documentation/installation/#installers +[building-ruby]: https://github.com/ruby/ruby/blob/master/doc/contributing/building_ruby.md +[wsl]: https://docs.microsoft.com/en-us/windows/wsl/about +[asdf-vm]: https://asdf-vm.com/ +[asdf-ruby]: https://github.com/asdf-vm/asdf-ruby +[mise-en-place]: https://mise.jdx.dev +[mise-en-place-ruby]: https://mise.jdx.dev/lang/ruby.html +[openbsd-current-ruby-ports]: https://cvsweb.openbsd.org/cgi-bin/cvsweb/ports/lang/ruby/?only_with_tag=HEAD diff --git a/ua/documentation/quickstart/2/index.md b/ua/documentation/quickstart/2/index.md new file mode 100644 index 0000000000..ee6ffa56d2 --- /dev/null +++ b/ua/documentation/quickstart/2/index.md @@ -0,0 +1,121 @@ +--- +layout: page +title: "Ruby за двадцять хвилин" +lang: ua + +header: | +
+ 1 + | + 2 + | + 3 + | + 4 +
+

Ruby за двадцять хвилин

+ +--- + +Як сказати “Hello” багато разів, не втомлюючи пальці? Потрібно визначити метод! + +{% highlight irb %} +irb(main):010:0> def hi +irb(main):011:1> puts "Hello World!" +irb(main):012:1> end +=> :hi +{% endhighlight %} + +Код `def hi` починає визначення методу. Він повідомляє Ruby, що ми +визначаємо метод і що його назва — `hi`. Наступний рядок — це тіло методу, +той самий рядок, який ми бачили раніше: `puts "Hello World"`. +Нарешті, останній рядок `end` повідомляє Ruby, що ми завершили визначення +методу. Відповідь Ruby `=> :hi` говорить, що він зрозумів завершення. +Ця відповідь могла б бути `=> nil` для Ruby 2.0 і попередніх версій. +Але це тут неважливо, тож продовжимо. + +## Коротке, повторюване життя методу + +Тепер спробуймо викликати цей метод кілька разів: + +{% highlight irb %} +irb(main):013:0> hi +Hello World! +=> nil +irb(main):014:0> hi() +Hello World! +=> nil +{% endhighlight %} + +Що ж, це було просто. Викликати метод у Ruby так само легко, як просто +згадати його ім’я. Якщо метод не приймає параметрів — це все, що потрібно. +Можна додати порожні дужки, якщо хочете, але вони не обов’язкові. + +А що, якщо ми хочемо привітатися з однією людиною, а не з усім світом? +Просто перевизначте `hi`, щоб він приймав ім’я як параметр. + +{% highlight irb %} +irb(main):015:0> def hi(name) +irb(main):016:1> puts "Hello #{name}!" +irb(main):017:1> end +=> :hi +irb(main):018:0> hi("Matz") +Hello Matz! +=> nil +{% endhighlight %} + +Отже, працює… але давайте на хвилину розберемося, що тут відбувається. + +## Підстановки у рядку + +Що означає `#{name}`? Це спосіб Ruby вставити щось у рядок. +Те, що між фігурними дужками, перетворюється на рядок (якщо ще не є ним), +а потім підставляється у зовнішній рядок у цьому місці. Ви також можете +використати це, щоб правильно капіталізувати ім’я: + +{% highlight irb %} +irb(main):019:0> def hi(name = "World") +irb(main):020:1> puts "Hello #{name.capitalize}!" +irb(main):021:1> end +=> :hi +irb(main):022:0> hi "chris" +Hello Chris! +=> nil +irb(main):023:0> hi +Hello World! +=> nil +{% endhighlight %} + +Тут ще дві хитрощі. Перша — ми знову викликаємо метод без дужок. +Якщо очевидно, що ви робите, дужки необов’язкові. Друга — параметр +за замовчуванням `World`. Це означає: “Якщо ім’я не передано, використовуй +значення за замовчуванням `"World"`”. + +## Перетворення на привітальника + +А що, якщо ми хочемо справжнього привітальника, який пам’ятатиме ваше +ім’я, вітатиме вас і завжди ставитиметься з повагою? Для цього можна +використати об’єкт. Створімо клас “Greeter”. + +{% highlight irb %} +irb(main):024:0> class Greeter +irb(main):025:1> def initialize(name = "World") +irb(main):026:2> @name = name +irb(main):027:2> end +irb(main):028:1> def say_hi +irb(main):029:2> puts "Hi #{@name}!" +irb(main):030:2> end +irb(main):031:1> def say_bye +irb(main):032:2> puts "Bye #{@name}, come back soon." +irb(main):033:2> end +irb(main):034:1> end +=> :say_bye +{% endhighlight %} + +Нове ключове слово тут — `class`. Воно визначає новий клас Greeter і +набір методів для цього класу. Зверніть увагу на `@name`. Це змінна +екземпляра, доступна для всіх методів класу. Як бачите, її використовують +`say_hi` і `say_bye`. + +Тож як запустити цей клас Greeter? +[Створімо об’єкт.](../3/) diff --git a/ua/documentation/quickstart/3/index.md b/ua/documentation/quickstart/3/index.md new file mode 100644 index 0000000000..cbd4a96f2d --- /dev/null +++ b/ua/documentation/quickstart/3/index.md @@ -0,0 +1,225 @@ +--- +layout: page +title: "Ruby за двадцять хвилин" +lang: ua + +header: | +
+ 1 + | + 2 + | + 3 + | + 4 +
+

Ruby за двадцять хвилин

+ +--- + +Тепер створімо об’єкт привітальника та використаємо його: + +{% highlight irb %} +irb(main):035:0> greeter = Greeter.new("Pat") +=> # +irb(main):036:0> greeter.say_hi +Hi Pat! +=> nil +irb(main):037:0> greeter.say_bye +Bye Pat, come back soon. +=> nil +{% endhighlight %} + +Після створення об’єкта `greeter` він запам’ятовує, що ім’я — Pat. Гм, +а що, якщо ми хочемо отримати ім’я безпосередньо? + +{% highlight irb %} +irb(main):038:0> greeter.@name +SyntaxError: (irb):38: syntax error, unexpected tIVAR, expecting '(' +{% endhighlight %} + +Ні, так не вийде. + +## Під «шкірою» об’єкта + +Змінні екземпляра приховані всередині об’єкта. Вони не надто приховані: +ви бачите їх, коли інспектуєте об’єкт, і є інші способи доступу до них, +але Ruby застосовує правильний об’єктно-орієнтований підхід — тримати дані +певною мірою прихованими. + +Отже, які методи існують для об’єктів Greeter? + +{% highlight irb %} +irb(main):039:0> Greeter.instance_methods +=> [:say_hi, :say_bye, :instance_of?, :public_send, + :instance_variable_get, :instance_variable_set, + :instance_variable_defined?, :remove_instance_variable, + :private_methods, :kind_of?, :instance_variables, :tap, + :is_a?, :extend, :define_singleton_method, :to_enum, + :enum_for, :<=>, :===, :=~, :!~, :eql?, :respond_to?, + :freeze, :inspect, :display, :send, :object_id, :to_s, + :method, :public_method, :singleton_method, :nil?, :hash, + :class, :singleton_class, :clone, :dup, :itself, :taint, + :tainted?, :untaint, :untrust, :trust, :untrusted?, :methods, + :protected_methods, :frozen?, :public_methods, :singleton_methods, + :!, :==, :!=, :__send__, :equal?, :instance_eval, :instance_exec, :__id__] +{% endhighlight %} + +Ого. Це багато методів. Ми визначили лише два. Що відбувається? +Насправді це **всі** методи об’єктів Greeter — повний список, включно +з методами, визначеними у класах-предках. Якщо ми хочемо побачити лише +методи, визначені саме для Greeter, можемо вказати, що не потрібно +включати предків, передавши параметр `false`. + +{% highlight irb %} +irb(main):040:0> Greeter.instance_methods(false) +=> [:say_hi, :say_bye] +{% endhighlight %} + +О, це вже краще. Тепер подивімося, на які методи реагує наш об’єкт greeter: + +{% highlight irb %} +irb(main):041:0> greeter.respond_to?("name") +=> false +irb(main):042:0> greeter.respond_to?("say_hi") +=> true +irb(main):043:0> greeter.respond_to?("to_s") +=> true +{% endhighlight %} + +Отже, він знає `say_hi` і `to_s` (тобто перетворення на рядок — метод, +визначений за замовчуванням для кожного об’єкта), але не знає `name`. + +## Зміна класів — ніколи не пізно + +А що, якщо ви хочете мати доступ до імені або змінювати його? Ruby +надає простий спосіб доступу до змінних об’єкта. + +{% highlight irb %} +irb(main):044:0> class Greeter +irb(main):045:1> attr_accessor :name +irb(main):046:1> end +=> [:name, :name=] +{% endhighlight %} + +У Ruby можна знову відкрити клас і змінити його. Зміни будуть доступні +для нових об’єктів і навіть для вже існуючих об’єктів цього класу. +Тож створімо новий об’єкт і пограємося з його властивістю `@name`. + +{% highlight irb %} +irb(main):047:0> greeter = Greeter.new("Andy") +=> # +irb(main):048:0> greeter.respond_to?("name") +=> true +irb(main):049:0> greeter.respond_to?("name=") +=> true +irb(main):050:0> greeter.say_hi +Hi Andy! +=> nil +irb(main):051:0> greeter.name="Betty" +=> "Betty" +irb(main):052:0> greeter +=> # +irb(main):053:0> greeter.name +=> "Betty" +irb(main):054:0> greeter.say_hi +Hi Betty! +=> nil +{% endhighlight %} + +Використання `attr_accessor` визначило для нас два нові методи: `name` +для отримання значення і `name=` для його встановлення. + +## Вітання всього й усіх: MegaGreeter нікого не обділяє! + +Цей привітальник не надто цікавий — він може працювати лише з однією +людиною за раз. А що, якщо у нас буде MegaGreeter, який може вітати +світ, одну людину або цілий список людей? + +Напишімо це у файлі замість введення безпосередньо в інтерактивний +інтерпретатор Ruby (IRB). + +Щоб вийти з IRB, введіть “quit”, “exit” або просто натисніть Control-D. + +{% highlight ruby %} +#!/usr/bin/env ruby + +class MegaGreeter + attr_accessor :names + + # Create the object + def initialize(names = "World") + @names = names + end + + # Say hi to everybody + def say_hi + if @names.nil? + puts "..." + elsif @names.respond_to?("each") + # @names is a list of some kind, iterate! + @names.each do |name| + puts "Hello #{name}!" + end + else + puts "Hello #{@names}!" + end + end + + # Say bye to everybody + def say_bye + if @names.nil? + puts "..." + elsif @names.respond_to?("join") + # Join the list elements with commas + puts "Goodbye #{@names.join(", ")}. Come back soon!" + else + puts "Goodbye #{@names}. Come back soon!" + end + end +end + + +if __FILE__ == $0 + mg = MegaGreeter.new + mg.say_hi + mg.say_bye + + # Change name to be "Zeke" + mg.names = "Zeke" + mg.say_hi + mg.say_bye + + # Change the name to an array of names + mg.names = ["Albert", "Brenda", "Charles", + "Dave", "Engelbert"] + mg.say_hi + mg.say_bye + + # Change to nil + mg.names = nil + mg.say_hi + mg.say_bye +end +{% endhighlight %} + +Збережіть цей файл як “ri20min.rb” і запустіть як “ruby ri20min.rb”. +Вивід має бути таким: + + Hello World! + Goodbye World. Come back soon! + Hello Zeke! + Goodbye Zeke. Come back soon! + Hello Albert! + Hello Brenda! + Hello Charles! + Hello Dave! + Hello Engelbert! + Goodbye Albert, Brenda, Charles, Dave, Engelbert. Come + back soon! + ... + ... +{: .code} + +У цьому фінальному прикладі з’явилося багато нового, що ми +[можемо розглянути детальніше.](../4/) diff --git a/ua/documentation/quickstart/4/index.md b/ua/documentation/quickstart/4/index.md new file mode 100644 index 0000000000..db81b35852 --- /dev/null +++ b/ua/documentation/quickstart/4/index.md @@ -0,0 +1,142 @@ +--- +layout: page +title: "Ruby за двадцять хвилин" +lang: ua + +header: | +
+ 1 + | + 2 + | + 3 + | + 4 +
+

Ruby за двадцять хвилин

+ +--- + +Розгляньмо наш новий застосунок глибше. Зверніть увагу на перші рядки, +які починаються з решітки (#). У Ruby все, що знаходиться в рядку після +решітки, є коментарем і ігнорується інтерпретатором. Перший рядок файлу — +особливий випадок і під Unix-подібними ОС повідомляє shell, як запускати +файл. Решта коментарів потрібна лише для ясності. + +Наш метод `say_hi` став трохи складнішим: + +{% highlight ruby %} +# Say hi to everybody +def say_hi + if @names.nil? + puts "..." + elsif @names.respond_to?("each") + # @names is a list of some kind, iterate! + @names.each do |name| + puts "Hello #{name}!" + end + else + puts "Hello #{@names}!" + end +end +{% endhighlight %} + +Тепер він дивиться на змінну екземпляра `@names`, щоб приймати рішення. +Якщо вона дорівнює nil, він просто виводить три крапки. Немає сенсу +вітатися з ніким, правда? + +## Перебір і цикли — тобто ітерація + +Якщо об’єкт `@names` відповідає на `each`, це означає, що його можна +ітератувати. Отже, ми ітеруємо його і вітаємо кожну людину по черзі. +Зрештою, якщо `@names` — це щось інше, Ruby автоматично перетворює його +на рядок і виконує стандартне привітання. + +Розгляньмо цей ітератор детальніше: + +{% highlight ruby %} +@names.each do |name| + puts "Hello #{name}!" +end +{% endhighlight %} + +`each` — це метод, який приймає блок коду і виконує його для кожного +елемента списку; а частина між `do` та `end` — це саме такий блок. +Блок схожий на анонімну функцію або `lambda`. Змінна між вертикальними +рисками — це параметр блоку. + +У цьому випадку для кожного елемента списку `name` прив’язується до цього +елемента, після чого виконується вираз `puts "Hello #{name}!"`. + +Більшість інших мов програмування проходить список за допомогою циклу `for`, +який у C виглядає приблизно так: + +{% highlight c %} +for (i=0; i + 1 + | + 2 + | + 3 + | + 4 + +

Ruby за двадцять хвилин

+ +--- + +## Вступ + +Це невеликий туторіал з Ruby, який має зайняти не більше 20 хвилин. +Передбачається, що Ruby уже встановлено. +(Якщо Ruby немає на вашому комп’ютері, [встановіть][installation] його +перед початком.) + +## Інтерактивний Ruby + +Ruby постачається з програмою, яка показує результати будь-яких Ruby- +виразів, що ви їй передаєте. Гра з Ruby у таких інтерактивних сесіях — +чудовий спосіб вивчити мову. + +Відкрийте IRB (Interactive Ruby). + +* Якщо ви використовуєте **macOS**, відкрийте `Terminal` і введіть `irb`, + потім натисніть Enter. +* Якщо ви використовуєте **Linux**, відкрийте shell і введіть `irb`, + потім натисніть Enter. +* Якщо ви використовуєте **Windows**, відкрийте `Interactive Ruby` у + розділі Ruby вашого меню "Пуск". + +{% highlight irb %} +irb(main):001:0> +{% endhighlight %} + +Гаразд, він відкритий. Що далі? + +Введіть це: `"Hello World"` + +{% highlight irb %} +irb(main):001:0> "Hello World" +=> "Hello World" +{% endhighlight %} + +## Ruby вас послухався! + +Що щойно сталося? Невже ми написали найкоротшу у світі програму +“Hello World”? Не зовсім. Другий рядок — це лише спосіб IRB +повідомити результат останнього виразу, який він обчислив. Якщо ми +хочемо вивести “Hello World”, потрібно трохи більше: + +{% highlight irb %} +irb(main):002:0> puts "Hello World" +Hello World +=> nil +{% endhighlight %} + +`puts` — базова команда для виведення в Ruby. Але що означає `=> nil`? +Це результат виразу. `puts` завжди повертає nil — значення Ruby, що +означає абсолютно нічого. + +## Ваш безкоштовний калькулятор тут + +Ми вже можемо використовувати IRB як простий калькулятор: + +{% highlight irb %} +irb(main):003:0> 3+2 +=> 5 +{% endhighlight %} + +Три плюс два. Достатньо просто. А як щодо трьох, помножених на два? +Ви можете ввести це вручну — рядок короткий. Але ви також можете +піднятися вгору та змінити введений рядок. Натисніть **стрілку вгору** +на клавіатурі й подивіться, чи з’явиться рядок з `3+2`. Якщо так, +використайте стрілку вліво, щоб перейти відразу після `+`, а потім +натисніть Backspace, щоб замінити `+` на `*`. + +{% highlight irb %} +irb(main):004:0> 3*2 +=> 6 +{% endhighlight %} + +Далі спробуймо три в квадраті: + +{% highlight irb %} +irb(main):005:0> 3**2 +=> 9 +{% endhighlight %} + +У Ruby `**` означає "в степені". Але що, якщо ви хочете піти іншим +шляхом і знайти квадратний корінь із числа? + +{% highlight irb %} +irb(main):006:0> Math.sqrt(9) +=> 3.0 +{% endhighlight %} + +Гаразд, що це було? Якщо ви здогадалися, “обчислення квадратного кореня +із дев’яти”, ви праві. Але розгляньмо детальніше. По-перше, що таке +`Math`? + +## Модулі групують код за темами + +`Math` — вбудований модуль для математики. Модулі виконують дві ролі в +Ruby. Тут показана одна з них: групування схожих методів під знайомою +назвою. `Math` також містить методи на кшталт `sin()` і `tan()`. + +Далі стоїть крапка. Що вона робить? Крапка — це спосіб вказати отримувача +повідомлення. А саме повідомлення — це `sqrt(9)`, що означає виклик методу +`sqrt` (скорочення від “square root”) з параметром `9`. + +Результат цього виклику — значення `3.0`. Ви могли помітити, що це не +просто `3`. Це тому, що квадратний корінь числа не завжди є цілим, +тому метод завжди повертає число з плаваючою комою. + +А що, якщо ми хочемо зберегти результат цих обчислень? Присвойте +результат змінній. + +{% highlight irb %} +irb(main):007:0> a = 3 ** 2 +=> 9 +irb(main):008:0> b = 4 ** 2 +=> 16 +irb(main):009:0> Math.sqrt(a+b) +=> 5.0 +{% endhighlight %} + +Як би не було зручно мати калькулятор, ми відходимо від традиційного +“Hello World”, на якому мають зосереджуватися вступні туторіали… +[тож повернімося до нього.](2/) + +[installation]: /ua/documentation/installation/ diff --git a/ua/documentation/ruby-from-other-languages/index.md b/ua/documentation/ruby-from-other-languages/index.md new file mode 100644 index 0000000000..b6cce00e4a --- /dev/null +++ b/ua/documentation/ruby-from-other-languages/index.md @@ -0,0 +1,420 @@ +--- +layout: page +title: "Ruby з інших мов" +lang: ua +--- + +Коли ви вперше дивитеся на код Ruby, він, ймовірно, нагадає вам інші +мови програмування, з якими ви працювали. Це зроблено навмисно. Значна +частина синтаксису знайома користувачам Perl, Python і Java (та інших +мов), тож якщо ви їх використовували, вивчити Ruby буде нескладно. +{: .summary} + +Цей документ складається з двох основних розділів. Перший — це стислий +огляд того, чого очікувати, переходячи з мови *X* на Ruby. Другий розділ +розглядає ключові особливості мови та те, як вони співвідносяться з тим, +що вам уже знайомо. + +## Чого очікувати: *мова X* → Ruby + +* [Перехід на Ruby з C та C++](to-ruby-from-c-and-cpp/) +* [Перехід на Ruby з Java](to-ruby-from-java/) +* [Перехід на Ruby з Perl](to-ruby-from-perl/) +* [Перехід на Ruby з PHP](to-ruby-from-php/) +* [Перехід на Ruby з Python](to-ruby-from-python/) + +## Важливі особливості мови та деякі підводні камені + +Нижче наведено поради й підказки щодо ключових особливостей Ruby, які +ви побачите під час вивчення. + +### Ітерація + +Дві особливості Ruby, які трохи відрізняються від того, що ви могли +бачити раніше, і до яких потрібно звикнути, — це “блоки” та ітератори. +Замість проходу по індексу (як у C, C++ або Java до 1.5) або проходу по +списку (як Perl `for (@a) {...}` чи Python `for i in aList: ...`), у Ruby +ви дуже часто побачите таке: + +{% highlight ruby %} +some_list.each do |this_item| + # We're inside the block. + # deal with this_item. +end +{% endhighlight %} + +Детальніше про `each` (і його друзів `collect`, `find`, `inject`, +`sort` тощо) дивіться `ri Enumerable` (а потім `ri Enumerable#some_method`). + +### Усе має значення + +Немає різниці між виразом і оператором. Усе має значення, навіть якщо +це значення — `nil`. Можливо таке: + +{% highlight ruby %} +x = 10 +y = 11 +z = if x < y + true + else + false + end +z # => true +{% endhighlight %} + +### Символи — це не полегшені рядки + +Багато новачків у Ruby мають труднощі з розумінням того, що таке символи +і для чого вони потрібні. + +Символи найкраще описати як ідентичності. Символ — це про **хто** він, +а не **що** він. Запустіть `irb` і подивіться різницю: + +{% highlight irb %} +irb(main):001:0> :george.object_id == :george.object_id +=> true +irb(main):002:0> "george".object_id == "george".object_id +=> false +irb(main):003:0> +{% endhighlight %} + +Метод `object_id` повертає ідентичність об’єкта. Якщо два об’єкти мають +однаковий `object_id`, це один і той самий об’єкт (посилаються на той самий +об’єкт у пам’яті). + +Як видно, після того як ви один раз використали символ, будь-який символ +з такими самими символами посилається на той самий об’єкт у пам’яті. Для +будь-яких двох символів, що представляють однакові символи, `object_id` +співпадають. + +Тепер подивіться на рядок (“george”). `object_id` не співпадають. Це +означає, що вони посилаються на два різні об’єкти в пам’яті. Кожного разу, +коли ви створюєте новий рядок, Ruby виділяє для нього пам’ять. + +Якщо ви сумніваєтеся, використовувати символ чи рядок, подумайте, що +важливіше: ідентичність об’єкта (наприклад, ключ у Hash), чи вміст +(у прикладі вище — “george”). + +### Усе є об’єктом + +“Усе є об’єктом” — не просто гіпербола. Навіть класи та цілі числа — +об’єкти, і з ними можна робити те саме, що й з будь-яким іншим об’єктом: + +{% highlight ruby %} +# This is the same as +# class MyClass +# attr_accessor :instance_var +# end +MyClass = Class.new do + attr_accessor :instance_var +end +{% endhighlight %} + +### Константи — не зовсім константи + +Константи насправді не є константами. Якщо ви зміните вже ініціалізовану +константу, Ruby видасть попередження, але не зупинить програму. Це не +означає, що **слід** перевизначати константи. + +### Конвенції іменування + +Ruby дотримується певних конвенцій іменування. Якщо ідентифікатор +починається з великої літери — це константа. Якщо з символу долара (`$`) +— глобальна змінна. Якщо з `@` — змінна екземпляра. Якщо з `@@` — змінна класу. + +Назви методів, однак, можуть починатися з великої літери. Це може +спричиняти плутанину, як показано нижче: + +{% highlight ruby %} +Constant = 10 +def Constant + 11 +end +{% endhighlight %} + +Тепер `Constant` дорівнює 10, але `Constant()` дорівнює 11. + +### Іменовані аргументи + +Як і в Python, починаючи з Ruby 2.0, методи можна визначати з +іменованими аргументами: + +{% highlight ruby %} +def deliver(from: "A", to: nil, via: "mail") + "Sending from #{from} to #{to} via #{via}." +end + +deliver(to: "B") +# => "Sending from A to B via mail." +deliver(via: "Pony Express", from: "B", to: "A") +# => "Sending from B to A via Pony Express." +{% endhighlight %} + +### Універсальна істина + +У Ruby усе, окрім `nil` і `false`, вважається істинним. У C, Python та +багатьох інших мовах 0 і, можливо, інші значення, як-от порожні списки, +вважаються хибними. Подивіться на такий код Python (цей приклад +застосовний і до інших мов): + +{% highlight python %} +# in Python +if 0: + print("0 is true") +else: + print("0 is false") +{% endhighlight %} + +Це виведе “0 is false”. Еквівалент у Ruby: + +{% highlight ruby %} +# in Ruby +if 0 + puts "0 is true" +else + puts "0 is false" +end +{% endhighlight %} + +Виводить “0 is true”. + +### Модифікатори доступу діють до кінця області видимості + +У наступному коді Ruby: + +{% highlight ruby %} +class MyClass + private + def a_method; true; end + def another_method; false; end +end +{% endhighlight %} + +Ви можете очікувати, що `another_method` буде публічним. Але ні. Модифікатор +доступу `private` діє до кінця області видимості або до наступного +модифікатора доступу — що настане раніше. За замовчуванням методи публічні: + +{% highlight ruby %} +class MyClass + # Now a_method is public + def a_method; true; end + + private + + # another_method is private + def another_method; false; end +end +{% endhighlight %} + +`public`, `private` і `protected` — це методи, тому вони можуть приймати +параметри. Якщо ви передасте символ, зміниться видимість відповідного методу. + +### Доступ до методів + +У Java `public` означає, що метод доступний будь-кому. `protected` +означає, що до нього можуть звертатися екземпляри класу, екземпляри +класів-нащадків і екземпляри класів у тому самому пакеті, але не інші. +`private` означає, що метод доступний лише екземплярам класу. + +У Ruby все трохи інакше. `public` — публічний. `private` означає, що +метод(и) доступні лише тоді, коли їх можна викликати без явного +одержувача. Єдиним дозволеним одержувачем приватного виклику є `self`. + +`protected` — це те, на що варто звернути увагу. Захищений метод можна +викликати з екземплярів класу або класів-нащадків, а також із іншим +екземпляром як одержувачем. +Ось приклад (адаптовано з [The Ruby Language FAQ][faq]): + +{% highlight ruby %} +class Test + # public by default + def identifier + 99 + end + + def ==(other) + identifier == other.identifier + end +end + +t1 = Test.new # => # +t2 = Test.new # => # +t1 == t2 # => true + +# now make `identifier' protected; it still works +# because protected allows `other' as receiver + +class Test + protected :identifier +end + +t1 == t2 # => true + +# now make `identifier' private + +class Test + private :identifier +end + +t1 == t2 +# NoMethodError: private method `identifier' called for # +{% endhighlight %} + +### Класи відкриті + +Класи Ruby відкриті. Ви можете відкривати їх, додавати до них і змінювати +у будь-який момент. Навіть базові класи, як-от `Integer` або навіть `Object`, +предок усіх об’єктів. Ruby on Rails визначає низку методів для роботи з часом +у `Integer`. Дивіться: + +{% highlight ruby %} +class Integer + def hours + self * 3600 # number of seconds in an hour + end + alias hour hours +end + +# 14 hours from 00:00 January 1st +# (aka when you finally wake up ;) +Time.mktime(2006, 01, 01) + 14.hours # => Sun Jan 01 14:00:00 +{% endhighlight %} + +### Кумедні назви методів + +У Ruby назви методів можуть закінчуватися на знак питання або знак +оклику. За домовленістю методи, що відповідають на питання, закінчуються +на знак питання (наприклад, `Array#empty?`, який повертає `true`, якщо +об’єкт порожній). Потенційно “небезпечні” методи за домовленістю +закінчуються на знак оклику (наприклад, методи, які змінюють `self` або +аргументи, `exit!` тощо). Водночас не всі методи, що змінюють аргументи, +закінчуються на знак оклику. `Array#replace` замінює вміст масиву на +вміст іншого масиву. Не дуже логічно мати такий метод, який **не** змінює +`self`. + +### Синглтон-методи + +Синглтон-методи — це методи для конкретного об’єкта. Вони доступні лише +для об’єкта, на якому визначені. + +{% highlight ruby %} +class Car + def inspect + "Cheap car" + end +end + +porsche = Car.new +porsche.inspect # => Cheap car +def porsche.inspect + "Expensive car" +end + +porsche.inspect # => Expensive car + +# Other objects are not affected +other_car = Car.new +other_car.inspect # => Cheap car +{% endhighlight %} + +### Відсутні методи + +Ruby не здається, якщо не може знайти метод, що відповідає певному +повідомленню. Він викликає метод `method_missing` з ім’ям методу, якого +не знайшов, і аргументами. За замовчуванням `method_missing` піднімає +виняток NameError, але ви можете перевизначити його під потреби +вашого застосунку, і багато бібліотек так роблять. Ось приклад: + +{% highlight ruby %} +# id is the name of the method called, the * syntax collects +# all the arguments in an array named 'arguments' +def method_missing(id, *arguments) + puts "Method #{id} was called, but not found. It has " + + "these arguments: #{arguments.join(", ")}" +end + +__ :a, :b, 10 +# => Method __ was called, but not found. It has these +# arguments: a, b, 10 +{% endhighlight %} + +Код вище лише друкує деталі виклику, але ви можете обробляти повідомлення +будь-яким способом, який вам підходить. + +### Передача повідомлень, а не виклики функцій + +Виклик методу — це насправді **повідомлення** іншому об’єкту: + +{% highlight ruby %} +# This +1 + 2 +# Is the same as this ... +1.+(2) +# Which is the same as this: +1.send "+", 2 +{% endhighlight %} + +### Блоки — це об’єкти, просто вони ще цього не знають + +Блоки (насправді замикання) активно використовуються в стандартній +бібліотеці. Щоб викликати блок, ви можете або використати `yield`, +або перетворити його на `Proc`, додавши спеціальний аргумент до списку +аргументів, наприклад: + +{% highlight ruby %} +def block(&the_block) + # Inside here, the_block is the block passed to the method + the_block # return the block +end +adder = block { |a, b| a + b } +# adder is now a Proc object +adder.class # => Proc +{% endhighlight %} + +Ви також можете створювати блоки поза викликами методів, викликаючи +`Proc.new` з блоком або метод `lambda`. + +Подібно до цього, методи також є об’єктами в процесі: + +{% highlight ruby %} +method(:puts).call "puts is an object!" +# => puts is an object! +{% endhighlight %} + +### Оператори — це синтаксичний цукор + +Більшість операторів у Ruby — це лише синтаксичний цукор (з певними +правилами пріоритету) для викликів методів. Наприклад, ви можете +перевизначити метод `+` у Integer: + +{% highlight ruby %} +class Integer + # You can, but please don't do this + def +(other) + self - other + end +end +{% endhighlight %} + +Вам не потрібен `operator+` як у C++ тощо. + +Ви навіть можете мати доступ до елементів у стилі масиву, якщо визначите +методи `[]` і `[]=`. Щоб визначити унарні + і - (тобто +1 і -2), потрібно +визначити методи `+@` і `-@` відповідно. Проте наведені нижче оператори +**не** є синтаксичним цукром. Це не методи, і їх неможливо перевизначити: + +{% highlight ruby %} +=, .., ..., not, &&, and, ||, or, :: +{% endhighlight %} + +Крім того, `+=`, `*=` тощо — це лише скорочення для `var = var + other_var`, +`var = var * other_var` і т. д., тож їх також неможливо перевизначити. + +## Дізнатися більше + +Коли будете готові до більш глибоких знань Ruby, дивіться розділ +[Документація](/ua/documentation/). + + + +[faq]: http://ruby-doc.org/docs/ruby-doc-bundle/FAQ/FAQ.html diff --git a/ua/documentation/ruby-from-other-languages/to-ruby-from-c-and-cpp/index.md b/ua/documentation/ruby-from-other-languages/to-ruby-from-c-and-cpp/index.md new file mode 100644 index 0000000000..486cedc370 --- /dev/null +++ b/ua/documentation/ruby-from-other-languages/to-ruby-from-c-and-cpp/index.md @@ -0,0 +1,139 @@ +--- +layout: page +title: "Перехід на Ruby з C та C++" +lang: ua +--- + +Складно скласти маркований список того, як ваш код відрізнятиметься в Ruby +від C чи C++, адже різниця доволі велика. Одна з причин — у тому, що +рантайм Ruby робить дуже багато за вас. Ruby — це майже повна протилежність +принципу C «ніяких прихованих механізмів»; сенс Ruby — полегшити роботу +людини за рахунок того, що рантайм бере на себе більше задач. Якщо ви не +профілюєте код для оптимізації, вам не потрібно взагалі турбуватися про +“задоволення компілятора” під час використання Ruby. + +З іншого боку, можна очікувати, що Ruby-код виконуватиметься значно +повільніше, ніж “еквівалентний” C або C++ код. Водночас ви будете здивовані, +наскільки швидко можна запустити програму на Ruby і як мало рядків коду +потрібно, щоб її написати. Ruby набагато простіший за C++ — він вас +дуже розпестить. + +Ruby має динамічну типізацію, а не статичну — рантайм робить якомога більше +під час виконання. Наприклад, вам не потрібно заздалегідь знати, які +модулі програма Ruby буде “лінкувати” (тобто завантажувати та використовувати) +або які методи вона викликатиме. + +На щастя, Ruby і C мають здорові симбіотичні відносини. Ruby підтримує +так звані “extension modules” — модулі, які можна використовувати у Ruby- +програмах (і які ззовні виглядають і поводяться як звичайні Ruby-модулі), +але написані на C. Так ви можете винести критичні до продуктивності частини +вашого застосунку на Ruby у чистий C. + +І, звісно, сам Ruby написаний на C. + +### Подібності з C + +Як і в C, у Ruby... + +* Ви можете програмувати процедурно, якщо хочете (але за лаштунками це + все одно буде об’єктно-орієнтовано). +* Більшість операторів однакові (включно зі складеними присвоєннями та + побітовими операторами). Але в Ruby немає `++` чи `--`. +* Є `__FILE__` і `__LINE__`. +* Також є константи, хоча спеціального ключового слова `const` немає. + Сталість забезпечується конвенцією імен — імена з великої літери є + константами. +* Рядки беруться в подвійні лапки. +* Рядки змінювані. +* Як і man-сторінки, більшість документації можна читати у терміналі — + через команду `ri`. +* Є подібний налагоджувач командного рядка. + +### Подібності з C++ + +Як і в C++, у Ruby... + +* Є здебільшого ті самі оператори (навіть `::`). `<<` часто використовується + для додавання елементів до списку. Є одна відмінність: у Ruby ви ніколи + не використовуєте `->` — завжди `.`. +* `public`, `private` і `protected` виконують подібні ролі. +* Синтаксис наслідування — лише один символ, але це `<`, а не `:`. +* Ви можете складати код у “модулі”, подібно до того, як у C++ використовується + `namespace`. +* Винятки працюють подібно, хоча назви ключових слів змінилися, щоб + “захистити невинних”. + +### Відмінності від C + +На відміну від C, у Ruby... + +* Вам не потрібно компілювати код. Ви просто запускаєте його безпосередньо. +* Об’єкти мають строгі типи (а самі імена змінних типу не мають). +* Немає макросів або препроцесора. Немає кастів. Немає вказівників + (ані арифметики з вказівниками). Немає typedef, sizeof і enum. +* Немає заголовкових файлів. Ви просто визначаєте функції (зазвичай їх + називають “методами”) і класи в основних файлах з вихідним кодом. +* Немає `#define`. Натомість використовуйте константи. +* Усі змінні живуть у heap. Також вам не потрібно звільняти пам’ять + вручну — цим займається збирач сміття. +* Аргументи методів (тобто функцій) передаються за значенням, де значення + завжди є посиланнями на об’єкти. +* Замість `#include ` або `#include "foo"` використовується `require 'foo'`. +* Ви не можете опускатися до асемблера. +* Немає крапок з комою в кінці рядків. +* Ви обходитесь без дужок у виразах умов `if` і `while`. +* Дужки для виклику методів (тобто функцій) часто необов’язкові. +* Зазвичай не використовують фігурні дужки — багаторядкові конструкції + (як цикли `while`) завершуються ключовим словом `end`. +* Ключове слово `do` використовується для так званих “блоків”. Немає + “оператора do”, як у C. +* Термін “блок” означає інше. Це блок коду, який ви прив’язуєте до + виклику методу, щоб тіло методу могло викликати цей блок під час + виконання. +* Немає оголошень змінних. Ви просто присвоюєте значення новим іменам + у момент потреби. +* При перевірці на істинність лише `false` і `nil` дають хибне значення. + Усе інше — істинне (включно з `0`, `0.0` і `"0"`). +* Немає `char` — це просто рядки довжиною 1. +* Рядки не закінчуються нульовим байтом. +* Літерали масивів беруться в квадратні дужки, а не у фігурні. +* Масиви автоматично збільшуються, коли ви додаєте в них елементи. +* Якщо додати два масиви, ви отримаєте новий, більший масив (звісно, + виділений у heap), а не арифметику вказівників. +* Часто все є виразом (тобто навіть `while` повертає значення rvalue). + +### Відмінності від C++ + +На відміну від C++, у Ruby... + +* Немає явних посилань. У Ruby кожна змінна — це лише автоматично + розіменований іменник для певного об’єкта. +* Об’єкти мають строгі, але *динамічні* типи. Рантайм визначає + *під час виконання*, чи працює виклик методу. +* “Конструктор” називається `initialize`, а не як ім’я класу. +* Усі методи завжди віртуальні. +* Імена “класових” (статичних) змінних завжди починаються з `@@` + (наприклад, `@@total_widgets`). +* Ви не звертаєтеся до змінних-членів напряму — доступ до публічних + змінних-членів (у Ruby їх називають атрибутами) здійснюється через методи. +* Це `self` замість `this`. +* Деякі методи закінчуються на `?` або `!`. Це справжня частина імені методу. +* Немає множинного наслідування як такого. Проте Ruby має “міксини” + (тобто ви можете “успадковувати” всі методи екземпляра модуля). +* Є певні конвенції регістру (наприклад, назви класів починаються з + великої літери, змінні — з малої). +* Дужки для викликів методів зазвичай необов’язкові. +* Ви можете повторно відкривати клас у будь-який момент і додавати + нові методи. +* Немає потреби у шаблонах C++ (оскільки будь-який об’єкт можна + присвоїти змінній, а типи все одно визначаються під час виконання). + Немає і кастів. +* Ітерація відбувається трохи інакше. У Ruby ви не використовуєте + окремий об’єкт-ітератор (як `vector::const_iterator iter`). + Натомість використовуєте метод-ітератор контейнера (наприклад, `each`), + який приймає блок коду, якому передає послідовні елементи. +* Є лише два типи контейнерів: `Array` і `Hash`. +* Немає перетворень типів. У Ruby ви, ймовірно, побачите, що вони й не потрібні. +* Багатопотоковість вбудована, але починаючи з Ruby 1.8 це “green threads” + (реалізовані лише в інтерпретаторі), а не нативні потоки. +* Бібліотека юніт-тестування входить до стандартної поставки Ruby. diff --git a/ua/documentation/ruby-from-other-languages/to-ruby-from-java/index.md b/ua/documentation/ruby-from-other-languages/to-ruby-from-java/index.md new file mode 100644 index 0000000000..431a8ff59e --- /dev/null +++ b/ua/documentation/ruby-from-other-languages/to-ruby-from-java/index.md @@ -0,0 +1,57 @@ +--- +layout: page +title: "Перехід на Ruby з Java" +lang: ua +--- + +Java — зріла. Перевірена. І швидка (всупереч твердженням анти‑Java табору). +Водночас вона доволі багатослівна. Переходячи з Java на Ruby, очікуйте +суттєвого скорочення коду. Також можна очікувати, що швидкі прототипи +створюватимуться швидше. + +### Подібності + +Як і в Java, у Ruby... + +* Пам’ять керується збирачем сміття. +* Об’єкти мають строгі типи. +* Є методи public, private і protected. +* Є вбудовані інструменти документації (у Ruby це RDoc). Документація, + згенерована rdoc, дуже схожа на ту, що створюється javadoc. + +### Відмінності + +На відміну від Java, у Ruby... + +* Вам не потрібно компілювати код. Ви просто запускаєте його. +* Є кілька популярних сторонніх GUI-наборів. Користувачі Ruby можуть + спробувати [WxRuby][1], [FXRuby][2], [Ruby-GNOME2][3], + [Qt][4] або [Ruby Tk](https://github.com/ruby/tk). +* Ви використовуєте ключове слово `end` після визначення таких речей, як + класи, замість обгортання блоків коду фігурними дужками. +* Ви використовуєте `require` замість `import`. +* Усі змінні-члени приватні. Ззовні доступ здійснюється через методи. +* Дужки у викликах методів зазвичай необов’язкові і часто опускаються. +* Усе є об’єктом, включно з числами, як-от 2 і 3.14159. +* Немає статичної перевірки типів. +* Імена змінних — це лише мітки. Вони не мають пов’язаного типу. +* Немає оголошень типів. Ви просто присвоюєте значення новим змінним за + потреби, і вони “з’являються” (тобто `a = [1,2,3]` замість + `int[] a = {1,2,3};`). +* Немає кастингу. Просто викликайте методи. Ваші юніт-тести повинні + повідомити вам ще до виконання коду, якщо ви побачите виняток. +* Це `foo = Foo.new("hi")` замість `Foo foo = new Foo("hi")`. +* Конструктор завжди називається “initialize”, а не як назва класу. +* Є “міксини” замість інтерфейсів. +* YAML зазвичай надається перевага над XML. +* Це `nil` замість `null`. +* `==` і `equals()` працюють у Ruby по-іншому. Використовуйте `==`, коли + хочете перевірити еквівалентність у Ruby (`equals()` у Java). Використовуйте + `equal?()` коли хочете дізнатися, чи це той самий об’єкт (`==` у Java). + + + +[1]: https://github.com/eumario/wxruby +[2]: https://github.com/larskanis/fxruby +[3]: https://ruby-gnome2.osdn.jp/ +[4]: https://github.com/ryanmelt/qtbindings/ diff --git a/ua/documentation/ruby-from-other-languages/to-ruby-from-perl/index.md b/ua/documentation/ruby-from-other-languages/to-ruby-from-perl/index.md new file mode 100644 index 0000000000..669073273f --- /dev/null +++ b/ua/documentation/ruby-from-other-languages/to-ruby-from-perl/index.md @@ -0,0 +1,66 @@ +--- +layout: page +title: "Перехід на Ruby з Perl" +lang: ua +--- + +Perl — чудовий. Документація Perl — чудова. Спільнота Perl — … чудова. +Для тих, хто хоче елегантні ООП-можливості, вбудовані з самого початку, +Ruby може підійти. + +### Подібності + +Як і в Perl, у Ruby... + +* Є система керування пакетами, схожа на CPAN (хоча вона називається + [RubyGems][1]). +* Регулярні вирази вбудовані. Bon appétit! +* Є чимало часто використовуваних вбудованих можливостей. +* Дужки часто необов’язкові. +* Рядки працюють приблизно так само. +* Є загальний синтаксис обмежених рядків і регулярних виразів, схожий + на Perl. Він виглядає як `%q{this}` (одинарні лапки), або + `%Q{this}` (подвійні лапки), і `%w{this for a single-quoted list of words}`. + За бажання ви можете використовувати `%Q|can|` `%Q(use)` `%Q^other^` + як роздільники. +* Є інтерполяція змінних у стилі подвійних лапок, хоча вона + `"виглядає #{так}"` (і ви можете вставляти будь-який код Ruby всередині + `#{}`). +* Розгортання shell-команд використовує `` `бектики` ``. +* Є вбудовані інструменти документації (у Ruby це rdoc). + +### Відмінності + +На відміну від Perl, у Ruby... + +* Немає правил, що залежать від контексту, як у Perl. +* Змінна — не те саме, що об’єкт, на який вона посилається. Замість цього + це завжди лише посилання на об’єкт. +* Хоча `$` і `@` інколи використовуються як перший символ у назві змінної, + вони позначають не тип, а область видимості (`$` для глобальних, `@` для + екземпляра об’єкта, `@@` для атрибутів класу). +* Літерали масивів беруться в квадратні дужки, а не в круглі. +* Списки списків не «сплющуються» в один великий список. Натомість ви + отримуєте масив масивів. +* Це `def` замість `sub`. +* Не потрібні крапки з комою в кінці рядків. До речі, такі конструкції, + як визначення функцій, визначення класів і case-вирази, завершуються + ключовим словом `end`. +* Об’єкти мають строгі типи. Якщо потрібно перетворити тип, ви будете + вручну викликати `foo.to_i`, `foo.to_s` тощо. +* Немає `eq`, `ne`, `lt`, `gt`, `ge` чи `le`. +* Немає ромбового оператора (`<>`). Зазвичай використовується + `IO.some_method`. +* “Жирна кома” `=>` використовується лише для літералів hash. +* Немає `undef`. У Ruby є `nil`. `nil` — це об’єкт (як і все інше в Ruby). + Це не те саме, що невизначена змінна. Він оцінюється як `false`, якщо + трактувати його як булеве значення. +* При перевірці на істинність лише `false` і `nil` дають хибне значення. + Усе інше є істинним (включно з `0`, `0.0` і `"0"`). +* Немає [PerlMonks][2]. Втім, поштова розсилка ruby-talk — дуже корисне + місце. + + + +[1]: http://guides.rubygems.org +[2]: http://www.perlmonks.org/ diff --git a/ua/documentation/ruby-from-other-languages/to-ruby-from-php/index.md b/ua/documentation/ruby-from-other-languages/to-ruby-from-php/index.md new file mode 100644 index 0000000000..6740bafa5c --- /dev/null +++ b/ua/documentation/ruby-from-other-languages/to-ruby-from-php/index.md @@ -0,0 +1,49 @@ +--- +layout: page +title: "Перехід на Ruby з PHP" +lang: ua +--- + +PHP широко використовується для вебзастосунків, але якщо ви хочете +використовувати Ruby on Rails або просто мову, більш придатну для +загального використання, Ruby варто розглянути. + +### Подібності + +Як і в PHP, у Ruby… + +* Ruby має динамічну типізацію, як і PHP, тож вам не потрібно + турбуватися про оголошення змінних. +* Є класи, і ви можете керувати доступом до них, як у PHP 5 + (`public`, `protected`, `private`). +* Деякі змінні починаються з $, як у PHP (але не всі). +* Є `eval`. +* Можна використовувати інтерполяцію рядків. Замість `"$foo is a $bar"` + можна написати `"#{foo} is a #{bar}"` — як і в PHP, це не застосовується + до рядків у одинарних лапках. +* Є heredoc-и. +* Ruby має винятки, як PHP 5. +* Досить велика стандартна бібліотека. +* Масиви та hash працюють очікувано, якщо замінити `array()` на `{` і `}`: + `array('a' => 'b')` стає `{'a' => 'b'}`. +* `true` і `false` поводяться як у PHP, але `null` називається `nil`. + +### Відмінності + +На відміну від PHP, у Ruby… + +* Строга типізація. Вам потрібно викликати `to_s`, `to_i` тощо, щоб + перетворювати рядки, числа і т. ін., замість того щоб покладатися + на автоматичні перетворення мови. +* Рядки, числа, масиви, hash тощо — об’єкти. Замість abs(-1) — `-1.abs`. +* Дужки у викликах методів необов’язкові, окрім випадків, коли потрібно + уточнити, які параметри належать якому виклику. +* Стандартна бібліотека та розширення організовані в модулях і класах. +* Reflection — вбудована можливість об’єктів; не потрібно використовувати + класи `Reflection`, як у PHP 5. +* Змінні — це посилання. +* Немає `abstract` класів або `interface`-ів. +* Hash і масиви не взаємозамінні. +* Лише `false` і `nil` — хибні: `0`, `array()` і `""` — істинні + в умовах. +* Майже все є викликом методу, навіть `raise` (`throw` у PHP). diff --git a/ua/documentation/ruby-from-other-languages/to-ruby-from-python/index.md b/ua/documentation/ruby-from-other-languages/to-ruby-from-python/index.md new file mode 100644 index 0000000000..2f3ca4b2a3 --- /dev/null +++ b/ua/documentation/ruby-from-other-languages/to-ruby-from-python/index.md @@ -0,0 +1,71 @@ +--- +layout: page +title: "Перехід на Ruby з Python" +lang: ua +--- + +Python — ще одна дуже хороша мова програмування загального призначення. +Переходячи з Python на Ruby, ви побачите, що синтаксису трохи більше, +ніж у Python. + +### Подібності + +Як і в Python, у Ruby... + +* Є інтерактивний режим (називається `irb`). +* Документацію можна читати в командному рядку (через `ri` замість `pydoc`). +* Немає спеціальних термінаторів рядків (окрім звичайного нового рядка). +* Літерали рядків можуть охоплювати кілька рядків, як у Python з потрійними лапками. +* Дужки — для списків, фігурні дужки — для словників (у Ruby вони називаються “hash”). +* Масиви працюють так само (додаванням утворюють один довгий масив, але + композиція `a3 = [ a1, a2 ]` дає масив масивів). +* Об’єкти мають строгі та динамічні типи. +* Усе є об’єктом, а змінні — це лише посилання на об’єкти. +* Хоча ключові слова трохи різняться, винятки працюють приблизно так само. +* Є вбудовані інструменти документації (у Ruby це rdoc). +* Є гарна підтримка функціонального програмування з функціями першого класу, + анонімними функціями та замиканнями. + +### Відмінності + +На відміну від Python, у Ruby... + +* Рядки змінювані. +* Можна створювати константи (змінні, значення яких ви не плануєте змінювати). +* Є певні конвенції регістру (наприклад, назви класів починаються з великої + літери, змінні — з малої). +* Є лише один тип контейнера для списків (Array), і він змінюваний. +* Рядки в подвійних лапках підтримують escape-послідовності (наприклад, `\t`) + і спеціальний синтаксис підстановки виразів (який дозволяє вставляти + результати Ruby-виразів у рядки без необхідності + `"додавати " + "рядки " + "разом"`). Рядки в одинарних лапках схожі + на `r"raw strings"` у Python. +* Немає “new style” і “old style” класів. Є лише один вид. + (У Python 3+ цієї проблеми немає, але він не повністю сумісний з Python 2.) +* Ви ніколи напряму не звертаєтеся до атрибутів. У Ruby це завжди виклики методів. +* Дужки у викликах методів зазвичай необов’язкові. +* Для контролю доступу є `public`, `private` і `protected`, + замість Python-ових `_voluntary_` підкреслень `__convention__`. +* Використовуються “міксини” замість множинного наслідування. +* Ви можете додавати або змінювати методи вбудованих класів. Обидві мови + дозволяють відкривати та змінювати класи в будь-який момент, але Python + забороняє змінювати built-ins — Ruby ні. +* Є `true` і `false` замість `True` і `False` (і `nil` замість `None`). +* При перевірці на істинність лише `false` і `nil` дають хибне значення. + Усе інше — істинне (включно з `0`, `0.0`, `""` і `[]`). +* Це `elsif` замість `elif`. +* Це `require` замість `import`. В іншому використання подібне. +* Коментарі у звичному стилі над рядками (а не docstrings під ними) + використовуються для генерації документації. +* Є низка скорочень, які хоч і додають того, що треба запам’ятати, + але швидко засвоюються. Вони роблять Ruby веселим і дуже продуктивним. +* Немає способу «видалити» змінну після встановлення (як оператор `del` + у Python). Ви можете скинути змінну в `nil`, дозволивши старому + вмісту бути прибраним збирачем сміття, але змінна залишиться в таблиці + символів, доки її область видимості існує. +* Ключове слово `yield` поводиться інакше. У Python воно повертає виконання + до області видимості поза викликом функції. Зовнішній код відповідає за + відновлення виконання функції. У Ruby `yield` виконує іншу функцію, що + була передана як останній аргумент, і потім негайно відновлює виконання. +* Python підтримує лише один тип анонімних функцій — лямбди, тоді як Ruby + має блоки, Procs і лямбди. diff --git a/ua/documentation/success-stories/index.md b/ua/documentation/success-stories/index.md new file mode 100644 index 0000000000..4d72f09f61 --- /dev/null +++ b/ua/documentation/success-stories/index.md @@ -0,0 +1,81 @@ +--- +layout: page +title: "Історії успіху" +lang: ua +--- + +Багато людей використовують Ruby у своїй щоденній роботі. Інші — як хобі. +Тут ви знайдете невелику вибірку реальних прикладів використання Ruby. +{: .summary} + +#### Симуляції + +* [NASA Langley Research Center][1] використовує Ruby для проведення симуляцій. + +* Дослідницька група в [Motorola][2] використовує Ruby для написання + сценаріїв симулятора — як для генерації сценаріїв, так і для + постобробки даних. + +#### 3D-моделювання + +* [Google SketchUp][3] — застосунок для 3D-моделювання, який використовує Ruby + для API макроскриптів. + +#### Бізнес + +* [Toronto Rehab][4] використовує застосунок на базі RubyWebDialogs для + керування та відстеження чергувань і виїзної підтримки для ІТ-служби + та ІТ-операційних команд. + +#### Робототехніка + +* У проєкті MORPHA Ruby використовувався для реалізації реактивної + частини керування сервісним роботом Siemens. + +#### Телефонія + +* Ruby використовується в компанії Lucent у продукті для бездротової + телефонії 3G. + +#### Адміністрування систем + +* Ruby використовувався для написання центральної частини збору даних + у системі Unix Capacity and Planning компанії [Level 3 Communications][8], + яка збирає статистику продуктивності з понад 1700 Unix-серверів + (Solaris і Linux), розташованих по всьому світу. + +#### Вебзастосунки + +* [Basecamp][9] — вебзастосунок для керування проєктами — повністю написаний + на Ruby. + +* [A List Apart][10] — журнал для людей, які створюють вебсайти, що існує + з 1997 року — нещодавно був перероблений і використовує власний + застосунок, створений на Ruby on Rails. + +#### Безпека + +* [Metasploit Framework][metasploit] — open source проєкт спільноти, + керований [Rapid7][rapid7]. Це безкоштовна платформа для тестування + на проникнення, яка допомагає ІТ-фахівцям оцінювати безпеку своїх + мереж і застосунків. Проєкт Metasploit складається з понад 700 000 рядків + коду і був завантажений понад мільйон разів у 2010 році. + Комерційні видання, розроблені Rapid7, також базуються на Ruby. + +* [Arachni Web Application Security Scanner][arachni] — безкоштовний, + модульний, високопродуктивний Ruby-фреймворк, призначений для допомоги + пен-тестерам і адміністраторам в оцінюванні безпеки сучасних вебзастосунків. + + + +[1]: http://www.larc.nasa.gov/ +[2]: http://www.motorola.com +[3]: http://www.sketchup.com/ +[4]: https://www.uhn.ca/TorontoRehab +[8]: http://www.level3.com/ +[9]: https://www.basecamp.com +[10]: http://www.alistapart.com + +[metasploit]: http://www.metasploit.com +[rapid7]: http://www.rapid7.com +[arachni]: http://www.arachni-scanner.com/ diff --git a/ua/downloads/branches/index.md b/ua/downloads/branches/index.md new file mode 100644 index 0000000000..7990790a45 --- /dev/null +++ b/ua/downloads/branches/index.md @@ -0,0 +1,37 @@ +--- +layout: page +title: "Гілки підтримки Ruby" +lang: ua +--- + +На цій сторінці наведено поточний статус підтримки різних гілок Ruby. +{: .summary} + +Для додаткової інформації про конкретні релізи дивіться +[сторінку релізів](../releases/). + +Це попередній список гілок Ruby і їхнього статусу підтримки. +Показані дати виведені з англомовних публікацій релізів +або оголошень EOL. + +Гілки Ruby або серії релізів нижче розподілено за такими фазами: + +* **normal maintenance** (bug fix): + Гілка отримує загальні виправлення помилок і виправлення безпеки. +* **security maintenance** (security fix): + До цієї гілки повертаються лише виправлення безпеки. +* **eol** (end-of-life): + Гілка більше не підтримується командою ruby-core і не отримує + жодних виправлень. Подальших патч-релізів не буде. + +{% include branches-timeline.html %} + +{% for branch in site.data.branches %} +### Ruby {{ branch.name }} + +статус: {{ branch.status }}
+дата релізу: {{ branch.date }}
+звичайна підтримка до: {% if branch.security_maintenance_date %}{{ branch.security_maintenance_date }}{% else %}TBD{% endif %}
+EOL: {% if branch.eol_date %}{{ branch.eol_date }}{% else %}{% if branch.expected_eol_date %}{{ branch.expected_eol_date }} (очікується){% else %}TBD{% endif %}{% endif %} + +{% endfor %} diff --git a/ua/downloads/index.md b/ua/downloads/index.md new file mode 100644 index 0000000000..a180439549 --- /dev/null +++ b/ua/downloads/index.md @@ -0,0 +1,88 @@ +--- +layout: page +title: "Завантажити Ruby" +lang: ua +--- + +Тут ви можете отримати найсвіжіші дистрибутиви Ruby у зручному для вас форматі. +Поточна стабільна версія — {{ site.data.downloads.stable[0] }}. +Будь ласка, обов’язково прочитайте [ліцензію Ruby][license]. +{: .summary} + +### Способи встановлення Ruby + +Ми маємо кілька інструментів для кожної основної платформи: + +* На Linux/UNIX можна використовувати систему керування пакетами вашого + дистрибутива або сторонні інструменти ([rbenv][rbenv] і [RVM][rvm]). +* На macOS можна використовувати сторонні інструменти ([rbenv][rbenv] і [RVM][rvm]). +* На Windows можна використовувати [RubyInstaller][rubyinstaller]. + +Дивіться сторінку [Встановлення][installation] для деталей щодо використання +систем керування пакетами або сторонніх інструментів. + +Звісно, ви також можете встановити Ruby з вихідного коду на всіх основних платформах. + +### Компілювання Ruby — вихідний код + +Встановлення з вихідного коду — чудове рішення, коли ви добре орієнтуєтеся +у своїй платформі та, можливо, потребуєте специфічних налаштувань для +вашого середовища. Це також корисний варіант, якщо для вашої платформи +немає готових пакунків. + +Дивіться сторінку [Встановлення][installation] для деталей щодо збирання +Ruby з вихідного коду. Якщо у вас виникають проблеми з компіляцією Ruby, +розгляньте можливість використання одного зі згаданих вище сторонніх +інструментів — вони можуть допомогти. + +* **Стабільні релізи:**{% for version in site.data.downloads.stable %}{% assign release = site.data.releases | where: "version", version | first %} + * [Ruby {{ release.version }}]({{ release.url.gz }})
+ sha256: {{ release.sha256.gz }}{% endfor %} + +{% if site.data.downloads.preview %} +* **Попередні релізи:**{% for version in site.data.downloads.preview %}{% assign release = site.data.releases | where: "version", version | first %} + * [Ruby {{ release.version }}]({{ release.url.gz }})
+ sha256: {{ release.sha256.gz }}{% endfor %} +{% endif %} + +{% if site.data.downloads.security_maintenance %} +* **Фаза security maintenance (скоро EOL):**{% for version in site.data.downloads.security_maintenance %}{% assign release = site.data.releases | where: "version", version | first %} + * [Ruby {{ release.version }}]({{ release.url.gz }})
+ sha256: {{ release.sha256.gz }}{% endfor %} +{% endif %} + +{% if site.data.downloads.eol %} +* **Більше не підтримується (EOL):**{% for version in site.data.downloads.eol %}{% assign release = site.data.releases | where: "version", version | first %} + * [Ruby {{ release.version }}]({{ release.url.gz }})
+ sha256: {{ release.sha256.gz }}{% endfor %} +{% endif %} + +* **Снапшоти:**{% for snapshot in site.data.downloads.stable_snapshots %} + * [Стабільний снапшот гілки {{ snapshot.branch }}]({{ snapshot.url.gz }}): + Це tarball із найновішим снапшотом поточної гілки `{{ snapshot.branch }}`.{% endfor %} + * [Нічний снапшот]({{ site.data.downloads.nightly_snapshot.url.gz }}): + Це tarball з тим, що є в Git, сформований щоночі. + Він може містити помилки або інші проблеми — використовуйте на власний ризик! + +Для детальнішої інформації про конкретні релізи, особливо старіші або +попередні, дивіться сторінку [Релізи][releases]. +Інформацію про поточний статус підтримки різних гілок Ruby можна знайти +на сторінці [Гілки][branches]. + +Для інформації про репозиторії Ruby у Subversion та Git дивіться сторінку +[Ruby Core](/ua/community/ruby-core/). + +Вихідний код Ruby доступний через глобальний набір +[дзеркальних сайтів][mirrors]. +Будь ласка, намагайтеся використовувати дзеркало, що знаходиться ближче до вас. + + + +[license]: /ua/about/license.txt +[installation]: /ua/documentation/installation/ +[releases]: /ua/downloads/releases/ +[branches]: /ua/downloads/branches/ +[mirrors]: /ua/downloads/mirrors/ +[rvm]: http://rvm.io/ +[rbenv]: https://github.com/rbenv/rbenv +[rubyinstaller]: https://rubyinstaller.org/ diff --git a/ua/downloads/mirrors/index.md b/ua/downloads/mirrors/index.md new file mode 100644 index 0000000000..df09053704 --- /dev/null +++ b/ua/downloads/mirrors/index.md @@ -0,0 +1,49 @@ +--- +layout: page +title: "Дзеркальні сайти" +lang: ua +--- + +{% comment %} +Not to be translated. Link to this page (/en/downloads/mirrors/) instead. +{% endcomment %} + +Вихідний код Ruby доступний через набір дзеркальних сайтів по всьому світу. +Будь ласка, намагайтеся використовувати дзеркало, що знаходиться ближче до вас. +{: .summary} + +### Дзеркальні сайти через HTTP + +* [CDN][mirror-https-cdn] (fastly.com) +* [Японія][mirror-http-jp-ring] (RingServer) +* [Нідерланди][mirror-http-nl] (XS4ALL) - лише пакунки релізів +* [Франція][mirror-http-fr] (cyberbits.eu) +* [Китай 2][mirror-http-cn2] (Ruby China) +* [Південна Корея][mirror-http-kr] (Korea FreeBSD Users Group) + +### Дзеркальні сайти через FTP + +* [Японія][mirror-ftp-jp-ring] (RingServer) +* [Японія 3][mirror-ftp-jp3] (IIJ) +* [Південна Корея][mirror-ftp-kr] (Korea FreeBSD Users Group) +* [Німеччина][mirror-ftp-de] (FU Berlin) +* [Греція][mirror-ftp-gr] (ntua.gr) + +### Дзеркальні сайти через rsync + +* [Франція][mirror-rsync-fr] (cyberbits.eu) +* [Південна Корея][mirror-rsync-kr] (Korea FreeBSD Users Group) + +[mirror-https-cdn]: https://cache.ruby-lang.org/pub/ruby/ +[mirror-http-jp-ring]: http://www.ring.gr.jp/pub/lang/ruby/ +[mirror-http-nl]: http://www.xs4all.nl/~hipster/lib/mirror/ruby/ +[mirror-http-fr]: https://mirror.cyberbits.eu/ruby/ +[mirror-http-cn2]: https://cache.ruby-china.com/pub/ruby/ +[mirror-http-kr]: http://ftp.kr.freebsd.org/pub/ruby/ +[mirror-ftp-jp-ring]: ftp://ftp.ring.gr.jp/pub/lang/ruby/ +[mirror-ftp-jp3]: ftp://ftp.iij.ad.jp/pub/lang/ruby/ +[mirror-ftp-kr]: ftp://ftp.kr.freebsd.org/pub/ruby/ +[mirror-ftp-de]: ftp://ftp.fu-berlin.de/unix/languages/ruby/ +[mirror-ftp-gr]: ftp://ftp.ntua.gr/pub/lang/ruby/ +[mirror-rsync-fr]: rsync://rsync.cyberbits.eu/ruby/ +[mirror-rsync-kr]: rsync://rsync.kr.freebsd.org/ruby/ diff --git a/ua/downloads/releases/index.md b/ua/downloads/releases/index.md new file mode 100644 index 0000000000..91dffb2046 --- /dev/null +++ b/ua/downloads/releases/index.md @@ -0,0 +1,35 @@ +--- +layout: page +title: "Релізи Ruby" +lang: ua +--- + +На цій сторінці наведені окремі релізи Ruby. +{: .summary} + +Інформацію про поточний статус підтримки різних гілок Ruby дивіться на +[сторінці гілок](../branches/). + +### Релізи Ruby за номером версії + +Це список релізів Ruby. +Показані дати відповідають датам публікації англомовних +публікацій про релізи й можуть відрізнятися від фактичних +дат створення вихідних tarball-ів. + + + + + + + + +{% assign releases = site.data.releases | reverse | sort: "date" | reverse %} +{% for release in releases %} + + + + + +{% endfor %} +
Версія релізуДата релізуURL для завантаженняНотатки до релізу
Ruby {{ release.version }}{{ release.date }}завантажитидетальніше...
diff --git a/ua/examples/cities.md b/ua/examples/cities.md new file mode 100644 index 0000000000..a884aef6e4 --- /dev/null +++ b/ua/examples/cities.md @@ -0,0 +1,22 @@ +--- +layout: null +--- + +{% highlight ruby %} +# Ruby розуміє, що +# ви маєте на увазі, +# навіть якщо хочете +# робити математику +# з цілим масивом +cities = %w[ Лондон + Осло + Париж + Амстердам + Берлін ] +visited = %w[Берлін Осло] + +puts "Мені ще потрібно " + + "відвідати такі " + + "міста:", + cities - visited +{% endhighlight %} diff --git a/ua/examples/greeter.md b/ua/examples/greeter.md new file mode 100644 index 0000000000..c24ff286ca --- /dev/null +++ b/ua/examples/greeter.md @@ -0,0 +1,22 @@ +--- +layout: null +--- + +{% highlight ruby %} +# Клас Greeter +class Greeter + def initialize(name) + @name = name.capitalize + end + + def salute + puts "Вітаю, #{@name}!" + end +end + +# Створюємо новий об’єкт +g = Greeter.new("світ") + +# Виведе "Вітаю, Світ!" +g.salute +{% endhighlight %} diff --git a/ua/examples/hello_world.md b/ua/examples/hello_world.md new file mode 100644 index 0000000000..f868e509ae --- /dev/null +++ b/ua/examples/hello_world.md @@ -0,0 +1,17 @@ +--- +layout: null +--- + +{% highlight ruby %} +# Знаменита програма +# Hello World дуже проста +# у Ruby. Зайвими є: +# +# * метод "main" +# * перенос рядка +# * крапки з комою +# +# Ось сам код: + +puts "Hello World!" +{% endhighlight %} diff --git a/ua/examples/i_love_ruby.md b/ua/examples/i_love_ruby.md new file mode 100644 index 0000000000..b16f1ab905 --- /dev/null +++ b/ua/examples/i_love_ruby.md @@ -0,0 +1,17 @@ +--- +layout: null +--- + +{% highlight ruby %} +# Виведе "Я люблю Ruby" +say = "Я люблю Ruby" +puts say + +# Виведе "Я *ЛЮБЛЮ* RUBY" +say = say.sub("люблю", "*люблю*") +puts say.upcase + +# Виведе "Я *люблю* Ruby" +# п’ять разів +5.times { puts say } +{% endhighlight %} diff --git a/ua/feeds/news.rss b/ua/feeds/news.rss new file mode 100644 index 0000000000..f106cd5ba3 --- /dev/null +++ b/ua/feeds/news.rss @@ -0,0 +1,4 @@ +--- +layout: news_feed +lang: ua +--- diff --git a/ua/index.html b/ua/index.html new file mode 100644 index 0000000000..e329307424 --- /dev/null +++ b/ua/index.html @@ -0,0 +1,15 @@ +--- +layout: homepage +title: "Мова програмування Ruby" +lang: ua +--- + +{% include home/hero.html %} + + +{% include home/why_ruby.html %} + + +{% include home/community.html %} + +{% include home/news_security.html %} diff --git a/ua/libraries/index.md b/ua/libraries/index.md new file mode 100644 index 0000000000..f1fcc9fd85 --- /dev/null +++ b/ua/libraries/index.md @@ -0,0 +1,135 @@ +--- +layout: page +title: "Бібліотеки" +lang: ua +--- + +Як і більшість мов програмування, Ruby використовує широкий набір +сторонніх бібліотек. +{: .summary} + +Майже всі ці бібліотеки випускаються у вигляді **gem** — +упакованої бібліотеки або застосунку, який можна встановити за допомогою +інструмента [**RubyGems**][1]. + +RubyGems — це система пакування Ruby, створена для полегшення створення, +обміну та встановлення бібліотек (у певному сенсі це система пакування +дистрибутивів, подібна до `apt-get`, але орієнтована на Ruby). +Ruby постачається з RubyGems за замовчуванням, починаючи з версії 1.9, +а для попередніх версій RubyGems потрібно [встановлювати вручну][2]. + +Деякі інші бібліотеки поширюються у вигляді архівів (.zip або .tar.gz) +з **вихідним кодом**. Процеси встановлення можуть відрізнятися, +зазвичай у файлі `README` або `INSTALL` є інструкції. + +Розгляньмо, як знаходити бібліотеки та встановлювати їх для власного +використання. + +### Пошук бібліотек + +Основне місце розміщення бібліотек — [**RubyGems.org**][1], публічний +репозиторій gem-ів, у якому можна шукати та встановлювати пакунки на +свою машину. Ви можете переглядати й шукати gem-и через вебсайт +RubyGems або використовувати команду `gem`. + +За допомогою `gem search -r` можна здійснювати пошук у репозиторії +RubyGems. Наприклад, `gem search -r rails` поверне список gem-ів, +пов’язаних із Rails. Опція `--local` (`-l`) виконує локальний пошук +серед встановлених gem-ів. Для встановлення gem-а використовуйте +`gem install [gem]`. Переглянути встановлені gem-и можна командою +`gem list`. Докладніше про команду `gem` — нижче або в +[документації RubyGems][3]. + +Є й інші джерела бібліотек. +[**GitHub**][5] — основний репозиторій Ruby-орієнтованого контенту. +Зазвичай вихідний код gem-а розміщується на GitHub, а повноцінний +реліз публікується на RubyGems.org. + +[**The Ruby Toolbox**][6] — це проєкт, який спрощує огляд відкритих +Ruby-проєктів. Він має категорії для різних типових завдань розробки, +збирає багато інформації про проєкти (наприклад, активність релізів і +комітів або залежності) та оцінює їхню популярність на RubyGems.org і +GitHub. Це допомагає легко знаходити gem, що розв’язує конкретну задачу, +наприклад вебфреймворки, інструменти документації та бібліотеки якості коду. + +### Кілька слів про RubyGems + +Ось короткий огляд команди `gem` для щоденного використання. +[Детальніша документація][7] охоплює всі аспекти цієї системи пакування. + +#### Пошук серед доступних gem-ів + +Команда **search** використовується для пошуку gem-ів за рядком. +У відповідь буде показано gem-и, назви яких починаються із заданого рядка. +Наприклад, для пошуку gem-ів, пов’язаних із “html”: + +{% highlight sh %} +$ gem search -r html + +*** REMOTE GEMS *** + +html-sample (1.0, 1.1) +{% endhighlight %} + +Прапорець `--remote` / `-r` означає, що ми переглядаємо офіційний +репозиторій RubyGems.org (поведінка за замовчуванням). +З прапорцем `--local` / `-l` ви виконаєте локальний пошук серед +встановлених gem-ів. + +#### Встановлення gem-а + +Коли ви знаєте, який gem хочете **встановити**, наприклад популярний +фреймворк Ruby on Rails: + +{% highlight sh %} +$ gem install rails +{% endhighlight %} + +Ви також можете встановити конкретну версію бібліотеки, використавши +прапорець `--version` / `-v`: + +{% highlight sh %} +$ gem install rails --version 5.0 +{% endhighlight %} + +#### Список усіх gem-ів + +Для **списку** всіх локально встановлених gem-ів: + +{% highlight sh %} +$ gem list +{% endhighlight %} + +Щоб отримати (дуже довгий) список усіх gem-ів, доступних на RubyGems.org: + +{% highlight sh %} +$ gem list -r +{% endhighlight %} + +#### Довідка + +Документація доступна у вашому терміналі: + +{% highlight sh %} +$ gem help +{% endhighlight %} + +Наприклад, `gem help commands` дуже корисна, оскільки виводить список +усіх команд `gem`. + +#### Створення власних gem-ів + +RubyGems.org має [кілька посібників][3] на цю тему. Також варто +звернути увагу на [Bundler][9] — універсальний інструмент, що допомагає +керувати залежностями застосунку та може використовуватися разом із +RubyGems. + + + +[1]: https://rubygems.org/ +[2]: https://rubygems.org/pages/download/ +[3]: http://guides.rubygems.org/ +[5]: https://github.com/ +[6]: https://www.ruby-toolbox.com/ +[7]: http://guides.rubygems.org/command-reference/ +[9]: http://bundler.io/ diff --git a/ua/news/_posts/2004-01-17-rss-feed-started.md b/ua/news/_posts/2004-01-17-rss-feed-started.md new file mode 100644 index 0000000000..0dcdb45d5f --- /dev/null +++ b/ua/news/_posts/2004-01-17-rss-feed-started.md @@ -0,0 +1,10 @@ +--- +layout: news_post +title: "Запущено RSS-стрічку" +author: "sho" +translator: "Andrii Furmanets" +lang: ua +--- + +Ми щойно запустили RSS-стрічку на цьому сайті. Перегляньте її. +https://www.ruby-lang.org/en/index.rdf diff --git a/ua/news/_posts/2024-12-25-ruby-3-4-0-released.md b/ua/news/_posts/2024-12-25-ruby-3-4-0-released.md new file mode 100644 index 0000000000..5529e3424d --- /dev/null +++ b/ua/news/_posts/2024-12-25-ruby-3-4-0-released.md @@ -0,0 +1,369 @@ +--- +layout: news_post +title: "Вийшов Ruby 3.4.0" +author: "naruse" +translator: "Andrii Furmanets" +date: 2024-12-25 00:00:00 +0000 +lang: ua +--- + +{% assign release = site.data.releases | where: "version", "3.4.0" | first %} +Раді повідомити про вихід Ruby {{ release.version }}. Ruby 3.4 додає посилання на параметр блоку `it`, +змінює Prism на парсер за замовчуванням, додає підтримку Happy Eyeballs Version 2 до бібліотеки сокетів, покращує YJIT, +додає модульний GC тощо. + +## Введено `it` + +`it` додано для посилання на параметр блоку без імені змінної. [[Feature #18980]] + +```ruby +ary = ["foo", "bar", "baz"] + +p ary.map { it.upcase } #=> ["FOO", "BAR", "BAZ"] +``` + +`it` поводиться майже так само, як `_1`. Коли намір - використати в блоці лише `_1`, можливість появи інших +нумерованих параметрів, таких як `_2`, створює додаткове когнітивне навантаження для читачів. Тому `it` +введено як зручний псевдонім. Використовуйте `it` у простих випадках, де `it` говорить саме за себе, +наприклад в однорядкових блоках. + +## Prism тепер парсер за замовчуванням + +Перемкнуто парсер за замовчуванням з parse.y на Prism. [[Feature #20564]] + +Це внутрішнє поліпшення, і для користувача має бути мало помітних змін. Якщо ви помітите проблеми сумісності, +будь ласка, повідомте нам. + +Щоб використати традиційний парсер, передайте параметр командного рядка `--parser=parse.y`. + +## Бібліотека сокетів тепер підтримує Happy Eyeballs Version 2 (RFC 8305) + +Бібліотека сокетів тепер підтримує [Happy Eyeballs Version 2 (RFC 8305)](https://datatracker.ietf.org/doc/html/rfc8305), +останню стандартизовану версію широко застосовуваного підходу для кращої мережевої взаємодії у багатьох мовах програмування, +у `TCPSocket.new` (`TCPSocket.open`) та `Socket.tcp`. +Це покращення дозволяє Ruby забезпечувати ефективні та надійні мережеві з'єднання, адаптовані до сучасних інтернет-умов. + +До Ruby 3.3 ці методи виконували розв'язання імен і спроби з'єднання послідовно. За цим алгоритмом тепер вони працюють так: + +1. Виконують розв'язання імен IPv6 і IPv4 паралельно +2. Підключаються до розв'язаних IP-адрес, віддаючи пріоритет IPv6, із паралельними спробами з інтервалом 250 мс +3. Повертають перше успішне з'єднання, скасовуючи всі інші + +Це мінімізує затримки підключення, навіть якщо певний протокол або IP-адреса затримується чи недоступні. +Цю функцію увімкнено за замовчуванням, тож додаткових налаштувань не потрібно. Щоб вимкнути її глобально, +встановіть змінну середовища `RUBY_TCP_NO_FAST_FALLBACK=1` або викличте `Socket.tcp_fast_fallback=false`. +А щоб вимкнути її для окремого виклику, використайте ключовий аргумент `fast_fallback: false`. + +## YJIT + +### TL;DR + +* Краща продуктивність у більшості бенчмарків на платформах x86-64 та arm64. +* Зменшене використання пам'яті завдяки стисненим метаданим та єдиній межі пам'яті. +* Різні виправлення помилок: YJIT став надійнішим і ретельніше протестованим. + +### Нові можливості + +* Параметри командного рядка + * `--yjit-mem-size` запроваджує єдину межу пам'яті (типово 128MiB) для відстеження загального споживання пам'яті YJIT, + забезпечуючи інтуїтивнішу альтернативу старому параметру `--yjit-exec-mem-size`. + * `--yjit-log` увімкнює журнал компіляції, щоб відстежувати, що компілюється. +* API Ruby + * `RubyVM::YJIT.log` надає доступ до хвоста журналу компіляції під час виконання. +* Статистика YJIT + * `RubyVM::YJIT.runtime_stats` тепер завжди надає додаткову статистику щодо + інвалідизації, інлайнінгу та кодування метаданих. + +### Нові оптимізації + +* Стиснений контекст зменшує пам'ять, потрібну для зберігання метаданих YJIT +* Виділення регістрів для локальних змінних і аргументів методів Ruby +* Коли YJIT увімкнено, більше базових примітивів реалізовано на Ruby: + * `Array#each`, `Array#select`, `Array#map` переписано на Ruby для кращої продуктивності [[Feature #20182]]. +* Можливість інлайнити невеликі або тривіальні методи, такі як: + * Порожні методи + * Методи, що повертають константу + * Методи, що повертають `self` + * Методи, що безпосередньо повертають аргумент +* Спеціалізована генерація коду для значно більшої кількості методів часу виконання +* Оптимізація `String#getbyte`, `String#setbyte` та інших рядкових методів +* Оптимізація бітових операцій для прискорення низькорівневих маніпуляцій з бітами/байтами +* Підтримка розділюваних констант у режимі multi-ractor +* Різні інші інкрементальні оптимізації + +## Модульний GC + +* Альтернативні реалізації збирача сміття (GC) можуть завантажуватися динамічно + через функцію модульного GC. Щоб увімкнути цю функцію, + сконфігуруйте Ruby з `--with-modular-gc` під час збірки. Бібліотеки GC можна + завантажувати під час виконання, використовуючи змінну середовища `RUBY_GC_LIBRARY`. + [[Feature #20351]] + +* Вбудований збирач сміття Ruby винесено в окремий файл + `gc/default/default.c` і він взаємодіє з Ruby через API, визначений у + `gc/gc_impl.h`. Вбудований збирач сміття тепер також можна зібрати як + бібліотеку, використовуючи `make modular-gc MODULAR_GC=default`, і увімкнути + через змінну середовища `RUBY_GC_LIBRARY=default`. [[Feature #20470]] + +* Експериментальна бібліотека GC на основі [MMTk](https://www.mmtk.io/). + Цю бібліотеку GC можна зібрати командою `make modular-gc MODULAR_GC=mmtk` і + увімкнути через змінну середовища `RUBY_GC_LIBRARY=mmtk`. Для цього потрібен + інструментарій Rust на машині збірки. [[Feature #20860]] + +## Зміни мови + +* Рядкові літерали у файлах без коментаря `frozen_string_literal` тепер видають попередження про застаріле використання + при їх зміні. + Ці попередження можна увімкнути за допомогою `-W:deprecated` або встановивши `Warning[:deprecated] = true`. + Щоб вимкнути цю зміну, можна запустити Ruby з параметром командного рядка `--disable-frozen-string-literal`. + [[Feature #20205]] + +* Тепер підтримується розпаковування ключових аргументів з `nil` під час виклику методів. + `**nil` обробляється подібно до `**{}`, не передаючи ключових аргументів + і не викликаючи жодних методів перетворення. [[Bug #20064]] + +* Передавання блоку більше не дозволено в операції індексації. [[Bug #19918]] + +* Ключові аргументи більше не дозволені в операції індексації. [[Bug #20218]] + +* Глобальне ім'я `::Ruby` тепер зарезервоване, і при його визначенні буде попередження, + якщо увімкнено `Warning[:deprecated]`. [[Feature #20884]] + +## Оновлення основних класів + +Примітка: наведено лише помітні оновлення основних класів. + +* Exception + + * `Exception#set_backtrace` тепер приймає масив `Thread::Backtrace::Location`. + `Kernel#raise`, `Thread#raise` та `Fiber#raise` також приймають цей новий формат. [[Feature #13557]] + +* GC + + * Додано `GC.config`, щоб дозволити встановлювати конфігураційні змінні + збирача сміття. [[Feature #20443]] + + * Запроваджено параметр конфігурації GC `rgengc_allow_full_mark`. Коли `false`, + GC позначає лише молоді об'єкти. Типово `true`. [[Feature #20443]] + +* Ractor + + * `require` у Ractor дозволено. Процес `require` буде виконано в + основному Ractor. + Додано `Ractor._require(feature)` для виконання процесу `require` в + основному Ractor. + [[Feature #20627]] + + * Додано `Ractor.main?`. [[Feature #20627]] + + * Додано `Ractor.[]` і `Ractor.[]=`, щоб отримувати доступ до локального сховища ractor + поточного Ractor. [[Feature #20715]] + + * Додано `Ractor.store_if_absent(key){ init }` для ініціалізації локальних змінних ractor + у thread-safety. [[Feature #20875]] + +* Range + + * `Range#size` тепер викликає `TypeError`, якщо діапазон не є ітерованим. [[Misc #18984]] + + +## Оновлення стандартної бібліотеки + +Примітка: наведено лише помітні оновлення стандартних бібліотек. + +* RubyGems + * Додано параметр `--attestation` до `gem push`. Це дозволяє зберігати підпис у [sigstore.dev] + +* Bundler + * Додано налаштування `lockfile_checksums` для включення контрольних сум у нові lockfile + * Додано `bundle lock --add-checksums`, щоб додати контрольні суми до наявного lockfile + +* JSON + + * Покращення продуктивності `JSON.parse` приблизно у 1.5 раза швидше, ніж json-2.7.x. + +* Tempfile + + * Реалізовано ключовий аргумент `anonymous: true` для Tempfile.create. + `Tempfile.create(anonymous: true)` одразу видаляє створений тимчасовий файл. + Тож застосункам не потрібно видаляти файл. + [[Feature #20497]] + +* win32/sspi.rb + + * Цю бібліотеку винесено з репозиторію Ruby до [ruby/net-http-sspi]. + [[Feature #20775]] + +Наступні bundled gems підвищено зі статусу default gems. + +- mutex_m 0.3.0 +- getoptlong 0.2.1 +- base64 0.2.0 +- bigdecimal 3.1.8 +- observer 0.1.2 +- abbrev 0.1.2 +- resolv-replace 0.1.1 +- rinda 0.2.0 +- drb 2.2.1 +- nkf 0.2.0 +- syslog 0.2.0 +- csv 3.3.2 +- repl_type_completor 0.1.9 + +## Проблеми сумісності + +* Змінено повідомлення про помилки та відображення стеків викликів. + * Як початкову лапку використовують одинарну лапку замість зворотної. [[Feature #16495]] + * Перед назвою методу відображають назву класу (лише коли клас має постійну назву). [[Feature #19117]] + * Методи `Kernel#caller`, `Thread::Backtrace::Location` тощо також змінено відповідно. + + ``` + Old: + test.rb:1:in `foo': undefined method `time' for an instance of Integer + from test.rb:2:in `
' + + New: + test.rb:1:in 'Object#foo': undefined method 'time' for an instance of Integer + from test.rb:2:in '
' + ``` + +* Змінено формат виводу `Hash#inspect`. [[Bug #20433]] + + * Ключі-символи відображаються з використанням сучасного синтаксису ключів символів: `"{user: 1}"` + * Інші ключі тепер мають пробіли навколо `=>`: `'{"user" => 1}'`, тоді як раніше їх не було: `'{"user"=>1}'` + +* `Kernel#Float()` тепер приймає десятковий рядок без дробової частини. [[Feature #20705]] + + ```rb + Float("1.") #=> 1.0 (раніше було виключення ArgumentError) + Float("1.E-1") #=> 0.1 (раніше було виключення ArgumentError) + ``` + +* `String#to_f` тепер приймає десятковий рядок без дробової частини. Зверніть увагу, що результат змінюється, якщо вказано експоненту. [[Feature #20705]] + + ```rb + "1.".to_f #=> 1.0 + "1.E-1".to_f #=> 0.1 (раніше поверталося 1.0) + ``` + +* `Refinement#refined_class` було вилучено. [[Feature #19714]] + +## Проблеми сумісності стандартної бібліотеки + +* DidYouMean + + * `DidYouMean::SPELL_CHECKERS[]=` та `DidYouMean::SPELL_CHECKERS.merge!` вилучено. + +* Net::HTTP + + * Вилучено такі застарілі константи: + * `Net::HTTP::ProxyMod` + * `Net::NetPrivate::HTTPRequest` + * `Net::HTTPInformationCode` + * `Net::HTTPSuccessCode` + * `Net::HTTPRedirectionCode` + * `Net::HTTPRetriableCode` + * `Net::HTTPClientErrorCode` + * `Net::HTTPFatalErrorCode` + * `Net::HTTPServerErrorCode` + * `Net::HTTPResponseReceiver` + * `Net::HTTPResponceReceiver` + + Ці константи були застарілими з 2012 року. + +* Timeout + + * Відхиляє від'ємні значення для Timeout.timeout. [[Bug #20795]] + +* URI + + * Парсер за замовчуванням перемкнено на сумісний з RFC 3986 замість RFC 2396. + [[Bug #19266]] + +## Оновлення C API + +* `rb_newobj` та `rb_newobj_of` (і відповідні макроси `RB_NEWOBJ`, `RB_NEWOBJ_OF`, `NEWOBJ`, `NEWOBJ_OF`) вилучено. [[Feature #20265]] +* Вилучено застарілу функцію `rb_gc_force_recycle`. [[Feature #18290]] + +## Інші зміни + +* Передавання блоку в метод, який не використовує переданий блок, показуватиме + попередження в режимі verbose (`-w`). + [[Feature #15554]] + +* Перевизначення деяких базових методів, які спеціально оптимізовані інтерпретатором + та JIT, таких як `String.freeze` або `Integer#+`, тепер видає попередження про + клас продуктивності (`-W:performance` або `Warning[:performance] = true`). + [[Feature #20429]] + +Детальніше див. [NEWS](https://docs.ruby-lang.org/en/3.4/NEWS_md.html) +або [журнали комітів](https://github.com/ruby/ruby/compare/v3_3_0...{{ release.tag }}) +для подробиць. + +Унаслідок цих змін [{{ release.stats.files_changed }} файлів змінено, {{ release.stats.insertions }} вставок(+), {{ release.stats.deletions }} видалень(-)](https://github.com/ruby/ruby/compare/v3_3_0...{{ release.tag }}#file_bucket) +з часу Ruby 3.3.0! + +З Різдвом, зі святами, і приємного програмування з Ruby 3.4! + +## Завантаження + +* <{{ release.url.gz }}> + + SIZE: {{ release.size.gz }} + SHA1: {{ release.sha1.gz }} + SHA256: {{ release.sha256.gz }} + SHA512: {{ release.sha512.gz }} + +* <{{ release.url.xz }}> + + SIZE: {{ release.size.xz }} + SHA1: {{ release.sha1.xz }} + SHA256: {{ release.sha256.xz }} + SHA512: {{ release.sha512.xz }} + +* <{{ release.url.zip }}> + + SIZE: {{ release.size.zip }} + SHA1: {{ release.sha1.zip }} + SHA256: {{ release.sha256.zip }} + SHA512: {{ release.sha512.zip }} + +## Що таке Ruby + +Ruby уперше розробив Matz (Yukihiro Matsumoto) у 1993 році, +і зараз вона розвивається як Open Source. Вона працює на багатьох платформах +і використовується по всьому світу, особливо для веброзробки. + +[Feature #13557]: https://bugs.ruby-lang.org/issues/13557 +[Feature #15554]: https://bugs.ruby-lang.org/issues/15554 +[Feature #16495]: https://bugs.ruby-lang.org/issues/16495 +[Feature #18290]: https://bugs.ruby-lang.org/issues/18290 +[Feature #18980]: https://bugs.ruby-lang.org/issues/18980 +[Misc #18984]: https://bugs.ruby-lang.org/issues/18984 +[Feature #19117]: https://bugs.ruby-lang.org/issues/19117 +[Bug #19266]: https://bugs.ruby-lang.org/issues/19266 +[Feature #19714]: https://bugs.ruby-lang.org/issues/19714 +[Bug #19918]: https://bugs.ruby-lang.org/issues/19918 +[Bug #20064]: https://bugs.ruby-lang.org/issues/20064 +[Feature #20182]: https://bugs.ruby-lang.org/issues/20182 +[Feature #20205]: https://bugs.ruby-lang.org/issues/20205 +[Bug #20218]: https://bugs.ruby-lang.org/issues/20218 +[Feature #20265]: https://bugs.ruby-lang.org/issues/20265 +[Feature #20351]: https://bugs.ruby-lang.org/issues/20351 +[Feature #20429]: https://bugs.ruby-lang.org/issues/20429 +[Feature #20443]: https://bugs.ruby-lang.org/issues/20443 +[Feature #20470]: https://bugs.ruby-lang.org/issues/20470 +[Feature #20497]: https://bugs.ruby-lang.org/issues/20497 +[Feature #20564]: https://bugs.ruby-lang.org/issues/20564 +[Bug #20620]: https://bugs.ruby-lang.org/issues/20620 +[Feature #20627]: https://bugs.ruby-lang.org/issues/20627 +[Feature #20705]: https://bugs.ruby-lang.org/issues/20705 +[Feature #20715]: https://bugs.ruby-lang.org/issues/20715 +[Feature #20775]: https://bugs.ruby-lang.org/issues/20775 +[Bug #20795]: https://bugs.ruby-lang.org/issues/20795 +[Bug #20433]: https://bugs.ruby-lang.org/issues/20433 +[Feature #20860]: https://bugs.ruby-lang.org/issues/20860 +[Feature #20875]: https://bugs.ruby-lang.org/issues/20875 +[Feature #20884]: https://bugs.ruby-lang.org/issues/20884 +[sigstore.dev]: https://www.sigstore.dev +[ruby/net-http-sspi]: https://github.com/ruby/net-http-sspi diff --git a/ua/news/_posts/2024-12-25-ruby-3-4-1-released.md b/ua/news/_posts/2024-12-25-ruby-3-4-1-released.md new file mode 100644 index 0000000000..fcdc895702 --- /dev/null +++ b/ua/news/_posts/2024-12-25-ruby-3-4-1-released.md @@ -0,0 +1,39 @@ +--- +layout: news_post +title: "Вийшов Ruby 3.4.1" +author: "naruse" +translator: "Andrii Furmanets" +date: 2024-12-25 00:00:00 +0000 +lang: ua +--- + +Вийшов Ruby 3.4.1. + +Це виправляє опис версії. + +Докладніше див. [релізи на GitHub](https://github.com/ruby/ruby/releases/tag/v3_4_1). + +## Завантаження + +{% assign release = site.data.releases | where: "version", "3.4.1" | first %} + +* <{{ release.url.gz }}> + + SIZE: {{ release.size.gz }} + SHA1: {{ release.sha1.gz }} + SHA256: {{ release.sha256.gz }} + SHA512: {{ release.sha512.gz }} + +* <{{ release.url.xz }}> + + SIZE: {{ release.size.xz }} + SHA1: {{ release.sha1.xz }} + SHA256: {{ release.sha256.xz }} + SHA512: {{ release.sha512.xz }} + +* <{{ release.url.zip }}> + + SIZE: {{ release.size.zip }} + SHA1: {{ release.sha1.zip }} + SHA256: {{ release.sha256.zip }} + SHA512: {{ release.sha512.zip }} diff --git a/ua/news/_posts/2025-01-15-ruby-3-3-7-released.md b/ua/news/_posts/2025-01-15-ruby-3-3-7-released.md new file mode 100644 index 0000000000..6066cd3de1 --- /dev/null +++ b/ua/news/_posts/2025-01-15-ruby-3-3-7-released.md @@ -0,0 +1,43 @@ +--- +layout: news_post +title: "Вийшов Ruby 3.3.7" +author: k0kubun +translator: "Andrii Furmanets" +date: 2025-01-15 07:51:59 +0000 +lang: ua +--- + +Вийшов Ruby 3.3.7. + +Це планове оновлення з незначними виправленнями помилок. +Докладніше див. [примітки до релізу на GitHub](https://github.com/ruby/ruby/releases/tag/v3_3_7). + +## Завантаження + +{% assign release = site.data.releases | where: "version", "3.3.7" | first %} + +* <{{ release.url.gz }}> + + SIZE: {{ release.size.gz }} + SHA1: {{ release.sha1.gz }} + SHA256: {{ release.sha256.gz }} + SHA512: {{ release.sha512.gz }} + +* <{{ release.url.xz }}> + + SIZE: {{ release.size.xz }} + SHA1: {{ release.sha1.xz }} + SHA256: {{ release.sha256.xz }} + SHA512: {{ release.sha512.xz }} + +* <{{ release.url.zip }}> + + SIZE: {{ release.size.zip }} + SHA1: {{ release.sha1.zip }} + SHA256: {{ release.sha256.zip }} + SHA512: {{ release.sha512.zip }} + +## Коментар до релізу + +Багато комітерів, розробників і користувачів, які надсилали звіти про помилки, допомогли нам зробити цей реліз. +Дякуємо за їхній внесок. diff --git a/ua/news/_posts/2025-02-04-ruby-3-2-7-released.md b/ua/news/_posts/2025-02-04-ruby-3-2-7-released.md new file mode 100644 index 0000000000..cddec25a51 --- /dev/null +++ b/ua/news/_posts/2025-02-04-ruby-3-2-7-released.md @@ -0,0 +1,42 @@ +--- +layout: news_post +title: "Вийшов Ruby 3.2.7" +author: nagachika +translator: "Andrii Furmanets" +date: 2025-02-04 12:00:00 +0000 +lang: ua +--- + +Вийшов Ruby 3.2.7. + +Докладніше див. [релізи на GitHub](https://github.com/ruby/ruby/releases/tag/v3_2_7). + +## Завантаження + +{% assign release = site.data.releases | where: "version", "3.2.7" | first %} + +* <{{ release.url.gz }}> + + SIZE: {{ release.size.gz }} + SHA1: {{ release.sha1.gz }} + SHA256: {{ release.sha256.gz }} + SHA512: {{ release.sha512.gz }} + +* <{{ release.url.xz }}> + + SIZE: {{ release.size.xz }} + SHA1: {{ release.sha1.xz }} + SHA256: {{ release.sha256.xz }} + SHA512: {{ release.sha512.xz }} + +* <{{ release.url.zip }}> + + SIZE: {{ release.size.zip }} + SHA1: {{ release.sha1.zip }} + SHA256: {{ release.sha256.zip }} + SHA512: {{ release.sha512.zip }} + +## Коментар до релізу + +Багато комітерів, розробників і користувачів, які надсилали звіти про помилки, допомогли нам зробити цей реліз. +Дякуємо за їхній внесок. diff --git a/ua/news/_posts/2025-02-10-dos-net-imap-cve-2025-25186.md b/ua/news/_posts/2025-02-10-dos-net-imap-cve-2025-25186.md new file mode 100644 index 0000000000..6531e6bded --- /dev/null +++ b/ua/news/_posts/2025-02-10-dos-net-imap-cve-2025-25186.md @@ -0,0 +1,29 @@ +--- +layout: news_post +title: "CVE-2025-25186: DoS-вразливість у net-imap" +author: "nevans" +translator: "Andrii Furmanets" +date: 2025-02-10 03:00:00 +0000 +tags: security +lang: ua +--- + +Існує можливість DoS-атаки в gem net-imap. Цій вразливості присвоєно ідентифікатор CVE [CVE-2025-25186](https://www.cve.org/CVERecord?id=CVE-2025-25186). Рекомендуємо оновити gem net-imap. + +## Деталі + +Зловмисний сервер може надсилати сильно стиснені дані uid-set, які автоматично читаються потоком отримання клієнта. Парсер відповіді використовує Range#to_a для перетворення даних uid-set на масиви цілих чисел без обмеження розгорнутого розміру діапазонів. + +Будь ласка, оновіть gem net-imap до версії 0.3.8, 0.4.19, 0.5.6 або новішої. + +## Уражені версії + +* версії gem net-imap 0.3.2-0.3.7, 0.4.0-0.4.18 та 0.5.0-0.5.5 (включно). + +## Подяки + +Дякуємо [manun](https://hackerone.com/manun) за виявлення цієї проблеми. + +## Історія + +* Початково опубліковано 2025-02-10 03:00:00 (UTC) diff --git a/ua/news/_posts/2025-02-14-ruby-3-4-2-released.md b/ua/news/_posts/2025-02-14-ruby-3-4-2-released.md new file mode 100644 index 0000000000..565b48ef35 --- /dev/null +++ b/ua/news/_posts/2025-02-14-ruby-3-4-2-released.md @@ -0,0 +1,50 @@ +--- +layout: news_post +title: "Вийшов Ruby 3.4.2" +author: k0kubun +translator: "Andrii Furmanets" +date: 2025-02-14 21:55:17 +0000 +lang: ua +--- + +Вийшов Ruby 3.4.2. + +Це планове оновлення з виправленнями помилок. Докладніше див. +[примітки до релізу на GitHub](https://github.com/ruby/ruby/releases/tag/v3_4_2). + +## Графік релізів + +Ми плануємо випускати найновішу стабільну версію Ruby (зараз Ruby 3.4) кожні 2 місяці. +Ruby 3.4.3 буде випущено в квітні, 3.4.4 у червні, 3.4.5 у серпні, 3.4.6 у жовтні, а 3.4.7 у грудні. + +Якщо з'явиться зміна, що вплине на значну кількість користувачів, ці версії можуть вийти раніше, ніж очікувалося. + +## Завантаження + +{% assign release = site.data.releases | where: "version", "3.4.2" | first %} + +* <{{ release.url.gz }}> + + SIZE: {{ release.size.gz }} + SHA1: {{ release.sha1.gz }} + SHA256: {{ release.sha256.gz }} + SHA512: {{ release.sha512.gz }} + +* <{{ release.url.xz }}> + + SIZE: {{ release.size.xz }} + SHA1: {{ release.sha1.xz }} + SHA256: {{ release.sha256.xz }} + SHA512: {{ release.sha512.xz }} + +* <{{ release.url.zip }}> + + SIZE: {{ release.size.zip }} + SHA1: {{ release.sha1.zip }} + SHA256: {{ release.sha256.zip }} + SHA512: {{ release.sha512.zip }} + +## Коментар до релізу + +Багато комітерів, розробників і користувачів, які надсилали звіти про помилки, допомогли нам зробити цей реліз. +Дякуємо за їхній внесок. diff --git a/ua/news/_posts/2025-02-26-security-advisories.md b/ua/news/_posts/2025-02-26-security-advisories.md new file mode 100644 index 0000000000..b1bf0737e7 --- /dev/null +++ b/ua/news/_posts/2025-02-26-security-advisories.md @@ -0,0 +1,69 @@ +--- +layout: news_post +title: "Повідомлення з безпеки: CVE-2025-27219, CVE-2025-27220 та CVE-2025-27221" +author: "hsbt" +translator: "Andrii Furmanets" +date: 2025-02-26 07:00:00 +0000 +tags: security +lang: ua +--- + +Ми опублікували повідомлення з безпеки щодо CVE-2025-27219, CVE-2025-27220 та CVE-2025-27221. Деталі нижче. + +## CVE-2025-27219: Відмова в обслуговуванні в `CGI::Cookie.parse`. + +Існує можливість DoS-атаки в gem cgi. Цій вразливості присвоєно ідентифікатор CVE [CVE-2025-27219](https://www.cve.org/CVERecord?id=CVE-2025-27219). Рекомендуємо оновити gem cgi. + +### Деталі + +У деяких випадках `CGI::Cookie.parse` працював за надлінійний час при розборі рядка cookie. Подача зловмисно сформованого рядка cookie до методу могла призвести до відмови в обслуговуванні. + +Будь ласка, оновіть gem cgi до версії 0.3.5.1, 0.3.7, 0.4.2 або новішої. + +### Уражені версії + +* версії gem cgi <= 0.3.5, 0.3.6, 0.4.0 та 0.4.1. + +### Подяки + +Дякуємо [lio346](https://hackerone.com/lio346) за виявлення цієї проблеми. Також дякуємо [mame](https://github.com/mame) за виправлення цієї вразливості. + +## CVE-2025-27220: ReDoS у `CGI::Util#escapeElement`. + +Існує можливість відмови в обслуговуванні через регулярні вирази (ReDoS) в gem cgi. Цій вразливості присвоєно ідентифікатор CVE [CVE-2025-27220](https://www.cve.org/CVERecord?id=CVE-2025-27220). Рекомендуємо оновити gem cgi. + +### Деталі + +Регулярний вираз, що використовується в `CGI::Util#escapeElement`, вразливий до ReDoS. Спеціально сформований ввід міг призвести до високого навантаження на CPU. + +Ця вразливість впливає лише на Ruby 3.1 і 3.2. Якщо ви використовуєте ці версії, будь ласка, оновіть gem cgi до версії 0.3.5.1, 0.3.7, 0.4.2 або новішої. + +### Уражені версії + +* версії gem cgi <= 0.3.5, 0.3.6, 0.4.0 та 0.4.1. + +### Подяки + +Дякуємо [svalkanov](https://hackerone.com/svalkanov) за виявлення цієї проблеми. Також дякуємо [nobu](https://github.com/nobu) за виправлення цієї вразливості. + +## CVE-2025-27221: витік userinfo у `URI#join`, `URI#merge` та `URI#+`. + +Існує можливість витоку userinfo в gem uri. Цій вразливості присвоєно ідентифікатор CVE [CVE-2025-27221](https://www.cve.org/CVERecord?id=CVE-2025-27221). Рекомендуємо оновити gem uri. + +### Деталі + +Методи `URI#join`, `URI#merge` та `URI#+` зберігали userinfo (наприклад, `user:password`) навіть після заміни хоста. Під час формування URL на зловмисний хост із URL, що містить секретний userinfo, та подальшого переходу за таким URL міг відбутися небажаний витік userinfo. + +Будь ласка, оновіть gem uri до версії 0.11.3, 0.12.4, 0.13.2, 1.0.3 або новішої. + +### Уражені версії + +* версії gem uri < 0.11.3, 0.12.0-0.12.3, 0.13.0, 0.13.1 та 1.0.0-1.0.2. + +### Подяки + +Дякуємо [Tsubasa Irisawa (lambdasawa)](https://hackerone.com/lambdasawa) за виявлення цієї проблеми. Також дякуємо [nobu](https://github.com/nobu) за додаткові виправлення цієї вразливості. + +## Історія + +* Початково опубліковано 2025-02-26 7:00:00 (UTC) diff --git a/ua/news/_posts/2025-03-26-ruby-3-1-7-released.md b/ua/news/_posts/2025-03-26-ruby-3-1-7-released.md new file mode 100644 index 0000000000..56ba2bc99b --- /dev/null +++ b/ua/news/_posts/2025-03-26-ruby-3-1-7-released.md @@ -0,0 +1,46 @@ +--- +layout: news_post +title: "Вийшов Ruby 3.1.7" +author: hsbt +translator: "Andrii Furmanets" +date: 2025-03-26 04:44:27 +0000 +lang: ua +--- + +Вийшов Ruby 3.1.7. Цей реліз містить [виправлення CVE-2025-27219, CVE-2025-27220 та CVE-2025-27221](/ua/news/2025/02/26/security-advisories/) і оновлює вбудовані gems REXML та RSS. + +Докладніше див. [релізи на GitHub](https://github.com/ruby/ruby/releases/tag/v3_1_7). + +Ця версія є фінальним релізом лінійки Ruby 3.1. Ми більше не надаватимемо оновлень, зокрема виправлень безпеки, для лінійки Ruby 3.1. + +Рекомендуємо оновитися до Ruby 3.3 або 3.4. + +## Завантаження + +{% assign release = site.data.releases | where: "version", "3.1.7" | first %} + +* <{{ release.url.gz }}> + + SIZE: {{ release.size.gz }} + SHA1: {{ release.sha1.gz }} + SHA256: {{ release.sha256.gz }} + SHA512: {{ release.sha512.gz }} + +* <{{ release.url.xz }}> + + SIZE: {{ release.size.xz }} + SHA1: {{ release.sha1.xz }} + SHA256: {{ release.sha256.xz }} + SHA512: {{ release.sha512.xz }} + +* <{{ release.url.zip }}> + + SIZE: {{ release.size.zip }} + SHA1: {{ release.sha1.zip }} + SHA256: {{ release.sha256.zip }} + SHA512: {{ release.sha512.zip }} + +## Коментар до релізу + +Багато комітерів, розробників і користувачів, які надсилали звіти про помилки, допомогли нам зробити цей реліз. +Дякуємо за їхній внесок. diff --git a/ua/news/_posts/2025-03-26-ruby-3-2-8-released.md b/ua/news/_posts/2025-03-26-ruby-3-2-8-released.md new file mode 100644 index 0000000000..f45ddd6dc3 --- /dev/null +++ b/ua/news/_posts/2025-03-26-ruby-3-2-8-released.md @@ -0,0 +1,46 @@ +--- +layout: news_post +title: "Вийшов Ruby 3.2.8" +author: hsbt +translator: "Andrii Furmanets" +date: 2025-03-26 04:45:01 +0000 +lang: ua +--- + +Вийшов Ruby 3.2.8. Цей реліз містить [виправлення CVE-2025-27219, CVE-2025-27220 та CVE-2025-27221](/ua/news/2025/02/26/security-advisories/). + +Докладніше див. [релізи на GitHub](https://github.com/ruby/ruby/releases/tag/v3_2_8). + +Ця версія є останньою в режимі звичайної підтримки для лінійки Ruby 3.2. Ми виправлятимемо лише проблеми безпеки для Ruby 3.2 до кінця березня 2026 року. + +Рекомендуємо оновитися до Ruby 3.3 або 3.4. + +## Завантаження + +{% assign release = site.data.releases | where: "version", "3.2.8" | first %} + +* <{{ release.url.gz }}> + + SIZE: {{ release.size.gz }} + SHA1: {{ release.sha1.gz }} + SHA256: {{ release.sha256.gz }} + SHA512: {{ release.sha512.gz }} + +* <{{ release.url.xz }}> + + SIZE: {{ release.size.xz }} + SHA1: {{ release.sha1.xz }} + SHA256: {{ release.sha256.xz }} + SHA512: {{ release.sha512.xz }} + +* <{{ release.url.zip }}> + + SIZE: {{ release.size.zip }} + SHA1: {{ release.sha1.zip }} + SHA256: {{ release.sha256.zip }} + SHA512: {{ release.sha512.zip }} + +## Коментар до релізу + +Багато комітерів, розробників і користувачів, які надсилали звіти про помилки, допомогли нам зробити цей реліз. +Дякуємо за їхній внесок. diff --git a/ua/news/_posts/2025-04-09-ruby-3-3-8-released.md b/ua/news/_posts/2025-04-09-ruby-3-3-8-released.md new file mode 100644 index 0000000000..56175a0792 --- /dev/null +++ b/ua/news/_posts/2025-04-09-ruby-3-3-8-released.md @@ -0,0 +1,42 @@ +--- +layout: news_post +title: "Вийшов Ruby 3.3.8" +author: nagachika +translator: "Andrii Furmanets" +date: 2025-04-09 11:00:00 +0000 +lang: ua +--- + +Вийшов Ruby 3.3.8. + +Докладніше див. [релізи на GitHub](https://github.com/ruby/ruby/releases/tag/v3_3_8). + +## Завантаження + +{% assign release = site.data.releases | where: "version", "3.3.8" | first %} + +* <{{ release.url.gz }}> + + SIZE: {{ release.size.gz }} + SHA1: {{ release.sha1.gz }} + SHA256: {{ release.sha256.gz }} + SHA512: {{ release.sha512.gz }} + +* <{{ release.url.xz }}> + + SIZE: {{ release.size.xz }} + SHA1: {{ release.sha1.xz }} + SHA256: {{ release.sha256.xz }} + SHA512: {{ release.sha512.xz }} + +* <{{ release.url.zip }}> + + SIZE: {{ release.size.zip }} + SHA1: {{ release.sha1.zip }} + SHA256: {{ release.sha256.zip }} + SHA512: {{ release.sha512.zip }} + +## Коментар до релізу + +Багато комітерів, розробників і користувачів, які надсилали звіти про помилки, допомогли нам зробити цей реліз. +Дякуємо за їхній внесок. diff --git a/ua/news/_posts/2025-04-14-ruby-3-4-3-released.md b/ua/news/_posts/2025-04-14-ruby-3-4-3-released.md new file mode 100644 index 0000000000..3e926eef33 --- /dev/null +++ b/ua/news/_posts/2025-04-14-ruby-3-4-3-released.md @@ -0,0 +1,50 @@ +--- +layout: news_post +title: "Вийшов Ruby 3.4.3" +author: k0kubun +translator: "Andrii Furmanets" +date: 2025-04-14 08:06:57 +0000 +lang: ua +--- + +Вийшов Ruby 3.4.3. + +Це планове оновлення з виправленнями помилок. Докладніше див. +[примітки до релізу на GitHub](https://github.com/ruby/ruby/releases/tag/v3_4_3). + +## Графік релізів + +Ми плануємо випускати найновішу стабільну версію Ruby (зараз Ruby 3.4) кожні 2 місяці. +Ruby 3.4.4 буде випущено в червні, 3.4.5 у серпні, 3.4.6 у жовтні, а 3.4.7 у грудні. + +Якщо з'явиться зміна, що вплине на значну кількість користувачів, ці версії можуть вийти раніше, ніж очікувалося. + +## Завантаження + +{% assign release = site.data.releases | where: "version", "3.4.3" | first %} + +* <{{ release.url.gz }}> + + SIZE: {{ release.size.gz }} + SHA1: {{ release.sha1.gz }} + SHA256: {{ release.sha256.gz }} + SHA512: {{ release.sha512.gz }} + +* <{{ release.url.xz }}> + + SIZE: {{ release.size.xz }} + SHA1: {{ release.sha1.xz }} + SHA256: {{ release.sha256.xz }} + SHA512: {{ release.sha512.xz }} + +* <{{ release.url.zip }}> + + SIZE: {{ release.size.zip }} + SHA1: {{ release.sha1.zip }} + SHA256: {{ release.sha256.zip }} + SHA512: {{ release.sha512.zip }} + +## Коментар до релізу + +Багато комітерів, розробників і користувачів, які надсилали звіти про помилки, допомогли нам зробити цей реліз. +Дякуємо за їхній внесок. diff --git a/ua/news/_posts/2025-04-18-ruby-3-5-0-preview1-released.md b/ua/news/_posts/2025-04-18-ruby-3-5-0-preview1-released.md new file mode 100644 index 0000000000..d6eb6031d3 --- /dev/null +++ b/ua/news/_posts/2025-04-18-ruby-3-5-0-preview1-released.md @@ -0,0 +1,109 @@ +--- +layout: news_post +title: "Вийшов Ruby 3.5.0 preview1" +author: "naruse" +translator: "Andrii Furmanets" +date: 2025-04-18 00:00:00 +0000 +lang: ua +--- + +{% assign release = site.data.releases | where: "version", "3.5.0-preview1" | first %} +Раді повідомити про вихід Ruby {{ release.version }}. Ruby 3.5 оновлює версію Unicode до 15.1.0 тощо. + +## Зміни мови + +* `*nil` більше не викликає `nil.to_a`, подібно до того, як `**nil` не викликає `nil.to_hash`. [[Feature #21047]] + +## Оновлення основних класів + +Примітка: наведено лише помітні оновлення основних класів. + +* Binding + + * `Binding#local_variables` більше не містить нумерованих параметрів. + Також `Binding#local_variable_get` і `Binding#local_variable_set` відмовляються працювати з нумерованими параметрами. + [[Bug #21049]] + +* IO + + * `IO.select` приймає +Float::INFINITY+ як аргумент тайм-ауту. + [[Feature #20610]] + +* String + + * Оновлено Unicode до версії 15.1.0 та Emoji до 15.1. [[Feature #19908]] + (також стосується Regexp) + + +## Оновлення стандартної бібліотеки + +Примітка: наведено лише помітні оновлення стандартних бібліотек. + +* ostruct 0.6.1 +* pstore 0.2.0 +* benchmark 0.4.0 +* logger 1.7.0 +* rdoc 6.13.1 +* win32ole 1.9.2 +* irb 1.15.2 +* reline 0.6.1 +* readline 0.0.4 +* fiddle 1.1.6 + +## Проблеми сумісності + +Примітка: без урахування виправлень помилок у функціях. + + + +## Проблеми сумісності стандартної бібліотеки + + +## Оновлення C API + + + +## Інші зміни + + + +Детальніше див. [NEWS](https://github.com/ruby/ruby/blob/{{ release.tag }}/NEWS.md) +або [журнали комітів](https://github.com/ruby/ruby/compare/v3_4_0...{{ release.tag }}) +для подробиць. + +Унаслідок цих змін [{{ release.stats.files_changed }} файлів змінено, {{ release.stats.insertions }} вставок(+), {{ release.stats.deletions }} видалень(-)](https://github.com/ruby/ruby/compare/v3_3_0...{{ release.tag }}#file_bucket) +з часу Ruby 3.4.0! + +## Завантаження + +* <{{ release.url.gz }}> + + SIZE: {{ release.size.gz }} + SHA1: {{ release.sha1.gz }} + SHA256: {{ release.sha256.gz }} + SHA512: {{ release.sha512.gz }} + +* <{{ release.url.xz }}> + + SIZE: {{ release.size.xz }} + SHA1: {{ release.sha1.xz }} + SHA256: {{ release.sha256.xz }} + SHA512: {{ release.sha512.xz }} + +* <{{ release.url.zip }}> + + SIZE: {{ release.size.zip }} + SHA1: {{ release.sha1.zip }} + SHA256: {{ release.sha256.zip }} + SHA512: {{ release.sha512.zip }} + +## Що таке Ruby + +Ruby уперше розробив Matz (Yukihiro Matsumoto) у 1993 році, +і зараз вона розвивається як Open Source. Вона працює на багатьох платформах +і використовується по всьому світу, особливо для веброзробки. + +[Feature #21047]: https://bugs.ruby-lang.org/issues/21047 +[Bug #21049]: https://bugs.ruby-lang.org/issues/21049 +[Feature #20610]: https://bugs.ruby-lang.org/issues/20610 +[Feature #19908]: https://bugs.ruby-lang.org/issues/19908 diff --git a/ua/news/_posts/2025-04-28-dos-net-imap-cve-2025-43857.md b/ua/news/_posts/2025-04-28-dos-net-imap-cve-2025-43857.md new file mode 100644 index 0000000000..4bc59e1c29 --- /dev/null +++ b/ua/news/_posts/2025-04-28-dos-net-imap-cve-2025-43857.md @@ -0,0 +1,35 @@ +--- +layout: news_post +title: "CVE-2025-43857: DoS-вразливість у net-imap" +author: "nevans" +translator: "Andrii Furmanets" +date: 2025-04-28 16:02:04 +0000 +tags: security +lang: ua +--- + +Існує можливість DoS-атаки в gem net-imap. Цій вразливості присвоєно ідентифікатор CVE [CVE-2025-43857]. Рекомендуємо оновити gem net-imap. + +## Деталі + +Зловмисний сервер може надіслати "literal" лічильник байтів, який автоматично читається потоком отримання клієнта. Читач відповіді негайно виділяє пам'ять для кількості байтів, указаних у відповіді сервера. Це не повинно бути проблемою при безпечному підключенні до надійних IMAP-серверів із коректною поведінкою. Вразливість стосується небезпечних підключень і помилкових, ненадійних або скомпрометованих серверів (наприклад, підключення до хоста, заданого користувачем). + +Будь ласка, оновіть gem net-imap до версії 0.2.5, 0.3.9, 0.4.20, 0.5.7 або новішої. + +Під час підключення до ненадійних серверів або використання небезпечного з'єднання `max_response_size` і обробники відповідей мають бути налаштовані відповідно для обмеження споживання пам'яті. Докладніше див. [GHSA-j3g3-5qv5-52mj]. + +## Уражені версії + +версії gem net-imap <= 0.2.4, 0.3.0-0.3.8, 0.4.0-0.4.19 та 0.5.0-0.5.6. + +## Подяки + +Дякуємо [Masamune] за виявлення цієї проблеми. + +## Історія + +* Початково опубліковано 2025-04-28 16:02:04 (UTC) + +[CVE-2025-43857]: https://www.cve.org/CVERecord?id=CVE-2025-43857 +[GHSA-j3g3-5qv5-52mj]: https://github.com/ruby/net-imap/security/advisories/GHSA-j3g3-5qv5-52mj +[Masamune]: https://hackerone.com/masamune_ diff --git a/ua/news/_posts/2025-05-14-ruby-3-4-4-released.md b/ua/news/_posts/2025-05-14-ruby-3-4-4-released.md new file mode 100644 index 0000000000..df9eae767f --- /dev/null +++ b/ua/news/_posts/2025-05-14-ruby-3-4-4-released.md @@ -0,0 +1,53 @@ +--- +layout: news_post +title: "Вийшов Ruby 3.4.4" +author: k0kubun +translator: "Andrii Furmanets" +date: 2025-05-14 18:20:00 +0000 +lang: ua +--- + +Вийшов Ruby 3.4.4. + +Цей реліз містить виправлення помилки YJIT, пов'язаної з локальними змінними, та усуває проблему збирання на Windows при використанні GCC 15. +Його випущено раніше графіка, щоб якнайшвидше надати ці виправлення. +Також включено ще кілька виправлень помилок. + +Докладніше див. [примітки до релізу на GitHub](https://github.com/ruby/ruby/releases/tag/v3_4_4). + +## Графік релізів + +Ми плануємо випускати найновішу стабільну версію Ruby (зараз Ruby 3.4) кожні два місяці після останнього релізу. +Після цього релізу (3.4.4) Ruby 3.4.5 заплановано на липень, 3.4.6 на вересень, 3.4.7 на листопад, а 3.4.8 на січень. + +Якщо з'явиться зміна, що істотно впливає на користувачів, реліз може відбутися раніше запланованого, а подальший графік відповідно зміститься. + +## Завантаження + +{% assign release = site.data.releases | where: "version", "3.4.4" | first %} + +* <{{ release.url.gz }}> + + SIZE: {{ release.size.gz }} + SHA1: {{ release.sha1.gz }} + SHA256: {{ release.sha256.gz }} + SHA512: {{ release.sha512.gz }} + +* <{{ release.url.xz }}> + + SIZE: {{ release.size.xz }} + SHA1: {{ release.sha1.xz }} + SHA256: {{ release.sha256.xz }} + SHA512: {{ release.sha512.xz }} + +* <{{ release.url.zip }}> + + SIZE: {{ release.size.zip }} + SHA1: {{ release.sha1.zip }} + SHA256: {{ release.sha256.zip }} + SHA512: {{ release.sha512.zip }} + +## Коментар до релізу + +Багато комітерів, розробників і користувачів, які надсилали звіти про помилки, допомогли нам зробити цей реліз. +Дякуємо за їхній внесок. diff --git a/ua/news/_posts/2025-07-08-dos-resolv-cve-2025-24294.md b/ua/news/_posts/2025-07-08-dos-resolv-cve-2025-24294.md new file mode 100644 index 0000000000..d2d4621baf --- /dev/null +++ b/ua/news/_posts/2025-07-08-dos-resolv-cve-2025-24294.md @@ -0,0 +1,41 @@ +--- +layout: news_post +title: "CVE-2025-24294: Можлива відмова в обслуговуванні у gem resolv" +author: "mame" +translator: "Andrii Furmanets" +date: 2025-07-08 07:00:00 +0000 +tags: security +lang: ua +--- + +Виявлено вразливість відмови в обслуговуванні в gem `resolv`, що постачається з Ruby. +Цій вразливості присвоєно ідентифікатор CVE [CVE-2025-24294]. +Рекомендуємо оновити gem resolv. + +## Деталі + +Вразливість спричинена недостатньою перевіркою довжини розпакованого доменного імені в DNS-пакеті. + +Зловмисник може сформувати DNS-пакет, що містить сильно стиснене доменне ім'я. +Коли бібліотека resolv розбирає такий пакет, процес розпакування імені споживає багато ресурсів CPU, оскільки бібліотека не обмежує кінцеву довжину імені. + +Таке споживання ресурсів може призвести до зависання потоку застосунку, що спричиняє стан відмови в обслуговуванні. + +## Уражені версії + +Вразливість зачіпає gem resolv, що постачається з такими гілками Ruby: + +* Ruby 3.2: resolv версії 0.2.2 і раніші +* Ruby 3.3: resolv версії 0.3.0 +* Ruby 3.4: resolv версії 0.6.1 і раніші + +## Подяки + +Дякуємо [Manu] за виявлення цієї проблеми. + +## Історія + +* Початково опубліковано 2025-07-08 07:00:00 (UTC) + +[CVE-2025-24294]: https://www.cve.org/CVERecord?id=CVE-2025-24294 +[Manu]: https://hackerone.com/manun diff --git a/ua/news/_posts/2025-07-15-ruby-3-4-5-released.md b/ua/news/_posts/2025-07-15-ruby-3-4-5-released.md new file mode 100644 index 0000000000..b3e342b8b7 --- /dev/null +++ b/ua/news/_posts/2025-07-15-ruby-3-4-5-released.md @@ -0,0 +1,50 @@ +--- +layout: news_post +title: "Вийшов Ruby 3.4.5" +author: k0kubun +translator: "Andrii Furmanets" +date: 2025-07-15 17:00:00 +0000 +lang: ua +--- + +Вийшов Ruby 3.4.5. + +Це планове оновлення з виправленнями помилок і підтримкою GCC 15. Докладніше див. +[примітки до релізу на GitHub](https://github.com/ruby/ruby/releases/tag/v3_4_5). + +## Графік релізів + +Ми плануємо випускати найновішу стабільну версію Ruby (зараз Ruby 3.4) кожні два місяці після останнього релізу. +Ruby 3.4.6 заплановано на вересень, 3.4.7 на листопад, а 3.4.8 на січень. + +Якщо з'явиться зміна, що істотно впливає на користувачів, реліз може відбутися раніше запланованого, а подальший графік відповідно зміститься. + +## Завантаження + +{% assign release = site.data.releases | where: "version", "3.4.5" | first %} + +* <{{ release.url.gz }}> + + SIZE: {{ release.size.gz }} + SHA1: {{ release.sha1.gz }} + SHA256: {{ release.sha256.gz }} + SHA512: {{ release.sha512.gz }} + +* <{{ release.url.xz }}> + + SIZE: {{ release.size.xz }} + SHA1: {{ release.sha1.xz }} + SHA256: {{ release.sha256.xz }} + SHA512: {{ release.sha512.xz }} + +* <{{ release.url.zip }}> + + SIZE: {{ release.size.zip }} + SHA1: {{ release.sha1.zip }} + SHA256: {{ release.sha256.zip }} + SHA512: {{ release.sha512.zip }} + +## Коментар до релізу + +Багато комітерів, розробників і користувачів, які надсилали звіти про помилки, допомогли нам зробити цей реліз. +Дякуємо за їхній внесок. diff --git a/ua/news/_posts/2025-07-24-ruby-3-2-9-released.md b/ua/news/_posts/2025-07-24-ruby-3-2-9-released.md new file mode 100644 index 0000000000..9b97e70633 --- /dev/null +++ b/ua/news/_posts/2025-07-24-ruby-3-2-9-released.md @@ -0,0 +1,52 @@ +--- +layout: news_post +title: "Вийшов Ruby 3.2.9" +author: "hsbt" +translator: "Andrii Furmanets" +date: 2025-07-24 08:51:53 +0000 +lang: ua +--- + +Вийшов Ruby 3.2.9. + +Цей реліз містить такі виправлення безпеки: + +* [CVE-2025-24294: Можлива відмова в обслуговуванні в gem resolv](/ua/news/2025/07/08/dos-resolv-cve-2025-24294/) +* [CVE-2025-43857: DoS-вразливість у net-imap](/ua/news/2025/04/28/dos-net-imap-cve-2025-43857/) + +а також такі виправлення проблем зі збиранням: + +* GCC 15.1 +* Visual Studio 2022 Version 17.14 + +Докладніше див. [релізи на GitHub](https://github.com/ruby/ruby/releases/tag/v3_2_9). + +## Завантаження + +{% assign release = site.data.releases | where: "version", "3.2.9" | first %} + +* <{{ release.url.gz }}> + + SIZE: {{ release.size.gz }} + SHA1: {{ release.sha1.gz }} + SHA256: {{ release.sha256.gz }} + SHA512: {{ release.sha512.gz }} + +* <{{ release.url.xz }}> + + SIZE: {{ release.size.xz }} + SHA1: {{ release.sha1.xz }} + SHA256: {{ release.sha256.xz }} + SHA512: {{ release.sha512.xz }} + +* <{{ release.url.zip }}> + + SIZE: {{ release.size.zip }} + SHA1: {{ release.sha1.zip }} + SHA256: {{ release.sha256.zip }} + SHA512: {{ release.sha512.zip }} + +## Коментар до релізу + +Багато комітерів, розробників і користувачів, які надсилали звіти про помилки, допомогли нам зробити цей реліз. +Дякуємо за їхній внесок. diff --git a/ua/news/_posts/2025-07-24-ruby-3-3-9-released.md b/ua/news/_posts/2025-07-24-ruby-3-3-9-released.md new file mode 100644 index 0000000000..af2ca8a4e6 --- /dev/null +++ b/ua/news/_posts/2025-07-24-ruby-3-3-9-released.md @@ -0,0 +1,51 @@ +--- +layout: news_post +title: "Вийшов Ruby 3.3.9" +author: nagachika +translator: "Andrii Furmanets" +date: 2025-07-24 11:00:00 +0000 +lang: ua +--- + +Вийшов Ruby 3.3.9. + +Цей реліз містить таке виправлення безпеки для gem за замовчуванням: + +* [CVE-2025-24294: Можлива відмова в обслуговуванні в gem resolv](/ua/news/2025/07/08/dos-resolv-cve-2025-24294/) + +а також такі виправлення проблем зі збиранням: + +* GCC 15.1 +* Visual Studio 2022 Version 17.14 + +Докладніше див. [релізи на GitHub](https://github.com/ruby/ruby/releases/tag/v3_3_9). + +## Завантаження + +{% assign release = site.data.releases | where: "version", "3.3.9" | first %} + +* <{{ release.url.gz }}> + + SIZE: {{ release.size.gz }} + SHA1: {{ release.sha1.gz }} + SHA256: {{ release.sha256.gz }} + SHA512: {{ release.sha512.gz }} + +* <{{ release.url.xz }}> + + SIZE: {{ release.size.xz }} + SHA1: {{ release.sha1.xz }} + SHA256: {{ release.sha256.xz }} + SHA512: {{ release.sha512.xz }} + +* <{{ release.url.zip }}> + + SIZE: {{ release.size.zip }} + SHA1: {{ release.sha1.zip }} + SHA256: {{ release.sha256.zip }} + SHA512: {{ release.sha512.zip }} + +## Коментар до релізу + +Багато комітерів, розробників і користувачів, які надсилали звіти про помилки, допомогли нам зробити цей реліз. +Дякуємо за їхній внесок. diff --git a/ua/news/_posts/2025-09-16-ruby-3-4-6-released.md b/ua/news/_posts/2025-09-16-ruby-3-4-6-released.md new file mode 100644 index 0000000000..2149a418bf --- /dev/null +++ b/ua/news/_posts/2025-09-16-ruby-3-4-6-released.md @@ -0,0 +1,50 @@ +--- +layout: news_post +title: "Вийшов Ruby 3.4.6" +author: k0kubun +translator: "Andrii Furmanets" +date: 2025-09-16 00:00:00 +0000 +lang: ua +--- + +Вийшов Ruby 3.4.6. + +Це планове оновлення з виправленнями помилок. +Докладніше див. [примітки до релізу на GitHub](https://github.com/ruby/ruby/releases/tag/v3_4_6). + +## Графік релізів + +Ми плануємо випускати найновішу стабільну версію Ruby (зараз Ruby 3.4) кожні два місяці після останнього релізу. +Ruby 3.4.7 заплановано на листопад, а 3.4.8 на січень. + +Якщо з'явиться зміна, що істотно впливає на користувачів, реліз може відбутися раніше запланованого, а подальший графік відповідно зміститься. + +## Завантаження + +{% assign release = site.data.releases | where: "version", "3.4.6" | first %} + +* <{{ release.url.gz }}> + + SIZE: {{ release.size.gz }} + SHA1: {{ release.sha1.gz }} + SHA256: {{ release.sha256.gz }} + SHA512: {{ release.sha512.gz }} + +* <{{ release.url.xz }}> + + SIZE: {{ release.size.xz }} + SHA1: {{ release.sha1.xz }} + SHA256: {{ release.sha256.xz }} + SHA512: {{ release.sha512.xz }} + +* <{{ release.url.zip }}> + + SIZE: {{ release.size.zip }} + SHA1: {{ release.sha1.zip }} + SHA256: {{ release.sha256.zip }} + SHA512: {{ release.sha512.zip }} + +## Коментар до релізу + +Багато комітерів, розробників і користувачів, які надсилали звіти про помилки, допомогли нам зробити цей реліз. +Дякуємо за їхній внесок. diff --git a/ua/news/_posts/2025-09-18-dos-rexml-cve-2025-58767.md b/ua/news/_posts/2025-09-18-dos-rexml-cve-2025-58767.md new file mode 100644 index 0000000000..8d8d1cfd63 --- /dev/null +++ b/ua/news/_posts/2025-09-18-dos-rexml-cve-2025-58767.md @@ -0,0 +1,28 @@ +--- +layout: news_post +title: "CVE-2025-58767: DoS-вразливість у REXML" +author: "naitoh" +translator: "Andrii Furmanets" +date: 2025-09-18 03:00:00 +0000 +tags: security +lang: ua +--- + +Існує DoS-вразливість у gem REXML. Цій вразливості присвоєно ідентифікатор CVE [CVE-2025-58767](https://www.cve.org/CVERecord?id=CVE-2025-58767). Наполегливо рекомендуємо оновити gem REXML. + +## Деталі + +Розбір некоректного XML із кількома деклараціями XML може призвести до збільшення часу виконання та використання пам'яті. +Будь ласка, оновіть gem REXML до версії 3.4.2 або новішої. + +## Уражені версії + +* gem REXML від 3.3.3 до 3.4.1 + +## Подяки + +Дякуємо [Sofia Aberegg](https://github.com/sofiaaberegg) за виявлення цієї проблеми. + +## Історія + +* Початково опубліковано 2025-09-18 03:00:00 (UTC) diff --git a/ua/news/_posts/2025-10-07-ruby-3-4-7-released.md b/ua/news/_posts/2025-10-07-ruby-3-4-7-released.md new file mode 100644 index 0000000000..dbdb00bdde --- /dev/null +++ b/ua/news/_posts/2025-10-07-ruby-3-4-7-released.md @@ -0,0 +1,52 @@ +--- +layout: news_post +title: "Вийшов Ruby 3.4.7" +author: k0kubun +translator: "Andrii Furmanets" +date: 2025-10-07 17:14:11 +0000 +lang: ua +--- + +Вийшов Ruby 3.4.7. + +Цей реліз містить [оновлення gem uri, яке усуває CVE-2025-61594](/ua/news/2025/10/07/uri-cve-2025-61594/), +разом з іншими виправленнями помилок. Докладніше див. [примітки до релізу на GitHub](https://github.com/ruby/ruby/releases/tag/v3_4_7). + +Рекомендуємо оновити вашу версію gem uri. Цей реліз зроблено для зручності тих, хто хоче й надалі використовувати його як gem за замовчуванням. + +## Графік релізів + +Ми плануємо випускати найновішу стабільну версію Ruby (зараз Ruby 3.4) кожні два місяці після останнього релізу. +Ruby 3.4.8 заплановано на грудень, а 3.4.9 на лютий. + +Якщо з'явиться зміна, що істотно впливає на користувачів, реліз може відбутися раніше запланованого, а подальший графік відповідно зміститься. + +## Завантаження + +{% assign release = site.data.releases | where: "version", "3.4.7" | first %} + +* <{{ release.url.gz }}> + + SIZE: {{ release.size.gz }} + SHA1: {{ release.sha1.gz }} + SHA256: {{ release.sha256.gz }} + SHA512: {{ release.sha512.gz }} + +* <{{ release.url.xz }}> + + SIZE: {{ release.size.xz }} + SHA1: {{ release.sha1.xz }} + SHA256: {{ release.sha256.xz }} + SHA512: {{ release.sha512.xz }} + +* <{{ release.url.zip }}> + + SIZE: {{ release.size.zip }} + SHA1: {{ release.sha1.zip }} + SHA256: {{ release.sha256.zip }} + SHA512: {{ release.sha512.zip }} + +## Коментар до релізу + +Багато комітерів, розробників і користувачів, які надсилали звіти про помилки, допомогли нам зробити цей реліз. +Дякуємо за їхній внесок. diff --git a/ua/news/_posts/2025-10-07-uri-cve-2025-61594.md b/ua/news/_posts/2025-10-07-uri-cve-2025-61594.md new file mode 100644 index 0000000000..acb0d0ca78 --- /dev/null +++ b/ua/news/_posts/2025-10-07-uri-cve-2025-61594.md @@ -0,0 +1,35 @@ +--- +layout: news_post +title: "CVE-2025-61594: обхід попередніх виправлень витоку облікових даних URI" +author: "hsbt" +translator: "Andrii Furmanets" +date: 2025-10-07 00:00:00 +0000 +tags: security +lang: ua +--- + +Ми опублікували повідомлення з безпеки щодо CVE-2025-61594. + +## CVE-2025-61594: обхід виправлення CVE-2025-27221 для витоку облікових даних URI + +У вразливих версіях URI існує обхід виправлення CVE-2025-27221, який може розкрити облікові дані користувача. + +Цій вразливості присвоєно ідентифікатор CVE [CVE-2025-61594](https://www.cve.org/CVERecord?id=CVE-2025-61594). Рекомендуємо оновити gem uri. + +### Деталі + +Під час використання оператора `+` для об'єднання URI чутлива інформація, як-от паролі з початкового URI, може витікати. Це порушує RFC3986 і робить застосунки вразливими до розкриття облікових даних. + +Будь ласка, оновіть gem URI до версії 0.12.5, 0.13.3, 1.0.4 або новішої. + +### Уражені версії + +* версії gem uri < 0.12.5, 0.13.0-0.13.2 та 1.0.0-1.0.3. + +### Подяки + +Дякуємо [junfuchong (chongfujun)](https://hackerone.com/chongfujun) за виявлення цієї проблеми. Також дякуємо [nobu](https://github.com/nobu) за додаткові виправлення цієї вразливості. + +## Історія + +* Початково опубліковано 2025-10-07 0:00:00 (UTC) diff --git a/ua/news/_posts/2025-10-17-rubygems-repository-transition.md b/ua/news/_posts/2025-10-17-rubygems-repository-transition.md new file mode 100644 index 0000000000..ab61b8e880 --- /dev/null +++ b/ua/news/_posts/2025-10-17-rubygems-repository-transition.md @@ -0,0 +1,32 @@ +--- +layout: news_post +title: "Передача власності репозиторію RubyGems" +author: "matz" +translator: "Andrii Furmanets" +date: 2025-10-17 12:00:00 +0000 +tags: +lang: ua +--- + +Шановна спільното Ruby, + +RubyGems і Bundler - ключові офіційні клієнти для rubygems.org та екосистеми Ruby, які багато років постачаються разом із мовою Ruby та працюють як частина стандартної бібліотеки. + +Попри цю важливу роль, RubyGems і Bundler історично розроблялися поза організацією Ruby на GitHub, на відміну від інших основних компонентів екосистеми Ruby. + +Щоб забезпечити спільноті довгострокову стабільність і безперервність, core-команда Ruby під керівництвом Matz вирішила взяти на себе опіку над цими проєктами від Ruby Central. Ми продовжимо їхній розвиток у тісній співпраці з Ruby Central та ширшою спільнотою. + +Ми хочемо підкреслити такі важливі моменти: + +* Власність на репозиторій перейде до core-команди Ruby, щоб забезпечити довгострокову стабільність і узгодженість із ширшою екосистемою Ruby. Управління репозиторієм продовжить здійснювати Ruby Central, тепер спільно з core-командою Ruby. +* RubyGems і Bundler залишаться open source під своїми чинними ліцензіями, без змін ліцензійних умов. +* Усі наявні учасники зберігають повні авторські права та авторство своїх внесків у код. Ця передача не впливає на права інтелектуальної власності жодного контриб'ютора. +* Спільний, керований спільнотою процес розробки продовжиться як і раніше, і ми вітаємо внески від усіх членів спільноти. + +Ця передача відображає нашу відданість забезпеченню подальшого здоров'я, стабільності та зростання екосистеми Ruby на роки вперед. Ми вдячні Ruby Central за роки сумлінної опіки та з нетерпінням чекаємо на спільну роботу з усіма членами спільноти Ruby, щоб збудувати ще світліше майбутнє для Ruby. + +Дякуємо за вашу постійну підтримку та внески. + +З повагою, + +Юкіхіро Мацумото, також відомий як Matz diff --git a/ua/news/_posts/2025-10-23-ruby-3-3-10-released.md b/ua/news/_posts/2025-10-23-ruby-3-3-10-released.md new file mode 100644 index 0000000000..8d18c38930 --- /dev/null +++ b/ua/news/_posts/2025-10-23-ruby-3-3-10-released.md @@ -0,0 +1,45 @@ +--- +layout: news_post +title: "Вийшов Ruby 3.3.10" +author: nagachika +translator: "Andrii Furmanets" +date: 2025-10-23 11:00:00 +0000 +lang: ua +--- + +Вийшов Ruby 3.3.10. + +Цей реліз містить [оновлення gem uri, яке усуває CVE-2025-61594](/ua/news/2025/10/07/uri-cve-2025-61594/), +разом з іншими виправленнями помилок. Докладніше див. [примітки до релізу на GitHub](https://github.com/ruby/ruby/releases/tag/v3_3_10). + +Рекомендуємо оновити вашу версію gem uri. Цей реліз зроблено для зручності тих, хто хоче й надалі використовувати його як gem за замовчуванням. + +## Завантаження + +{% assign release = site.data.releases | where: "version", "3.3.10" | first %} + +* <{{ release.url.gz }}> + + SIZE: {{ release.size.gz }} + SHA1: {{ release.sha1.gz }} + SHA256: {{ release.sha256.gz }} + SHA512: {{ release.sha512.gz }} + +* <{{ release.url.xz }}> + + SIZE: {{ release.size.xz }} + SHA1: {{ release.sha1.xz }} + SHA256: {{ release.sha256.xz }} + SHA512: {{ release.sha512.xz }} + +* <{{ release.url.zip }}> + + SIZE: {{ release.size.zip }} + SHA1: {{ release.sha1.zip }} + SHA256: {{ release.sha256.zip }} + SHA512: {{ release.sha512.zip }} + +## Коментар до релізу + +Багато комітерів, розробників і користувачів, які надсилали звіти про помилки, допомогли нам зробити цей реліз. +Дякуємо за їхній внесок. diff --git a/ua/news/_posts/2025-11-17-ruby-4-0-0-preview2-released.md b/ua/news/_posts/2025-11-17-ruby-4-0-0-preview2-released.md new file mode 100644 index 0000000000..26510a81f3 --- /dev/null +++ b/ua/news/_posts/2025-11-17-ruby-4-0-0-preview2-released.md @@ -0,0 +1,128 @@ +--- +layout: news_post +title: "Вийшов Ruby 4.0.0 preview2" +author: "naruse" +translator: "Andrii Furmanets" +date: 2025-11-17 00:00:00 +0000 +lang: ua +--- + +{% assign release = site.data.releases | where: "version", "4.0.0-preview2" | first %} +Раді повідомити про вихід Ruby {{ release.version }}. Ruby 4.0 оновлює версію Unicode до 17,0.0 тощо. + +## Зміни мови + +* `*nil` більше не викликає `nil.to_a`, подібно до того, як `**nil` не викликає `nil.to_hash`. [[Feature #21047]] + +## Оновлення основних класів + +Примітка: наведено лише помітні оновлення основних класів. + +* Binding + + * `Binding#local_variables` більше не містить нумерованих параметрів. + Також `Binding#local_variable_get` і `Binding#local_variable_set` відмовляються працювати з нумерованими параметрами. + [[Bug #21049]] + +* IO + + * `IO.select` приймає +Float::INFINITY+ як аргумент тайм-ауту. + [[Feature #20610]] + +* String + + * Оновлено Unicode до версії 17.0.0 та Emoji до 17.0. [[Feature #19908]][[Feature #20724]][[Feature #21275]] + (також стосується Regexp) + + +## Оновлення стандартної бібліотеки + +Примітка: наведено лише помітні оновлення стандартних бібліотек. + +* ostruct 0.6.1 +* pstore 0.2.0 +* benchmark 0.4.0 +* logger 1.7.0 +* rdoc 6.13.1 +* win32ole 1.9.2 +* irb 1.15.2 +* reline 0.6.1 +* readline 0.0.4 +* fiddle 1.1.6 + +## Проблеми сумісності + +Примітка: без урахування виправлень помилок у функціях. + + + +## Проблеми сумісності стандартної бібліотеки + + +## Оновлення C API + + +## JIT + +* YJIT + * Статистика YJIT + * `ratio_in_yjit` більше не працює у збірці за замовчуванням. + Використайте `--enable-yjit=stats` у `configure`, щоб увімкнути її для `--yjit-stats`. + * Додано `invalidate_everything` до стандартної статистики; лічильник збільшується, + коли весь код інвалідовується через TracePoint. + * Додано параметри `mem_size:` та `call_threshold:` до `RubyVM::YJIT.enable`. +* ZJIT + * Додано експериментальний JIT-компілятор на основі методів. + Використайте `--enable-zjit` у `configure`, щоб увімкнути підтримку `--zjit`. + * Станом на Ruby 4.0.0-preview2, ZJIT ще не готовий прискорювати більшість бенчмарків. + Будь ласка, утримайтеся від оцінювання ZJIT. Слідкуйте за релізом Ruby 4.0. +* RJIT + * `--rjit` вилучено. Ми перенесемо реалізацію стороннього JIT API + до репозиторію [ruby/rjit](https://github.com/ruby/rjit). + +## Інші зміни + + + +Детальніше див. [NEWS](https://github.com/ruby/ruby/blob/{{ release.tag }}/NEWS.md) +або [журнали комітів](https://github.com/ruby/ruby/compare/v3_4_0...{{ release.tag }}) +для подробиць. + +Унаслідок цих змін [{{ release.stats.files_changed }} файлів змінено, {{ release.stats.insertions }} вставок(+), {{ release.stats.deletions }} видалень(-)](https://github.com/ruby/ruby/compare/v3_4_0...{{ release.tag }}#file_bucket) +з часу Ruby 3.4.0! + +## Завантаження + +* <{{ release.url.gz }}> + + SIZE: {{ release.size.gz }} + SHA1: {{ release.sha1.gz }} + SHA256: {{ release.sha256.gz }} + SHA512: {{ release.sha512.gz }} + +* <{{ release.url.xz }}> + + SIZE: {{ release.size.xz }} + SHA1: {{ release.sha1.xz }} + SHA256: {{ release.sha256.xz }} + SHA512: {{ release.sha512.xz }} + +* <{{ release.url.zip }}> + + SIZE: {{ release.size.zip }} + SHA1: {{ release.sha1.zip }} + SHA256: {{ release.sha256.zip }} + SHA512: {{ release.sha512.zip }} + +## Що таке Ruby + +Ruby уперше розробив Matz (Yukihiro Matsumoto) у 1993 році, +і зараз вона розвивається як Open Source. Вона працює на багатьох платформах +і використовується по всьому світу, особливо для веброзробки. + +[Feature #21047]: https://bugs.ruby-lang.org/issues/21047 +[Bug #21049]: https://bugs.ruby-lang.org/issues/21049 +[Feature #20610]: https://bugs.ruby-lang.org/issues/20610 +[Feature #19908]: https://bugs.ruby-lang.org/issues/19908 +[Feature #20724]: https://bugs.ruby-lang.org/issues/20724 +[Feature #21275]: https://bugs.ruby-lang.org/issues/21275 diff --git a/ua/news/_posts/2025-12-17-ruby-3-4-8-released.md b/ua/news/_posts/2025-12-17-ruby-3-4-8-released.md new file mode 100644 index 0000000000..9a625201ce --- /dev/null +++ b/ua/news/_posts/2025-12-17-ruby-3-4-8-released.md @@ -0,0 +1,50 @@ +--- +layout: news_post +title: "Вийшов Ruby 3.4.8" +author: k0kubun +translator: "Andrii Furmanets" +date: 2025-12-17 00:24:30 +0000 +lang: ua +--- + +Вийшов Ruby 3.4.8. + +Це планове оновлення з виправленнями помилок. +Докладніше див. [примітки до релізу на GitHub](https://github.com/ruby/ruby/releases/tag/v3_4_8). + +## Графік релізів + +Ми плануємо випускати найновішу стабільну версію Ruby (зараз Ruby 3.4) кожні два місяці після останнього релізу. +Ruby 3.4.9 заплановано на лютий. + +Якщо з'явиться зміна, що істотно впливає на користувачів, реліз може відбутися раніше запланованого, а подальший графік відповідно зміститься. + +## Завантаження + +{% assign release = site.data.releases | where: "version", "3.4.8" | first %} + +* <{{ release.url.gz }}> + + SIZE: {{ release.size.gz }} + SHA1: {{ release.sha1.gz }} + SHA256: {{ release.sha256.gz }} + SHA512: {{ release.sha512.gz }} + +* <{{ release.url.xz }}> + + SIZE: {{ release.size.xz }} + SHA1: {{ release.sha1.xz }} + SHA256: {{ release.sha256.xz }} + SHA512: {{ release.sha512.xz }} + +* <{{ release.url.zip }}> + + SIZE: {{ release.size.zip }} + SHA1: {{ release.sha1.zip }} + SHA256: {{ release.sha256.zip }} + SHA512: {{ release.sha512.zip }} + +## Коментар до релізу + +Багато комітерів, розробників і користувачів, які надсилали звіти про помилки, допомогли нам зробити цей реліз. +Дякуємо за їхній внесок. diff --git a/ua/news/_posts/2025-12-18-ruby-4-0-0-preview3-released.md b/ua/news/_posts/2025-12-18-ruby-4-0-0-preview3-released.md new file mode 100644 index 0000000000..bdd357bcb3 --- /dev/null +++ b/ua/news/_posts/2025-12-18-ruby-4-0-0-preview3-released.md @@ -0,0 +1,495 @@ +--- +layout: news_post +title: "Вийшов Ruby 4.0.0 preview3" +author: "naruse" +translator: "Andrii Furmanets" +date: 2025-12-18 00:00:00 +0000 +lang: ua +--- + +{% assign release = site.data.releases | where: "version", "4.0.0-preview3" | first %} +Раді повідомити про вихід Ruby {{ release.version }}. +Ruby 4.0 вводить Ruby::Box і "ZJIT" та додає багато покращень. + +## Ruby::Box + +Нова (експериментальна) функція для розділення визначень. +Докладніше про "Ruby Box" див. [doc/language/box.md](https://github.com/ruby/ruby/blob/master/doc/language/box.md). +[[Feature #21311]] [[Misc #21385]] + +## Зміни мови + +* `*nil` більше не викликає `nil.to_a`, подібно до того, як `**nil` не викликає `nil.to_hash`. [[Feature #21047]] + +* Логічні бінарні оператори (`||`, `&&`, `and` та `or`) на початку рядка + продовжують попередній рядок, як у fluent dot. + Наступні два фрагменти коду рівнозначні: + + ```ruby + if condition1 + && condition2 + ... + end + ``` + + ```ruby + if condition1 && condition2 + ... + end + ``` + + [[Feature #20925]] + +## Оновлення основних класів + +Примітка: наведено лише помітні оновлення класів. + +* Kernel + + * `Kernel#inspect` тепер перевіряє наявність методу `#instance_variables_to_inspect`, + що дозволяє керувати тим, які змінні екземпляра відображаються в рядку `#inspect`: + + ```ruby + class DatabaseConfig + def initialize(host, user, password) + @host = host + @user = user + @password = password + end + + private def instance_variables_to_inspect = [:@host, :@user] + end + + conf = DatabaseConfig.new("localhost", "root", "hunter2") + conf.inspect #=> # + ``` + + [[Feature #21219]] + + * Застарілу поведінку створення процесу через `Kernel#open` із + початковим `|` вилучено. [[Feature #19630]] + +* Binding + + * `Binding#local_variables` більше не містить нумерованих параметрів. + Також `Binding#local_variable_get` і `Binding#local_variable_set` відмовляються + працювати з нумерованими параметрами. [[Bug #21049]] + +* File + + * `File::Stat#birthtime` тепер доступний на Linux через системний виклик statx, + коли його підтримують ядро та файлова система. + [[Feature #21205]] + +* IO + + * `IO.select` приймає `Float::INFINITY` як аргумент тайм-ауту. + [[Feature #20610]] + + * Застарілу поведінку створення процесу методами класу `IO` з + початковим `|` вилучено. [[Feature #19630]] + +* Math + + * Додано `Math.log1p` та `Math.expm1`. [[Feature #21527]] + +* Method + + * `Method#source_location`, `Proc#source_location` та + `UnboundMethod#source_location` тепер повертають розширену інформацію про розташування + з 5 елементів: `[path, start_line, start_column, end_line, end_column]`. Попередній + формат з 2 елементів `[path, line]` все ще можна отримати, викликавши `.take(2)` у результаті. + [[Feature #6012]] + +* Proc + + * `Proc#parameters` тепер показує анонімні необов'язкові параметри як `[:opt]` + замість `[:opt, nil]`, роблячи вивід узгодженим із випадком, коли + анонімний параметр є обов'язковим. [[Bug #20974]] + +* Ractor + + * Додано клас `Ractor::Port` як новий механізм синхронізації + для обміну між Ractor. [[Feature #21262]] + + ```ruby + port1 = Ractor::Port.new + port2 = Ractor::Port.new + Ractor.new port1, port2 do |port1, port2| + port1 << 1 + port2 << 11 + port1 << 2 + port2 << 12 + end + 2.times{ p port1.receive } #=> 1, 2 + 2.times{ p port2.receive } #=> 11, 12 + ``` + + `Ractor::Port` надає такі методи: + + * `Ractor::Port#receive` + * `Ractor::Port#send` (або `Ractor::Port#<<`) + * `Ractor::Port#close` + * `Ractor::Port#closed?` + + У результаті `Ractor.yield` і `Ractor#take` були вилучені. + + * Додано `Ractor#join` і `Ractor#value` для очікування + завершення Ractor. Це аналогічно `Thread#join` + та `Thread#value`. + + * Додано `Ractor#monitor` і `Ractor#unmonitor` як низькорівневі + інтерфейси, що використовуються всередині для реалізації `Ractor#join`. + + * `Ractor.select` тепер приймає лише Ractor і Port. Якщо передано Ractor, + він повертається, коли Ractor завершується. + + * Додано `Ractor#default_port`. Кожен `Ractor` має порт за замовчуванням, + який використовується `Ractor.send` і `Ractor.receive`. + + * `Ractor#close_incoming` і `Ractor#close_outgoing` були вилучені. + + * Запроваджено `Ractor.shareable_proc` і `Ractor.shareable_lambda` + для створення розділюваних Proc або lambda. + [[Feature #21550]], [[Feature #21557]] + +* Range + + * `Range#to_set` та `Enumerator#to_set` тепер виконують перевірки розміру, щоб запобігти + проблемам з нескінченними діапазонами. [[Bug #21654]] + + * `Range#overlap?` тепер коректно обробляє нескінченні (безмежні) діапазони. + [[Bug #21185]] + + * Виправлено поведінку `Range#max` для безпочаткових цілих діапазонів. + [[Bug #21174]] [[Bug #21175]] + +* Ruby + + * Визначено новий глобальний модуль `Ruby`, який містить + константи, пов'язані з Ruby. Цей модуль був зарезервований у Ruby 3.4 + і тепер офіційно визначений. [[Feature #20884]] + +* Ruby::Box + + * Нова (експериментальна) функція для розділення визначень. + Докладніше про "Ruby Box" див. [doc/language/box.md](https://github.com/ruby/ruby/blob/master/doc/language/box.md). + [[Feature #21311]] [[Misc #21385]] + +* Set + + * `Set` тепер є основним класом, а не stdlib класом, що автозавантажується. + [[Feature #21216]] + + * `Set#inspect` тепер повертає рядок, придатний для `eval`, використовуючи + синтаксис `Set[]` (наприклад, `Set[1, 2, 3]` замість + `#`). Це робить його узгодженим з іншими основними + колекційними класами, такими як Array і Hash. [[Feature #21389]] + + * Передавання аргументів до `Set#to_set` і `Enumerable#to_set` тепер застаріле. + [[Feature #21390]] + +* Socket + + * `Socket.tcp` і `TCPSocket.new` приймають ключовий аргумент `open_timeout` для задання + тайм-ауту початкового з'єднання. [[Feature #21347]] + +* String + + * Оновлено Unicode до версії 17.0.0 та Emoji до 17.0. + [[Feature #19908]][[Feature #20724]][[Feature #21275]] (також стосується Regexp) + + * `String#strip`, `strip!`, `lstrip`, `lstrip!`, `rstrip` і `rstrip!` + розширено, щоб приймати аргументи `*selectors`. [[Feature #21552]] + +* Thread + + * Додано підтримку аргументу `Thread#raise(cause:)`, подібно до + `Kernel#raise`. [[Feature #21360]] + +* Fiber + + * Додано підтримку аргументу `Fiber#raise(cause:)`, подібно до + `Kernel#raise`. [[Feature #21360]] + +* Fiber::Scheduler + + * Додано `Fiber::Scheduler#fiber_interrupt` для переривання fiber заданим + виключенням. Початковий сценарій використання - перервати fiber, що + очікує блокувальну операцію IO, коли цю операцію IO закрито. + [[Feature #21166]] + +* Pathname + + * Pathname переведено зі статусу default gem до основного класу Ruby. + [[Feature #17473]] + +## Оновлення stdlib + +Наступні bundled gems підвищено зі статусу default gems. + +* ostruct 0.6.3 +* pstore 0.2.0 +* benchmark 0.5.0 +* logger 1.7.0 +* rdoc 6.17.0 +* win32ole 1.9.2 +* irb 1.15.3 +* reline 0.6.3 +* readline 0.0.4 +* fiddle 1.1.8 + +Ми наводимо лише помітні зміни stdlib, що є змінами функціональності. + +Інші зміни наведено в наступних розділах. Також ми навели історію релізів +від попередньої bundled версії, якою є Ruby 3.3.0, якщо вона має релізи на GitHub. + +Додано наступний default gem. + +* win32-registry 0.1.2 + +Оновлено такі default gems. + +* RubyGems 4.0.1 +* bundler 4.0.1 +* date 3.5.1 +* digest 3.2.1 +* english 0.8.1 +* erb 6.0.0 +* etc 1.4.6 +* fcntl 1.3.0 +* fileutils 1.8.0 +* forwardable 1.4.0 +* io-console 0.8.1 +* io-nonblock 0.3.2 +* io-wait 0.4.0.dev +* ipaddr 1.2.8 +* json 2.17.1 +* net-http 0.8.0 +* openssl 4.0.0.pre +* optparse 0.8.1 +* pp 0.6.3 +* prism 1.6.0 +* psych 5.3.0 +* resolv 0.7.0 +* stringio 3.1.9.dev +* strscan 3.1.6.dev +* timeout 0.5.0 +* uri 1.1.1 +* weakref 0.1.4 +* zlib 3.2.2 + +Оновлено такі bundled gems. + +* minitest 5.26.2 +* power_assert 3.0.1 +* rake 13.3.1 +* test-unit 3.7.3 +* rexml 3.4.4 +* net-ftp 0.3.9 +* net-imap 0.5.12 +* net-smtp 0.5.1 +* matrix 0.4.3 +* prime 0.1.4 +* rbs 3.9.5 +* typeprof 0.31.0 +* debug 1.11.0 +* base64 0.3.0 +* bigdecimal 3.3.1 +* drb 2.2.3 +* syslog 0.3.0 +* csv 3.3.5 +* repl_type_completor 0.1.12 + +## Підтримувані платформи + +* Windows + + * Припинено підтримку версій MSVC, старших за 14.0 (_MSC_VER 1900). + Це означає, що тепер потрібен Visual Studio 2015 або новіший. + +## Проблеми сумісності + +* Через додавання `Ractor::Port` вилучено такі методи Ractor: + + * `Ractor.yield` + * `Ractor#take` + * `Ractor#close_incoming` + * `Ractor#close_outgoging` + + [[Feature #21262]] + +* `ObjectSpace._id2ref` є застарілим. [[Feature #15408]] + +* `Process::Status#&` і `Process::Status#>>` було вилучено. + Вони були застарілими в Ruby 3.3. [[Bug #19868]] + +* `rb_path_check` було вилучено. Цю функцію використовували для + перевірки шляхів `$SAFE`, яку прибрали в Ruby 2.7, + і вона вже була застарілою. + [[Feature #20971]] + +## Проблеми сумісності stdlib + +* Бібліотеку CGI вилучено з default gems. Тепер ми надаємо лише `cgi/escape` для + таких методів: + + * `CGI.escape` і `CGI.unescape` + * `CGI.escapeHTML` і `CGI.unescapeHTML` + * `CGI.escapeURIComponent` і `CGI.unescapeURIComponent` + * `CGI.escapeElement` і `CGI.unescapeElement` + + [[Feature #21258]] + +* Після перенесення `Set` зі stdlib до основного класу, `set/sorted_set.rb` було + вилучено, а `SortedSet` більше не є автозавантажуваною константою. Будь ласка, + встановіть gem `sorted_set` і `require 'sorted_set'`, щоб використовувати `SortedSet`. + [[Feature #21287]] + +## Оновлення C API + +* IO + + * `rb_thread_fd_close` є застарілим і тепер не виконує дій. Якщо вам потрібно надати + дескриптори файлів із C-розширень у код Ruby, створіть екземпляр `IO`, + використовуючи `RUBY_IO_MODE_EXTERNAL`, і використайте `rb_io_close(io)`, щоб закрити його (це + також перериває та очікує завершення всіх операцій, що очікують, для екземпляра `IO`). + Безпосереднє закриття дескрипторів файлів не перериває операції, що очікують, + і може призвести до невизначеної поведінки. Іншими словами, якщо два об'єкти + `IO` спільно використовують один і той самий дескриптор файлу, закриття одного + не впливає на інший. [[Feature #18455]] + +* GVL + + * `rb_thread_call_with_gvl` тепер працює з GVL або без нього. + Це дозволяє gem уникати перевірки `ruby_thread_has_gvl_p`. + Будь ласка, все одно уважно ставтеся до GVL. [[Feature #20750]] + +* Set + + * Додано C API для `Set`. Підтримуються такі методи: + [[Feature #21459]] + + * `rb_set_foreach` + * `rb_set_new` + * `rb_set_new_capa` + * `rb_set_lookup` + * `rb_set_add` + * `rb_set_clear` + * `rb_set_delete` + * `rb_set_size` + +## Покращення реалізації + +### Ractor + +Проведено багато роботи, щоб зробити Ractor стабільнішими, продуктивнішими та зручнішими. Ці покращення наближають реалізацію Ractor до виходу з експериментального статусу. + +* Покращення продуктивності + * Заморожені рядки та таблиця символів всередині використовують lock-free hash set + * Пошуки в кеші методів у більшості випадків обходяться без блокування + * Доступ до змінних екземпляра класів (та geniv) швидший і уникає блокувань + * Уникається конкуренція за кеш під час виділення об'єктів + * `object_id` у більшості випадків обходиться без блокування +* Виправлення помилок і стабільність + * Виправлено можливі дедлоки при поєднанні Ractor і Thread + * Виправлено проблеми з require та autoload у Ractor + * Виправлено проблеми з кодуванням/транскодуванням між Ractor + * Виправлено умови гонки в операціях GC та інвалідизації методів + * Виправлено проблеми з форком процесів після запуску Ractor + +## JIT + +* ZJIT + * Запроваджено [експериментальний JIT-компілятор на основі методів](https://docs.ruby-lang.org/en/master/jit/zjit_md.html). + Щоб увімкнути підтримку `--zjit`, зберіть Ruby з Rust 1.85.0 або новішою. + * Станом на Ruby 4.0.0, ZJIT швидший за інтерпретатор, але ще не такий швидкий, як YJIT. + Ми заохочуємо експерименти з ZJIT, але радимо поки що не розгортати його в продакшені. + * Наша мета - зробити ZJIT швидшим за YJIT і готовим до продакшена в Ruby 4.1. +* YJIT + * `RubyVM::YJIT.runtime_stats` + * `ratio_in_yjit` більше не працює у збірці за замовчуванням. + Використайте `--enable-yjit=stats` у `configure`, щоб увімкнути її для `--yjit-stats`. + * Додано `invalidate_everything` до стандартної статистики; лічильник збільшується, + коли весь код інвалідовується через TracePoint. + * Додано параметри `mem_size:` та `call_threshold:` до `RubyVM::YJIT.enable`. +* RJIT + * `--rjit` вилучено. Ми перенесемо реалізацію стороннього JIT API + до репозиторію [ruby/rjit](https://github.com/ruby/rjit). + +## Інші зміни + +Детальніше див. [NEWS](https://github.com/ruby/ruby/blob/{{ release.tag }}/NEWS.md) +або [журнали комітів](https://github.com/ruby/ruby/compare/v3_4_0...{{ release.tag }}) +для подробиць. + +Унаслідок цих змін [{{ release.stats.files_changed }} файлів змінено, {{ release.stats.insertions }} вставок(+), {{ release.stats.deletions }} видалень(-)](https://github.com/ruby/ruby/compare/v3_4_0...{{ release.tag }}#file_bucket) +з часу Ruby 3.4.0! + +## Завантаження + +* <{{ release.url.gz }}> + + SIZE: {{ release.size.gz }} + SHA1: {{ release.sha1.gz }} + SHA256: {{ release.sha256.gz }} + SHA512: {{ release.sha512.gz }} + +* <{{ release.url.xz }}> + + SIZE: {{ release.size.xz }} + SHA1: {{ release.sha1.xz }} + SHA256: {{ release.sha256.xz }} + SHA512: {{ release.sha512.xz }} + +* <{{ release.url.zip }}> + + SIZE: {{ release.size.zip }} + SHA1: {{ release.sha1.zip }} + SHA256: {{ release.sha256.zip }} + SHA512: {{ release.sha512.zip }} + +## Що таке Ruby + +Ruby уперше розробив Matz (Yukihiro Matsumoto) у 1993 році, +і зараз вона розвивається як Open Source. Вона працює на багатьох платформах +і використовується по всьому світу, особливо для веброзробки. + +[Feature #6012]: https://bugs.ruby-lang.org/issues/6012 +[Feature #15408]: https://bugs.ruby-lang.org/issues/15408 +[Feature #17473]: https://bugs.ruby-lang.org/issues/17473 +[Feature #18455]: https://bugs.ruby-lang.org/issues/18455 +[Feature #19630]: https://bugs.ruby-lang.org/issues/19630 +[Bug #19868]: https://bugs.ruby-lang.org/issues/19868 +[Feature #19908]: https://bugs.ruby-lang.org/issues/19908 +[Feature #20610]: https://bugs.ruby-lang.org/issues/20610 +[Feature #20724]: https://bugs.ruby-lang.org/issues/20724 +[Feature #20750]: https://bugs.ruby-lang.org/issues/20750 +[Feature #20884]: https://bugs.ruby-lang.org/issues/20884 +[Feature #20925]: https://bugs.ruby-lang.org/issues/20925 +[Feature #20971]: https://bugs.ruby-lang.org/issues/20971 +[Bug #20974]: https://bugs.ruby-lang.org/issues/20974 +[Feature #21047]: https://bugs.ruby-lang.org/issues/21047 +[Bug #21049]: https://bugs.ruby-lang.org/issues/21049 +[Feature #21166]: https://bugs.ruby-lang.org/issues/21166 +[Bug #21174]: https://bugs.ruby-lang.org/issues/21174 +[Bug #21175]: https://bugs.ruby-lang.org/issues/21175 +[Bug #21185]: https://bugs.ruby-lang.org/issues/21185 +[Feature #21205]: https://bugs.ruby-lang.org/issues/21205 +[Feature #21216]: https://bugs.ruby-lang.org/issues/21216 +[Feature #21219]: https://bugs.ruby-lang.org/issues/21219 +[Feature #21258]: https://bugs.ruby-lang.org/issues/21258 +[Feature #21262]: https://bugs.ruby-lang.org/issues/21262 +[Feature #21275]: https://bugs.ruby-lang.org/issues/21275 +[Feature #21287]: https://bugs.ruby-lang.org/issues/21287 +[Feature #21311]: https://bugs.ruby-lang.org/issues/21311 +[Feature #21347]: https://bugs.ruby-lang.org/issues/21347 +[Feature #21360]: https://bugs.ruby-lang.org/issues/21360 +[Misc #21385]: https://bugs.ruby-lang.org/issues/21385 +[Feature #21389]: https://bugs.ruby-lang.org/issues/21389 +[Feature #21390]: https://bugs.ruby-lang.org/issues/21390 +[Feature #21459]: https://bugs.ruby-lang.org/issues/21459 +[Feature #21527]: https://bugs.ruby-lang.org/issues/21527 +[Feature #21550]: https://bugs.ruby-lang.org/issues/21550 +[Feature #21557]: https://bugs.ruby-lang.org/issues/21557 +[Bug #21654]: https://bugs.ruby-lang.org/issues/21654 diff --git a/ua/news/_posts/2025-12-22-redesign-site-identity.md b/ua/news/_posts/2025-12-22-redesign-site-identity.md new file mode 100644 index 0000000000..d85036f962 --- /dev/null +++ b/ua/news/_posts/2025-12-22-redesign-site-identity.md @@ -0,0 +1,24 @@ +--- +layout: news_post +title: "Оновлення айдентики нашого сайту" +author: "Hiroshi SHIBATA" +translator: "Andrii Furmanets" +date: 2025-12-22 05:46:09 +0000 +lang: ua +--- + +Раді оголосити про комплексне оновлення нашого сайту. Дизайн для цього оновлення створила [Taeko Akatsuka](https://x.com/ken_c_lo). + +У межах цього оновлення ми переосмислили айдентику сайту як "Мова, де збираються люди, сайт, де людей видно". + +Ruby уже 30 років є мовою, зосередженою на "щасті програміста". Новий ключовий візуал передає присутність людей довкола Ruby. + +Композиція містить різноманітних ілюстрованих персонажів, намальованих від руки, що розходяться від центрального логотипа Ruby. Вони символізують розробників у всьому світі, які поєднуються через Ruby, створюють цінність у своїх сферах і насолоджуються Ruby поруч зі знайомими мотивами. + +Передаючи сучасні сильні сторони Ruby - екосистему, продуктивність і спільноту - теплий візуальний стиль уособлює незмінні радість, доступність і тактильність, які були основою Ruby від самого початку. Ми прагнули виразності, унікальної для Ruby, якої немає на сайтах інших мов програмування. + +Matz підкреслює простоту вираження як одну з сильних сторін Ruby, поряд з екосистемою, продуктивністю та спільнотою. У новому дизайні, після ключового візуалу, показано код Ruby, щоб підкреслити її сутність як мови програмування. + +Ми також додали інтерв'ю з учасниками спільноти та фотографії, створивши сайт, де можна відчути присутність багатьох людей, що стоять за мовою програмування. + +Оновлення сайту з новим дизайном ще триває. Залишається багато напрямів для поліпшення, зокрема непрацюючі посилання та неузгодженості. Ми будемо раді вашому зворотному зв'язку. diff --git a/ua/privacy/index.md b/ua/privacy/index.md new file mode 100644 index 0000000000..0a04e7797f --- /dev/null +++ b/ua/privacy/index.md @@ -0,0 +1,33 @@ +--- +layout: page +title: "Політика конфіденційності для ruby-lang.org" +lang: ua +--- + +Ця політика конфіденційності стосується ruby-lang.org. + +## Електронна пошта + +Ми не передаватимемо вашу адресу електронної пошти нікому, хто не має +відношення до роботи ruby-lang.org. Також ми ніколи не попросимо вас +надсилати нам будь-які паролі електронною поштою. + +## Логи + +ruby-lang.org записує логи доступу запитів, що надходять до вебсерверів, +але ми використовуємо ці файли лише для налагодження та статистики. + +Ми використовуємо GitHub Pages для www.ruby-lang.org. Будь ласка, дивіться +[Usage limits of GitHub Pages](https://docs.github.com/en/pages/getting-started-with-github-pages/about-github-pages#data-collection). + +## Cookies + +Деякі сайти під доменом ruby-lang.org (наприклад, bugs.ruby-lang.org) +використовують cookies для збереження налаштувань користувачів. Якщо ви +не входите на сайт, cookies не використовуються для зберігання персональної +інформації, і ми не передаємо інформацію з cookies. + +## Подяки + +Ця політика конфіденційності базується на +[політиці конфіденційності php.net](https://www.php.net/privacy.php). diff --git a/ua/security/index.md b/ua/security/index.md new file mode 100644 index 0000000000..ed8c0f9496 --- /dev/null +++ b/ua/security/index.md @@ -0,0 +1,135 @@ +--- +layout: page +title: "Безпека" +lang: ua +--- + +Тут ви знайдете інформацію про питання безпеки Ruby. +{: .summary} + +## Повідомлення про вразливості безпеки + +Вразливості безпеки в мові програмування Ruby слід повідомляти через нашу +[сторінку bounty-програми на HackerOne](https://hackerone.com/ruby). +Будь ласка, перед поданням уважно ознайомтеся з деталями щодо сфери +охоплення нашої програми. Усі коректно повідомлені проблеми будуть +опубліковані після виправлень. + +Якщо ви знайшли проблему, що стосується одного з наших вебсайтів, +будь ласка, повідомте про неї [через GitHub](https://github.com/ruby/www.ruby-lang.org/issues/new) +або перегляньте наші [Google Groups](https://groups.google.com/g/ruby-security-ann) +для оголошень про безпеку. + +Якщо ви знайшли проблему, що стосується gem-а спільноти Ruby, дотримуйтесь +[інструкцій на RubyGems.org](http://guides.rubygems.org/security/#reporting-security-vulnerabilities). + +Щоб напряму зв’язатися з командою безпеки поза HackerOne, +можна надіслати лист на security@ruby-lang.org +([публічний PGP-ключ](/security.asc)), що є приватною поштовою розсилкою. + +Членами цієї розсилки є люди, які надають Ruby +(комітери Ruby та автори інших реалізацій Ruby, +дистриб’ютори, постачальники PaaS-платформ). +Членами мають бути окремі люди, поштові списки не допускаються. + +## Відомі проблеми + +{% comment %} +Translations should include the following notice: + +_See the [English page](/en/security/) for a complete and up-to-date +list of security vulnerabilities. +The following list only includes the as yet translated +security announcements, it might be incomplete or outdated._ +{% endcomment %} + +_Дивіться [англійську сторінку](/en/security/) для повного та актуального +списку вразливостей безпеки. +Нижче наведено лише вже перекладені оголошення про безпеку; список може +бути неповним або застарілим._ + +Ось нещодавні проблеми: + +{% include security_posts.html %} + +Більше відомих проблем: + +* [DoS-вразливість через розширення сутностей у REXML (XML bomb, + CVE-2013-1821)][1] + опубліковано 22 лютого 2013. +* [Вразливість DoS і небезпечне створення об’єктів у JSON + (CVE-2013-0269)][2] + опубліковано 22 лютого 2013. +* [XSS-експлойт документації RDoc, згенерованої rdoc + (CVE-2013-0256)][3] + опубліковано 6 лютого 2013. +* [DoS-вразливість hash-flooding для Ruby 1.9 (CVE-2012-5371)][4] + опубліковано 10 листопада 2012. +* [Ненавмисне створення файлів через вставку некоректного NUL-символу + (CVE-2012-4522)][5] + опубліковано 12 жовтня 2012. +* [Вразливість обходу $SAFE у Exception#to_s / NameError#to_s + (CVE-2012-4464, CVE-2012-4466)][6] + опубліковано 12 жовтня 2012. +* [Виправлення безпеки RubyGems: збій перевірки SSL-сервера для віддаленого + репозиторію][7] опубліковано 20 квітня 2012. +* [Виправлення безпеки модуля Ruby OpenSSL: дозволити розділення 0/n як + захист від атаки TLS BEAST][8] + опубліковано 16 лютого 2012. +* [Виявлено DoS-атаку на алгоритм хешування Ruby + (CVE-2011-4815)][9] + опубліковано 28 грудня 2011. +* [Методи Exception можуть обходити $SAFE][10] + опубліковано 18 лютого 2011. +* [FileUtils вразливий до атак на гонку символічних посилань][11] + опубліковано 18 лютого 2011. +* [XSS у WEBrick (CVE-2010-0541)][12] + опубліковано 16 серпня 2010. +* [Переповнення буфера в ARGF.inplace_mode=][13] + опубліковано 2 липня 2010. +* [WEBrick має вразливість ін’єкції escape-послідовностей][14] + опубліковано 10 січня 2010. +* [Heap overflow у String (CVE-2009-4124)][15] + опубліковано 7 грудня 2009. +* [DoS-вразливість у + BigDecimal](/en/news/2009/06/09/dos-vulnerability-in-bigdecimal/) + опубліковано 9 червня 2009. +* [DoS-вразливість у + REXML](/en/news/2008/08/23/dos-vulnerability-in-rexml/) + опубліковано 23 серпня 2008. +* [Кілька вразливостей у + Ruby](/en/news/2008/08/08/multiple-vulnerabilities-in-ruby/) + опубліковано 8 серпня 2008. +* [Вразливості виконання довільного коду](/en/news/2008/06/20/arbitrary-code-execution-vulnerabilities/) + опубліковано 20 червня 2008. +* [Вразливість доступу до файлів у + WEBrick](/en/news/2008/03/03/webrick-file-access-vulnerability/) + опубліковано 3 березня 2008. +* [Вразливість Net::HTTPS](/en/news/2007/10/04/net-https-vulnerability/) + опубліковано 4 жовтня 2007. +* [Ще одна DoS-вразливість у бібліотеці + CGI](/en/news/2006/12/04/another-dos-vulnerability-in-cgi-library/) + опубліковано 4 грудня 2006. +* [DoS-вразливість у бібліотеці CGI (CVE-2006-5467)](/en/news/2006/11/03/CVE-2006-5467/) + опубліковано 3 листопада 2006. +* [Вразливість Ruby у налаштуваннях рівня + safe](/en/news/2005/10/03/ruby-vulnerability-in-the-safe-level-settings/) + опубліковано 2 жовтня 2005. + + + +[1]: /en/news/2013/02/22/rexml-dos-2013-02-22/ +[2]: /en/news/2013/02/22/json-dos-cve-2013-0269/ +[3]: /en/news/2013/02/06/rdoc-xss-cve-2013-0256/ +[4]: /en/news/2012/11/09/ruby19-hashdos-cve-2012-5371/ +[5]: /en/news/2012/10/12/poisoned-NUL-byte-vulnerability/ +[6]: /en/news/2012/10/12/cve-2012-4464-cve-2012-4466/ +[7]: /en/news/2012/04/20/ruby-1-9-3-p194-is-released/ +[8]: /en/news/2012/02/16/security-fix-for-ruby-openssl-module/ +[9]: /en/news/2011/12/28/denial-of-service-attack-was-found-for-rubys-hash-algorithm-cve-2011-4815/ +[10]: /en/news/2011/02/18/exception-methods-can-bypass-safe/ +[11]: /en/news/2011/02/18/fileutils-is-vulnerable-to-symlink-race-attacks/ +[12]: /en/news/2010/08/16/xss-in-webrick-cve-2010-0541/ +[13]: /en/news/2010/07/02/ruby-1-9-1-p429-is-released/ +[14]: /en/news/2010/01/10/webrick-escape-sequence-injection/ +[15]: /en/news/2009/12/07/heap-overflow-in-string/ From ef72af134614223870070ce7ac3618345602bda7 Mon Sep 17 00:00:00 2001 From: Andrii Furmanets Date: Mon, 22 Dec 2025 15:46:11 +0200 Subject: [PATCH 2/5] feat: add Ukrainian news posts and update localization data. --- _data/locales/home/ua.yml | 22 +- _data/locales/ua.yml | 4 +- .../_posts/2017-12-25-ruby-2-5-0-released.md | 125 ++++++++ .../_posts/2018-12-25-ruby-2-6-0-released.md | 143 +++++++++ ...ional-and-keyword-arguments-in-ruby-3-0.md | 274 ++++++++++++++++ .../_posts/2019-12-25-ruby-2-7-0-released.md | 210 +++++++++++++ .../_posts/2020-12-25-ruby-3-0-0-released.md | 297 ++++++++++++++++++ 7 files changed, 1061 insertions(+), 14 deletions(-) create mode 100644 ua/news/_posts/2017-12-25-ruby-2-5-0-released.md create mode 100644 ua/news/_posts/2018-12-25-ruby-2-6-0-released.md create mode 100644 ua/news/_posts/2019-12-12-separation-of-positional-and-keyword-arguments-in-ruby-3-0.md create mode 100644 ua/news/_posts/2019-12-25-ruby-2-7-0-released.md create mode 100644 ua/news/_posts/2020-12-25-ruby-3-0-0-released.md diff --git a/_data/locales/home/ua.yml b/_data/locales/home/ua.yml index 0bcff97218..da3ff755ac 100644 --- a/_data/locales/home/ua.yml +++ b/_data/locales/home/ua.yml @@ -1,9 +1,9 @@ hero: - since: "Since" + since: "З" year: "1995" title: "Ruby" - latest_version_label: "Latest Version:" - download_button: "Download" + latest_version_label: "Остання версія:" + download_button: "Завантажити" or: "або" learn_more: "Дізнатися більше" @@ -19,7 +19,7 @@ why_ruby: description: Чому програмісти по всьому світу люблять Ruby? Що робить його цікавим? features: - id: ecosystem - title: Ecosystem + title: Екосистема read: Багаті геми підтримують усі види розробки.
Зрілі інструменти готові до використання. copy: | Ruby має велику колекцію бібліотек, що називаються гемами, які підтримують усе — від веброзробки до обробки даних. @@ -29,13 +29,13 @@ why_ruby: author: id: matz name: Yukihiro "Matz" Matsumoto - title: Creator of Ruby + title: Творець Ruby content: | Коли я випустив Ruby у світ, я й не уявляв, що з нього виросте така багата екосистема. Понад 200 000 гемів, Ruby on Rails, RSpec, Bundler — усе це створила й підтримувала спільнота. Моє бажання «зробити програмістів щасливими» здійснилося так, як я не зміг би досягти сам. - id: simple - title: Simple + title: Простота read: Легко писати, легко читати.
Природний синтаксис, як у розмовній мові. copy: | Ruby має простий та інтуїтивний синтаксис, який читається як природна мова. @@ -45,13 +45,13 @@ why_ruby: author: id: dhh name: David Heinemeier Hansson - title: Creator of Ruby on Rails + title: Творець Ruby on Rails content: | Ruby — це просто найкрасивіша мова програмування, яку я коли-небудь бачив.
І я приділяю чималу увагу новим мовам програмування, що з'являються, новим середовищам, новим фреймворкам, і досі не бачив нічого, що відповідало б Ruby або перевершило його в чистоті дизайну. - id: productivity - title: Productivity + title: Продуктивність read: Робіть більше з меншим обсягом коду.
Інтуїтивний синтаксис прискорює розробку. copy: | Виразний синтаксис Ruby дозволяє стисло писати складну логіку. @@ -61,7 +61,7 @@ why_ruby: author: id: pragdave name: Dave Thomas - title: Author of "The Pragmatic Programmer" + title: Автор "The Pragmatic Programmer" content: | Ruby швидко перетворює ідеї на код. Його простота допомагає мені залишатися зосередженим; його виразність дозволяє писати так, як я думаю.
@@ -69,7 +69,7 @@ why_ruby: З чудовими інструментами та бібліотеками ідеї швидко стають працюючим, елегантним кодом. - id: community - title: Community + title: Спільнота read: Розробники по всьому світу підтримують одне одного.
Тепла, активна спільнота. copy: | Спільнота Ruby дотримується культури "Matz is nice and so we are nice (MINASWAN)", @@ -79,7 +79,7 @@ why_ruby: author: id: amanda name: Amanda Perino - title: Executive Director of Rails Foundation + title: Виконавчий директор Rails Foundation content: | Спільнота Ruby сповнена таланту й креативності — розробників, яких приваблює елегантний синтаксис Ruby і які програмують заради задоволення. Це яскрава, гостинна спільнота, готова поділитися своєю любов'ю до програмування з усіма. diff --git a/_data/locales/ua.yml b/_data/locales/ua.yml index c2eb9a0a8f..c0789a1f65 100644 --- a/_data/locales/ua.yml +++ b/_data/locales/ua.yml @@ -98,8 +98,6 @@ navigation: submenu: - text: Розробка ядра Ruby url: /ua/community/ruby-core/ - - text: Посібник з репозиторію - url: /en/documentation/repository-guide/ - text: Поштові розсилки url: /ua/community/mailing-lists/ - text: Правила поштових розсилок @@ -181,7 +179,7 @@ month_names: - Грудень posted_by: Опублікував AUTHOR %d-%m-%Y -translated_by: 'Переклав: Andrii Furmanets' +translated_by: 'Переклав:' feed: title: Новини Ruby diff --git a/ua/news/_posts/2017-12-25-ruby-2-5-0-released.md b/ua/news/_posts/2017-12-25-ruby-2-5-0-released.md new file mode 100644 index 0000000000..20b72ee250 --- /dev/null +++ b/ua/news/_posts/2017-12-25-ruby-2-5-0-released.md @@ -0,0 +1,125 @@ +--- +layout: news_post +title: "Вийшов Ruby 2.5.0" +author: "naruse" +translator: "Andrii Furmanets" +date: 2017-12-25 00:00:00 +0000 +lang: ua +--- + +Ми раді повідомити про реліз Ruby 2.5.0. + +Ruby 2.5.0 — перший стабільний реліз серії Ruby 2.5. +Він вводить багато нових функцій і покращень продуктивності. +Найважливіші зміни: + +## Нові функції + +* `rescue`/`else`/`ensure` тепер можна використовувати безпосередньо з + блоками `do`/`end`. + [[Feature #12906]](https://bugs.ruby-lang.org/issues/12906) +* Додано `yield_self` для виклику переданого блоку в його контексті. + На відміну від `tap`, він повертає результат блоку. + [[Feature #6721]](https://bugs.ruby-lang.org/issues/6721) +* Підтримка вимірювання покриття гілок (branch coverage) і покриття методів (method coverage). + Покриття гілок показує, які гілки виконано, а які ні. + Покриття методів показує, які методи викликано, а які ні. + Запустивши набір тестів з цими новими функціями, ви дізнаєтесь, які + гілки та методи виконуються, і зможете точніше оцінити загальне покриття тестів. + [[Feature #13901]](https://bugs.ruby-lang.org/issues/13901) +* Hash#slice [[Feature #8499]](https://bugs.ruby-lang.org/issues/8499) + і Hash#transform_keys [[Feature #13583]](https://bugs.ruby-lang.org/issues/13583) +* Struct.new може створювати класи, що приймають ключові аргументи. + [[Feature #11925]](https://bugs.ruby-lang.org/issues/11925) +* Enumerable#any?, all?, none? та one? приймають аргумент-шаблон. + [[Feature #11286]](https://bugs.ruby-lang.org/issues/11286) +* Пошук констант верхнього рівня більше недоступний. + [[Feature #11547]](https://bugs.ruby-lang.org/issues/11547) +* Одну з найулюбленіших бібліотек, pp.rb, тепер завантажується автоматично. + Вам більше не потрібно писати `require "pp"`. + [[Feature #14123]](https://bugs.ruby-lang.org/issues/14123) +* Backtrace та повідомлення про помилку тепер друкуються у зворотному порядку + (спочатку найстаріший виклик, останнім — найновіший). Коли довгий backtrace + з'являється у терміналі (TTY), ви можете легко знайти рядок причини внизу. + Зверніть увагу, що порядок змінюється, тільки коли backtrace виводиться + безпосередньо в термінал. + [[Feature #8661]](https://bugs.ruby-lang.org/issues/8661) [експериментально] + +## Покращення продуктивності + +* Близько 5-10% покращення продуктивності завдяки видаленню всіх інструкцій `trace` + з загального байткоду (послідовностей інструкцій). + Інструкція `trace` була додана для підтримки `TracePoint`. + Однак у більшості випадків `TracePoint` не використовується, і інструкції `trace` + є чистими накладними витратами. Тепер ми використовуємо техніку динамічної інструментації. + Докладніше див. [[Feature #14104]](https://bugs.ruby-lang.org/issues/14104). +* Передача блоку через параметр блоку (напр., `def foo(&b); bar(&b); end`) + приблизно в 3 рази швидша, ніж у Ruby 2.4, завдяки техніці «Lazy Proc allocation». + [[Feature #14045]](https://bugs.ruby-lang.org/issues/14045) +* Mutex переписано для меншого розміру та більшої швидкості. + [[Feature #13517]](https://bugs.ruby-lang.org/issues/13517) +* ERB тепер генерує код з шаблону вдвічі швидше, ніж у Ruby 2.4. +* Покращено продуктивність деяких вбудованих методів, включаючи `Array#concat`, + `Enumerable#sort_by`, `String#concat`, `String#index`, `Time#+` та інших. +* IO.copy_stream використовує copy_file_range(2) для розвантаження копіювання. + [[Feature #13867]](https://bugs.ruby-lang.org/issues/13867) + +## Інші важливі зміни порівняно з 2.4 + +* SecureRandom тепер віддає перевагу джерелам, наданим ОС, над OpenSSL. + [[Bug #9569]](https://bugs.ruby-lang.org/issues/9569) +* Підвищено cmath, csv, date, dbm тощо, fcntl, fiddle, fileutils, gdbm, ipaddr, + scanf, sdbm, stringio, strscan, webrick, zlib зі стандартних бібліотек + до default gems. +* Оновлено до [Onigmo](https://github.com/k-takata/Onigmo/) 6.1.3. + * Додано [оператор відсутності](https://github.com/k-takata/Onigmo/issues/87). +* Оновлено до Psych 3.0.2. +* Оновлено до RubyGems 2.7.3. +* Оновлено до RDoc 6.0.1. + * [Змінено лексер з базованого на IRB на Ripper](https://github.com/ruby/rdoc/pull/512). + Це драматично покращує продуктивність генерації документації. +* Оновлено підтримувану версію Unicode до 10.0.0. +* `Thread.report_on_exception` тепер за замовчуванням встановлено в true. + Ця зміна допомагає налагодженню багатопотокових програм. + [[Feature #14143]](https://bugs.ruby-lang.org/issues/14143) +* IO#write тепер приймає кілька аргументів. + [[Feature #9323]](https://bugs.ruby-lang.org/issues/9323) + +Докладніше див. [NEWS](https://github.com/ruby/ruby/blob/v2_5_0/NEWS) +або [історію комітів](https://github.com/ruby/ruby/compare/v2_4_0...v2_5_0). + +З цими змінами +[6158 файлів змінено, 348484 вставок(+), 82747 видалень(-)](https://github.com/ruby/ruby/compare/v2_4_0...v2_5_0) +від Ruby 2.4.0! + +Веселого Різдва, гарних свят і насолоджуйтесь програмуванням з Ruby 2.5! + +## Завантаження + +* + + SIZE: 15834941 bytes + SHA1: 58f77301c891c1c4a08f301861c26b1ea46509f6 + SHA256: 46e6f3630f1888eb653b15fa811d77b5b1df6fd7a3af436b343cfe4f4503f2ab + SHA512: 0712fe68611f5d0cd6dd54b814f825478e64b6a62bdf67bce431f4dca2dc00b1a33f77bebfbcd0a151118a1152554ab457decde435b424aa1f004bc0aa40580d + +* + + SIZE: 19495617 bytes + SHA1: 700b6f55d689a5c8051c8c292b9e77a1b50bf96e + SHA256: 94559ea6e3c619423da604e503ce1dc1c465d6e0747a07fbdc5f294acaf14c24 + SHA512: e4324064cee8c65b80192e3eff287e915d2d40464d300744c36fb326ae4b1846911400a99d4332192d8a217009d3a5209b43eb5e8bc0b739035bef89cc493e84 + +* + + SIZE: 13955820 bytes + SHA1: 827b9a3bcffa86d1fc9ed96d403cb9dc37731688 + SHA256: d87eb3021f71d4f62e5a5329628ac9a6665902173296e551667edd94362325cc + SHA512: 8f6fdf6708e7470f55bc009db2567cd8d4e633ad0678d83a015441ecf5b5d88bd7da8fb8533a42157ff83b74d00b6dc617d39bbb17fc2c6c12287a1d8eaa0f2c + +* + + SIZE: 11292472 bytes + SHA1: 9c7babcf9e299be3f197d9091024ae458f1a1273 + SHA256: 1da0afed833a0dab94075221a615c14487b05d0c407f991c8080d576d985b49b + SHA512: 55714a33d7661fe8b432f73c34fd67b49699f8b79df1cbd680a74899124d31111ab0f444677672aac1ba725820182940d485efb2db0bf2bc96737c5d40c54578 diff --git a/ua/news/_posts/2018-12-25-ruby-2-6-0-released.md b/ua/news/_posts/2018-12-25-ruby-2-6-0-released.md new file mode 100644 index 0000000000..a82c3322bc --- /dev/null +++ b/ua/news/_posts/2018-12-25-ruby-2-6-0-released.md @@ -0,0 +1,143 @@ +--- +layout: news_post +title: "Вийшов Ruby 2.6.0" +author: "naruse" +translator: "Andrii Furmanets" +date: 2018-12-25 00:00:00 +0000 +lang: ua +--- + +Ми раді повідомити про реліз Ruby 2.6.0. + +Він вводить низку нових функцій і покращень продуктивності, зокрема: + + * Новий JIT-компілятор. + * Модуль `RubyVM::AbstractSyntaxTree`. + +## JIT [Експериментально] + +Ruby 2.6 вводить початкову реалізацію JIT (Just-In-Time) компілятора. + +JIT-компілятор націлений на покращення продуктивності програм Ruby. На відміну від традиційних JIT-компіляторів, що працюють у процесі, JIT Ruby записує C-код на диск і запускає звичайний C-компілятор для генерації нативного коду. Докладніше див. [організацію MJIT від Vladimir Makarov](https://bugs.ruby-lang.org/projects/ruby/wiki/MJIT#MJIT-organization). + +Щоб увімкнути JIT-компілятор, вкажіть `--jit` у командному рядку або в змінній середовища `$RUBYOPT`. Вказавши `--jit-verbose=1`, JIT-компілятор виводитиме додаткову інформацію. Прочитайте вивід `ruby --help` або [документацію](https://bugs.ruby-lang.org/projects/ruby/wiki/MJIT#Basic-usage) для інших опцій. + +JIT-компілятор підтримується, коли Ruby зібрано за допомогою GCC, Clang або Microsoft VC++, які мають бути доступні під час виконання. + +Станом на Ruby 2.6.0 ми досягли [швидкості в 1.7 раза](https://gist.github.com/k0kubun/d7f54d96f8e501bbbc78b927640f4208) порівняно з Ruby 2.5 на бенчмарку [Optcarrot](https://github.com/mame/optcarrot), що інтенсивно використовує CPU. Однак це ще експериментально, і багато інших навантажень, що інтенсивно використовують пам'ять, як-от Rails-застосунки, наразі можуть не отримати переваг. Докладніше див. [Ruby 2.6 JIT - Progress and Future](https://medium.com/@k0kubun/ruby-2-6-jit-progress-and-future-84e0a830ecbf). + +Слідкуйте за новою ерою продуктивності Ruby. + +## `RubyVM::AbstractSyntaxTree` [Експериментально] + +Ruby 2.6 вводить модуль `RubyVM::AbstractSyntaxTree`. **Сумісність цього модуля у майбутньому не гарантується.** + +Цей модуль має метод `parse`, який аналізує переданий рядок як код Ruby і повертає вузли AST (Abstract Syntax Tree) коду. Метод `parse_file` відкриває та аналізує переданий файл як код Ruby і повертає вузли AST. + +Також введено клас `RubyVM::AbstractSyntaxTree::Node`. Ви можете отримати місце у вихідному коді та дочірні вузли від об'єктів `Node`. Ця функція експериментальна. + +## Інші важливі нові функції + +* Додано псевдонім `#then` для `Kernel#yield_self`. [[Feature #14594]](https://bugs.ruby-lang.org/issues/14594) + +* Імена констант тепер можуть починатися з великої літери не-ASCII. [[Feature #13770]](https://bugs.ruby-lang.org/issues/13770) + +* Введено безкінечні діапазони. [[Feature #12912]](https://bugs.ruby-lang.org/issues/12912) + + Безкінечний діапазон, `(1..)`, працює так, ніби не має кінця. Ось типові випадки використання: + + ary[1..] # ідентично ary[1..-1] без магічного -1 + (1..).each {|index| ... } # перелічує значення починаючи з індексу 1 + ary.zip(1..) {|elem, index| ... } # ary.each.with_index(1) { ... } + +* Додано `Enumerable#chain` і `Enumerator#+`. [[Feature #15144]](https://bugs.ruby-lang.org/issues/15144) + +* Додано оператори композиції функцій `<<` і `>>` до `Proc` і `Method`. [[Feature #6284]](https://bugs.ruby-lang.org/issues/6284) + + f = proc{|x| x + 2} + g = proc{|x| x * 3} + (f << g).call(3) # -> 11; ідентично f(g(3)) + (f >> g).call(3) # -> 15; ідентично g(f(3)) + +* Додано `Binding#source_location`. [[Feature #14230]](https://bugs.ruby-lang.org/issues/14230) + +* Додано опцію `exception:` до `Kernel#system`, яка викликає виняток при невдачі замість повернення `false`. [[Feature #14386]](https://bugs.ruby-lang.org/issues/14386) + +* Додано режим oneshot до `Coverage`. [[Feature#15022]](https://bugs.ruby-lang.org/issues/15022) + +* Додано `FileUtils#cp_lr`. Працює як `cp_r`, але створює посилання замість копіювання. [[Feature #4189]](https://bugs.ruby-lang.org/issues/4189) + +## Покращення продуктивності + +* Пришвидшено `Proc#call` шляхом видалення тимчасового виділення для `$SAFE`. + [[Feature #14318]](https://bugs.ruby-lang.org/issues/14318) + + Ми спостерігали покращення продуктивності в 1.4 рази на бенчмарку `lc_fizzbuzz`, який викликає `Proc#call` багато разів. [[Bug #10212]](https://bugs.ruby-lang.org/issues/10212) + +* Пришвидшено `block.call`, коли `block` передається як параметр блоку. [[Feature #14330]](https://bugs.ruby-lang.org/issues/14330) + + У поєднанні з покращеннями обробки блоків, введеними в Ruby 2.5, виконання блоків тепер у 2.6 рази швидше на мікробенчмарку в Ruby 2.6. [[Feature #14045]](https://bugs.ruby-lang.org/issues/14045) + +* Введено Transient Heap (`theap`). [[Bug #14858]](https://bugs.ruby-lang.org/issues/14858) [[Feature #14989]](https://bugs.ruby-lang.org/issues/14989) + + `theap` — це керована купа для короткоживучих об'єктів пам'яті. Створення малих і короткоживучих об'єктів Hash у 2 рази швидше. На бенчмарку rdoc ми спостерігали покращення продуктивності на 6-7%. + +* Нативні реалізації (`arm32`, `arm64`, `ppc64le`, `win32`, `win64`, `x86`, `amd64`) корутин для значного покращення продуктивності перемикання контексту Fiber. [[Feature #14739]](https://bugs.ruby-lang.org/issues/14739) + + `Fiber.yield` і `Fiber#resume` приблизно в 5 разів швидше на 64-bit Linux. + +## Інші важливі зміни порівняно з 2.5 + +* `$SAFE` тепер є глобальним станом процесу і може бути встановлено назад в `0`. [[Feature #14250]](https://bugs.ruby-lang.org/issues/14250) + +* Передача `safe_level` до `ERB.new` застаріла. Аргументи `trim_mode` і `eoutvar` змінено на ключові аргументи. [[Feature #14256]](https://bugs.ruby-lang.org/issues/14256) + +* Підтримку Unicode оновлено до версії 11. + +* Об'єднано RubyGems 3.0.1. Опції `--ri` і `--rdoc` видалено. Використовуйте замість них `--document` і `--no-document`. + +* [Bundler](https://github.com/bundler/bundler) тепер встановлюється як default gem. + +* У блоках обробки винятків `else` без `rescue` тепер викликає синтаксичну помилку. [ЕКСПЕРИМЕНТАЛЬНО] [[Feature #14606]](https://bugs.ruby-lang.org/issues/14606) + +Докладніше див. [NEWS](https://github.com/ruby/ruby/blob/v2_6_0/NEWS) або [історію комітів](https://github.com/ruby/ruby/compare/v2_5_0...v2_6_0). + +З цими змінами [6437 файлів змінено, 231471 вставок(+), 98498 видалень(-)](https://github.com/ruby/ruby/compare/v2_5_0...v2_6_0) від Ruby 2.5.0! + +Веселого Різдва, гарних свят і насолоджуйтесь програмуванням з Ruby 2.6! + +## Відома проблема + +_(Цей розділ додано 28 січня 2019.)_ + +* [Net::Protocol::BufferedIO#write викликає NoMethodError при відправці великого багатобайтового рядка](https://github.com/ruby/ruby/pull/2058) + +## Завантаження + +* + + SIZE: 16687800 bytes + SHA1: c95f4e86e21390270dad3ebb94491fd42ee2ce69 + SHA256: f3c35b924a11c88ff111f0956ded3cdc12c90c04b72b266ac61076d3697fc072 + SHA512: 01f886b0c0782a06315c4a46414e9f2b66ee634ba4349c8e0697f511793ae3c56d2ad3cad6563f2b0fdcedf0ff3eba51b9afab907e7e1ac243475772f8688382 + +* + + SIZE: 20582054 bytes + SHA1: a804e63d18da12107e1d101918a3d8f4c5462a27 + SHA256: 8a4fb6ca58202495c9682cb88effd804398bd0ef023e3e36f001ca88d8b5855a + SHA512: 16d66ec4a2c6a2e928d5b50e094a5efa481ac6e4d5ed77459d351ef19fe692aa59b68307e3e25229eec5f30ae2f9adae2663bafe9c9d44bfb45d3833d77839d4 + +* + + SIZE: 14585856 bytes + SHA1: b8638eb806efbf7b6af87b24ccc6ad915f262318 + SHA256: c89ca663ad9a6238f4b1ec4d04c7dff630560c6e6eca6d30857c4d394f01a599 + SHA512: ca3daf9acf11d3db2900af21b66231bd1f025427a9d2212b35f6137ca03f77f57171ddfdb99022c8c8bcd730ff92a7a4af54e8a2a770a67d8e16c5807aa391f1 + +* + + SIZE: 11918536 bytes + SHA1: 9ddaeba3505d2855460c8c653159fc0ac8928c0f + SHA256: acb00f04374899ba8ee74bbbcb9b35c5c6b1fd229f1876554ee76f0f1710ff5f + SHA512: c56eaf85ef7b79deb34ee4590b143c07f4fc83eb79775290761aee5a7c63374659613538a41f25706ed6e19e49d5c67a1014c24d17f29948294c7abd0b0fcea8 diff --git a/ua/news/_posts/2019-12-12-separation-of-positional-and-keyword-arguments-in-ruby-3-0.md b/ua/news/_posts/2019-12-12-separation-of-positional-and-keyword-arguments-in-ruby-3-0.md new file mode 100644 index 0000000000..bcd3cfd489 --- /dev/null +++ b/ua/news/_posts/2019-12-12-separation-of-positional-and-keyword-arguments-in-ruby-3-0.md @@ -0,0 +1,274 @@ +--- +layout: news_post +title: "Розділення позиційних і ключових аргументів у Ruby 3.0" +author: "mame" +translator: "Andrii Furmanets" +date: 2019-12-12 12:00:00 +0000 +lang: ua +--- + +Ця стаття пояснює заплановану несумісність ключових аргументів у Ruby 3.0 + +## tl;dr + +У Ruby 3.0 позиційні аргументи та ключові аргументи будуть розділені. Ruby 2.7 попереджатиме про поведінку, яка зміниться в Ruby 3.0. Якщо ви бачите такі попередження, вам потрібно оновити свій код: + +* `Using the last argument as keyword parameters is deprecated`, або +* `Passing the keyword argument as the last hash parameter is deprecated`, або +* `Splitting the last argument into positional and keyword parameters is deprecated` + +У більшості випадків можна уникнути несумісності, додавши оператор _double splat_. Він явно вказує на передачу ключових аргументів замість об'єкта `Hash`. Так само можна додати фігурні дужки `{}`, щоб явно передати об'єкт `Hash` замість ключових аргументів. Докладніше читайте в розділі «Типові випадки» нижче. + +У Ruby 3 метод, який делегує всі аргументи, повинен явно делегувати ключові аргументи на додаток до позиційних. Якщо ви хочете зберегти поведінку делегування з Ruby 2.7 і раніших версій, використовуйте `ruby2_keywords`. Докладніше див. у розділі «Обробка делегування аргументів». + +## Типові випадки +{: #typical-cases } + +Ось найтиповіший випадок. Використовуйте оператор double splat (`**`) для передачі ключових слів замість Hash. + +{% highlight ruby %} +# Цей метод приймає лише ключовий аргумент +def foo(k: 1) + p k +end + +h = { k: 42 } + +# Цей виклик методу передає позиційний аргумент Hash +# У Ruby 2.7: Hash автоматично перетворюється на ключовий аргумент +# У Ruby 3.0: Цей виклик викликає ArgumentError +foo(h) + # => demo.rb:11: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call + # demo.rb:2: warning: The called method `foo' is defined here + # 42 + +# Щоб зберегти поведінку в Ruby 3.0, використовуйте double splat +foo(**h) #=> 42 +{% endhighlight %} + +Ось інший випадок. Використовуйте фігурні дужки (`{}`) для явної передачі Hash замість ключових слів. + +{% highlight ruby %} +# Цей метод приймає один позиційний аргумент і решту ключових аргументів +def bar(h, **kwargs) + p h +end + +# Цей виклик передає тільки ключовий аргумент і жодних позиційних +# У Ruby 2.7: Ключове слово перетворюється на позиційний аргумент Hash +# У Ruby 3.0: Цей виклик викликає ArgumentError +bar(k: 42) + # => demo2.rb:9: warning: Passing the keyword argument as the last hash parameter is deprecated + # demo2.rb:2: warning: The called method `bar' is defined here + # {:k=>42} + +# Щоб зберегти поведінку в Ruby 3.0, використовуйте фігурні дужки +bar({ k: 42 }) # => {:k=>42} +{% endhighlight %} + +## Що застаріло? +{: #what-is-deprecated } + +У Ruby 2 ключові аргументи можуть оброблятися як останній позиційний аргумент Hash, і навпаки — останній позиційний Hash може оброблятися як ключові аргументи. + +Оскільки автоматичне перетворення іноді занадто складне й проблемне (як описано в останньому розділі), воно застаріло в Ruby 2.7 і буде видалено в Ruby 3. Іншими словами, в Ruby 3 ключові аргументи будуть повністю відокремлені від позиційних. Отже, коли ви хочете передати ключові аргументи, завжди використовуйте `foo(k: expr)` або `foo(**expr)`. Якщо хочете приймати ключові аргументи, в принципі завжди використовуйте `def foo(k: default)` або `def foo(k:)` або `def foo(**kwargs)`. + +Зверніть увагу, що Ruby 3.0 поводиться так само при виклику методу, який не приймає ключові аргументи, з ключовими аргументами. Наприклад, наступний випадок не буде застарілим і працюватиме в Ruby 3.0. Ключові аргументи все ще обробляються як позиційний аргумент Hash. + +{% highlight ruby %} +def foo(kwargs = {}) + kwargs +end + +foo(k: 1) #=> {:k=>1} +{% endhighlight %} + +Це тому, що цей стиль використовується дуже часто, і немає неоднозначності в тому, як слід обробляти аргумент. + +Однак цей стиль не рекомендується в новому коді, якщо ви не часто передаєте Hash як позиційний аргумент і також використовуєте ключові аргументи. В іншому випадку використовуйте double splat: + +{% highlight ruby %} +def foo(**kwargs) + kwargs +end + +foo(k: 1) #=> {:k=>1} +{% endhighlight %} + +## Чи зламається мій код на Ruby 2.7? +{: #break-on-ruby-2-7 } + +Коротка відповідь: «можливо, ні». + +Зміни в Ruby 2.7 розроблено як шлях міграції до 3.0. Хоча в принципі Ruby 2.7 лише попереджає про поведінку, яка зміниться в Ruby 3, він включає деякі несумісні зміни, які ми вважаємо незначними. Докладніше див. розділ «Інші незначні зміни». + +За винятком попереджень і незначних змін, Ruby 2.7 намагається зберегти сумісність з Ruby 2.6. Отже, ваш код, ймовірно, працюватиме на Ruby 2.7, хоча може видавати попередження. І запустивши його на Ruby 2.7, ви можете перевірити, чи готовий ваш код до Ruby 3.0. + +Якщо хочете вимкнути попередження про застаріння, використовуйте аргумент командного рядка `-W:no-deprecated` або додайте `Warning[:deprecated] = false` у свій код. + +## Обробка делегування аргументів +{: #delegation } + +### Ruby 2.6 або раніше +{: #delegation-ruby-2-6-or-prior } + +У Ruby 2 можна написати метод делегування, приймаючи аргумент `*rest` і аргумент `&block`, і передаючи обидва до цільового методу. У цій поведінці ключові аргументи також неявно обробляються автоматичним перетворенням між позиційними та ключовими аргументами. + +{% highlight ruby %} +def foo(*args, &block) + target(*args, &block) +end +{% endhighlight %} + +### Ruby 3 +{: #delegation-ruby-3 } + +Потрібно явно делегувати ключові аргументи. + +{% highlight ruby %} +def foo(*args, **kwargs, &block) + target(*args, **kwargs, &block) +end +{% endhighlight %} + +Альтернативно, якщо вам не потрібна сумісність з Ruby 2.6 або раніше і ви не змінюєте жодних аргументів, можете використовувати новий синтаксис делегування (`...`), введений у Ruby 2.7. + +{% highlight ruby %} +def foo(...) + target(...) +end +{% endhighlight %} + +### Ruby 2.7 +{: #delegation-ruby-2-7 } + +Коротко: використовуйте `Module#ruby2_keywords` і делегуйте `*args, &block`. + +{% highlight ruby %} +ruby2_keywords def foo(*args, &block) + target(*args, &block) +end +{% endhighlight %} + +`ruby2_keywords` приймає ключові аргументи як останній аргумент Hash і передає їх як ключові аргументи при виклику іншого методу. + +### Сумісне делегування для Ruby 2.6, 2.7 і Ruby 3 +{: #a-compatible-delegation } + +Коротко: знову використовуйте `Module#ruby2_keywords`. + +{% highlight ruby %} +ruby2_keywords def foo(*args, &block) + target(*args, &block) +end +{% endhighlight %} + +На жаль, нам потрібно використовувати старий стиль делегування (тобто без `**kwargs`), оскільки Ruby 2.6 або раніше не обробляє новий стиль делегування правильно. Це одна з причин розділення ключових аргументів. І `ruby2_keywords` дозволяє запускати старий стиль навіть у Ruby 2.7 і 3.0. Оскільки `ruby2_keywords` не визначено в 2.6 або раніше, використовуйте [гем ruby2_keywords](https://rubygems.org/gems/ruby2_keywords) або визначте його самостійно: + +{% highlight ruby %} +def ruby2_keywords(*) +end if RUBY_VERSION < "2.7" +{% endhighlight %} + +--- + +Якщо вашому коду не потрібно працювати на Ruby 2.6 або старішому, можете спробувати новий стиль у Ruby 2.7. У майже всіх випадках він працює. Однак зверніть увагу на кутові випадки: + +{% highlight ruby %} +def target(*args) + p args +end + +def foo(*args, **kwargs, &block) + target(*args, **kwargs, &block) +end + +foo({}) #=> Ruby 2.7: [] ({} відкидається) +foo({}, **{}) #=> Ruby 2.7: [{}] (Можете передати {} явно вказавши «без» ключових слів) +{% endhighlight %} + +Порожній аргумент Hash автоматично перетворюється і поглинається в `**kwargs`, і виклик делегування видаляє порожній keyword hash, тому жодного аргументу не передається в `target`. + +Якщо ви справді турбуєтесь про переносимість, використовуйте `ruby2_keywords`. `ruby2_keywords` може бути видалено в майбутньому після того, як Ruby 2.6 досягне кінця життєвого циклу. На той момент ми рекомендуємо явно делегувати ключові аргументи. + +## Інші незначні зміни +{: #other-minor-changes } + +У Ruby 2.7 є три незначні зміни щодо ключових аргументів. + +### 1. Не-Symbol ключі дозволені в ключових аргументах +{: #other-minor-changes-non-symbol-keys } + +У Ruby 2.6 або раніше в ключових аргументах дозволялися лише Symbol-ключі. У Ruby 2.7 ключові аргументи можуть використовувати не-Symbol ключі. + +{% highlight ruby %} +def foo(**kwargs) + kwargs +end +foo("key" => 42) + #=> Ruby 2.6 або раніше: ArgumentError: wrong number of arguments + #=> Ruby 2.7 або пізніше: {"key"=>42} +{% endhighlight %} + +### 2. Double splat з порожнім hash (`**{}`) не передає аргументів +{: #other-minor-changes-empty-hash } + +У Ruby 2.6 або раніше передача `**empty_hash` передавала порожній Hash як позиційний аргумент. У Ruby 2.7 або пізніше він не передає жодних аргументів. + +{% highlight ruby %} +def foo(*args) + args +end + +empty_hash = {} +foo(**empty_hash) + #=> Ruby 2.6 або раніше: [{}] + #=> Ruby 2.7 або пізніше: [] +{% endhighlight %} + +### 3. Введено синтаксис без ключових аргументів (`**nil`) +{: #other-minor-changes-double-splat-nil } + +Можна використовувати `**nil` у визначенні методу, щоб явно позначити, що метод не приймає ключових аргументів. Виклик таких методів з ключовими аргументами призведе до `ArgumentError`. + +{% highlight ruby %} +def foo(*args, **nil) +end + +foo(k: 1) + #=> Ruby 2.7 або пізніше: no keywords accepted (ArgumentError) +{% endhighlight %} + +## Чому ми застаріли автоматичне перетворення +{: #why-deprecated } + +Автоматичне перетворення спочатку здавалося гарною ідеєю і добре працювало в багатьох випадках. Однак у нього було занадто багато кутових випадків, і ми отримали багато звітів про помилки щодо цієї поведінки. + +Автоматичне перетворення не працює добре, коли метод приймає опціональні позиційні аргументи та ключові аргументи. Деякі люди очікують, що останній об'єкт Hash буде оброблено як позиційний аргумент, а інші очікують, що він буде перетворено на ключові аргументи. + +Ось один з найбільш заплутаних випадків: + +{% highlight ruby %} +def foo(x, **kwargs) + p [x, kwargs] +end + +def bar(x=1, **kwargs) + p [x, kwargs] +end + +foo({}) #=> [{}, {}] +bar({}) #=> [1, {}] + +bar({}, **{}) #=> очікувано: [{}, {}], фактично: [1, {}] +{% endhighlight %} + +У Ruby 2, `foo({})` передає порожній hash як звичайний аргумент (тобто `{}` присвоюється `x`), тоді як `bar({})` передає ключовий аргумент (тобто `{}` присвоюється `kwargs`). Отже, `any_method({})` дуже неоднозначний. + +## Подяки + +Цю статтю люб'язно переглянули (або навіть співавторчо написали) Jeremy Evans і Benoit Daloze. + +## Історія + +* Оновлено 2019-12-25: У 2.7.0-rc2 повідомлення попередження було трохи змінено, і додано API для придушення попереджень. diff --git a/ua/news/_posts/2019-12-25-ruby-2-7-0-released.md b/ua/news/_posts/2019-12-25-ruby-2-7-0-released.md new file mode 100644 index 0000000000..a235943272 --- /dev/null +++ b/ua/news/_posts/2019-12-25-ruby-2-7-0-released.md @@ -0,0 +1,210 @@ +--- +layout: news_post +title: "Вийшов Ruby 2.7.0" +author: "naruse" +translator: "Andrii Furmanets" +date: 2019-12-25 00:00:00 +0000 +lang: ua +--- + +Ми раді повідомити про реліз Ruby 2.7.0. + +Він вводить низку нових функцій і покращень продуктивності, зокрема: + +* Зіставлення шаблонів +* Покращення REPL +* Компактизуючий GC +* Розділення позиційних і ключових аргументів + +## Зіставлення шаблонів [Експериментально] + +Зіставлення шаблонів (Pattern Matching), широко використовувана функція у функціональних мовах програмування, введено як експериментальну функцію. +[[Feature #14912]](https://bugs.ruby-lang.org/issues/14912) + +Воно може обходити переданий об'єкт і присвоювати його значення, якщо воно відповідає шаблону. + +```ruby +require "json" + +json = < 2 +end +``` + +Докладніше див. [Pattern matching - New feature in Ruby 2.7](https://speakerdeck.com/k_tsj/pattern-matching-new-feature-in-ruby-2-dot-7). + +## Покращення REPL + +`irb`, вбудоване інтерактивне середовище (REPL; Read-Eval-Print-Loop), тепер підтримує багаторядкове редагування. Його забезпечує `reline`, бібліотека, сумісна з `readline`, реалізована на чистому Ruby. Також додано інтеграцію з rdoc. В `irb` можна відображати документацію для класів, модулів і методів. +[[Feature #14683]](https://bugs.ruby-lang.org/issues/14683), +[[Feature #14787]](https://bugs.ruby-lang.org/issues/14787), +[[Feature #14918]](https://bugs.ruby-lang.org/issues/14918) + +Крім того, рядки коду, показані через `Binding#irb`, та результати інспекції об'єктів базових класів тепер підсвічуються кольором. + + + +## Компактизуючий GC + +Цей реліз вводить компактизуючий GC, який може дефрагментувати фрагментовану пам'ять. + +Деякі багатопотокові програми Ruby можуть викликати фрагментацію пам'яті, що призводить до високого використання пам'яті та зниження швидкості. + +Метод `GC.compact` введено для компактизації купи. Ця функція ущільнює живі об'єкти в купі, щоб використовувати менше сторінок, і купа може бути більш дружньою до CoW (copy-on-write). +[[Feature #15626]](https://bugs.ruby-lang.org/issues/15626) + +## Розділення позиційних і ключових аргументів + +Автоматичне перетворення ключових аргументів і позиційних аргументів застаріло і буде видалено в Ruby 3. +[[Feature #14183]](https://bugs.ruby-lang.org/issues/14183) + +Докладніше див. статтю «[Separation of positional and keyword arguments in Ruby 3.0](https://www.ruby-lang.org/en/news/2019/12/12/separation-of-positional-and-keyword-arguments-in-ruby-3-0/)». + +## Інші важливі нові функції + +* Нумеровані параметри як параметри блоків за замовчуванням. + [[Feature #4475]](https://bugs.ruby-lang.org/issues/4475) + +* Експериментально введено діапазон без початку. + [[Feature #14799]](https://bugs.ruby-lang.org/issues/14799) + + ```ruby + ary[..3] # ідентично ary[0..3] + rel.where(sales: ..100) + ``` + +* Додано `Enumerable#tally`. Він підраховує кількість кожного елемента. + + ```ruby + ["a", "b", "c", "b"].tally + #=> {"a"=>1, "b"=>2, "c"=>1} + ``` + +* Виклик приватного методу з літералом `self` як одержувачем тепер дозволено. + [[Feature #11297]](https://bugs.ruby-lang.org/issues/11297), + [[Feature #16123]](https://bugs.ruby-lang.org/issues/16123) + + ```ruby + def foo + end + private :foo + self.foo + ``` + +* Додано `Enumerator::Lazy#eager`. Він створює не-лінивий перелічувач з лінивого. + [[Feature #15901]](https://bugs.ruby-lang.org/issues/15901) + + ```ruby + a = %w(foo bar baz) + e = a.lazy.map {|x| x.upcase }.map {|x| x + "!" }.eager + p e.class #=> Enumerator + p e.map {|x| x + "?" } #=> ["FOO!?", "BAR!?", "BAZ!?"] + ``` + +## Покращення продуктивності + +* JIT [Експериментально] + + * JIT-код перекомпільовується на менш оптимізований код, коли припущення оптимізації стає недійсним. + * Виконується inline методів, коли метод вважається чистим. + * Значення за замовчуванням `--jit-min-calls` змінено з 5 на 10 000. + * Значення за замовчуванням `--jit-max-cache` змінено з 1 000 на 100. + +* Стратегію кешування Fiber змінено, і створення fiber пришвидшено. + [GH-2224](https://github.com/ruby/ruby/pull/2224) + +* `Module#name`, `true.to_s`, `false.to_s` і `nil.to_s` тепер завжди повертають заморожений String. + [Експериментально] + [[Feature #16150]](https://bugs.ruby-lang.org/issues/16150) + +* Покращено продуктивність `CGI.escapeHTML`. + [GH-2226](https://github.com/ruby/ruby/pull/2226) + +* Покращено продуктивність Monitor і MonitorMixin. + [[Feature #16255]](https://bugs.ruby-lang.org/issues/16255) + +## Інші важливі зміни порівняно з 2.6 + +* Деякі стандартні бібліотеки оновлено. + * Bundler 2.1.2 + * RubyGems 3.1.2 + * Racc 1.4.15 + * CSV 3.1.2 + * REXML 3.2.3 + * RSS 0.2.8 + * StringScanner 1.0.3 + +* Наступні бібліотеки більше не bundled gems. Встановіть відповідні геми, щоб використовувати ці функції. + * CMath (cmath gem) + * Scanf (scanf gem) + * Shell (shell gem) + * Synchronizer (sync gem) + * ThreadsWait (thwait gem) + * E2MM (e2mmap gem) + +* `profile.rb` видалено зі стандартної бібліотеки. + +* Оновлено версію Unicode та Emoji з 11.0.0 до 12.0.0. + [[Feature #15321]](https://bugs.ruby-lang.org/issues/15321) + +* Оновлено версію Unicode до 12.1.0, додано підтримку U+32FF SQUARE ERA NAME REIWA. + [[Feature #15195]](https://bugs.ruby-lang.org/issues/15195) + +* Потрібна підтримка C99 від компіляторів. + [[Misc #15347]](https://bugs.ruby-lang.org/issues/15347) + +Докладніше див. [NEWS](https://github.com/ruby/ruby/blob/v2_7_0/NEWS) +або [історію комітів](https://github.com/ruby/ruby/compare/v2_6_0...v2_7_0). + +{% assign release = site.data.releases | where: "version", "2.7.0" | first %} + +З цими змінами [{{ release.stats.files_changed }} файлів змінено, {{ release.stats.insertions }} вставок(+), {{ release.stats.deletions }} видалень(-)](https://github.com/ruby/ruby/compare/v2_6_0...v2_7_0) від Ruby 2.6.0! + +Веселого Різдва, гарних свят і насолоджуйтесь програмуванням з Ruby 2.7! + +## Завантаження + +* <{{ release.url.bz2 }}> + + SIZE: {{ release.size.bz2 }} + SHA1: {{ release.sha1.bz2 }} + SHA256: {{ release.sha256.bz2 }} + SHA512: {{ release.sha512.bz2 }} + +* <{{ release.url.gz }}> + + SIZE: {{ release.size.gz }} + SHA1: {{ release.sha1.gz }} + SHA256: {{ release.sha256.gz }} + SHA512: {{ release.sha512.gz }} + +* <{{ release.url.xz }}> + + SIZE: {{ release.size.xz }} + SHA1: {{ release.sha1.xz }} + SHA256: {{ release.sha256.xz }} + SHA512: {{ release.sha512.xz }} + +* <{{ release.url.zip }}> + + SIZE: {{ release.size.zip }} + SHA1: {{ release.sha1.zip }} + SHA256: {{ release.sha256.zip }} + SHA512: {{ release.sha512.zip }} + +## Що таке Ruby + +Ruby вперше розробив Matz (Yukihiro Matsumoto) у 1993 році, +і зараз розвивається як Open Source. Він працює на багатьох платформах +і використовується по всьому світу, особливо для веброзробки. diff --git a/ua/news/_posts/2020-12-25-ruby-3-0-0-released.md b/ua/news/_posts/2020-12-25-ruby-3-0-0-released.md new file mode 100644 index 0000000000..b96c0e74d5 --- /dev/null +++ b/ua/news/_posts/2020-12-25-ruby-3-0-0-released.md @@ -0,0 +1,297 @@ +--- +layout: news_post +title: "Вийшов Ruby 3.0.0" +author: "naruse" +translator: "Andrii Furmanets" +date: 2020-12-25 00:00:00 +0000 +lang: ua +--- + +Ми раді повідомити про реліз Ruby 3.0.0. Починаючи з 2015 року, ми наполегливо працювали над Ruby 3, метою якого є продуктивність, паралелізм і типізація. Особливо щодо продуктивності, Matz заявив: «Ruby3 буде в 3 рази швидшим за Ruby2» — так звана ініціатива [Ruby 3x3](https://blog.heroku.com/ruby-3-by-3). + +{% assign release = site.data.releases | where: "version", "3.0.0" | first %} + +Optcarrot 3000 frames + +З [бенчмарком Optcarrot](https://github.com/mame/optcarrot), який вимірює однопотокову продуктивність на основі емуляції ігор NES, він досяг у 3 рази кращої продуктивності, ніж Ruby 2.0!
Ці результати отримані в середовищі, описаному на [benchmark-driver.github.io/hardware.html](https://benchmark-driver.github.io/hardware.html). Використано [коміт 8c510e4095](https://github.com/ruby/ruby/commit/8c510e4095) як Ruby 3.0. Залежно від вашого середовища або бенчмарку результат може відрізнятися.
+ +Ruby 3.0.0 досягає цих цілей завдяки: +* Продуктивність + * MJIT +* Паралелізм + * Ractor + * Fiber Scheduler +* Типізація (Статичний аналіз) + * RBS + * TypeProf + +З наведеним вище покращенням продуктивності Ruby 3.0 вводить кілька нових функцій, описаних нижче. + +## Продуктивність + +> Коли я вперше оголосив «Ruby3x3» на конференції, багато хто, включаючи членів основної команди, вважав: «Матц хвалько». Насправді я й сам так думав. Але ми це зробили. Я радий бачити, що основна команда справді змогла зробити Ruby 3.0 утричі швидшим за Ruby 2.0 (в деяких бенчмарках). — Matz + +### MJIT + +Було впроваджено багато покращень у MJIT. Докладніше див. у NEWS. + +Станом на Ruby 3.0, JIT має покращувати продуктивність в обмежених сценаріях, таких як ігри ([Optcarrot](https://benchmark-driver.github.io/benchmarks/optcarrot/commits.html#chart-1)), ШІ ([Rubykon](https://benchmark-driver.github.io/benchmarks/rubykon/commits.html)) або будь-який застосунок, який витрачає більшість часу на виклик кількох методів багато разів. + +Хоча Ruby 3.0 [значно зменшив розмір JIT-коду](https://twitter.com/k0kubun/status/1256142302608650244), він ще не готовий для оптимізації таких навантажень, як Rails, які часто витрачають час на багато методів і тому страждають від промахів i-cache, погіршених JIT. Очікуйте подальших покращень у Ruby 3.1. + +## Паралелізм + +> Сьогодні ера багатоядерних процесорів. Паралелізм дуже важливий. З Ractor разом з асинхронним Fiber Ruby стане справжньою паралельною мовою. — Matz + +### Ractor (експериментальний) + +Ractor — це абстракція паралелізму на зразок моделі акторів, розроблена для забезпечення можливості паралельного виконання без проблем із безпекою потоків. + +Ви можете створювати кілька ракторів і запускати їх паралельно. Ractor дозволяє створювати потокобезпечні паралельні програми, оскільки рактори не можуть ділитися звичайними об'єктами. Комунікація між ракторами здійснюється через обмін повідомленнями. + +Щоб обмежити спільне використання об'єктів, Ractor вводить кілька обмежень до синтаксису Ruby (без кількох ракторів обмежень немає). + +Специфікація та реалізація ще не дозріли і можуть змінитися в майбутньому, тому цю функцію позначено як експериментальну, і при першому `Ractor.new` з'являється попередження «experimental feature». + +Наступна невелика програма вимірює час виконання відомої функції бенчмарку tak ([Tak (function) - Wikipedia](https://en.wikipedia.org/wiki/Tak_(function))), виконуючи її 4 рази послідовно або 4 рази паралельно з ракторами. + +``` ruby +def tarai(x, y, z) = + x <= y ? y : tarai(tarai(x-1, y, z), + tarai(y-1, z, x), + tarai(z-1, x, y)) +require 'benchmark' +Benchmark.bm do |x| + # послідовна версія + x.report('seq'){ 4.times{ tarai(14, 7, 0) } } + + # паралельна версія + x.report('par'){ + 4.times.map do + Ractor.new { tarai(14, 7, 0) } + end.each(&:take) + } +end +``` + +``` +Результат бенчмарку: + user system total real +seq 64.560736 0.001101 64.561837 ( 64.562194) +par 66.422010 0.015999 66.438009 ( 16.685797) +``` + +Результат отримано на Ubuntu 20.04, Intel(R) Core(TM) i7-6700 (4 ядра, 8 апаратних потоків). Паралельна версія в 3.87 разів швидша за послідовну. + +Докладніше див. [doc/ractor.md](https://docs.ruby-lang.org/en/3.0/ractor_md.html). + +### Fiber Scheduler + +`Fiber#scheduler` введено для перехоплення блокувальних операцій. Це дозволяє реалізувати легку конкурентність без зміни існуючого коду. Перегляньте [«Don't Wait For Me, Scalable Concurrency for Ruby 3»](https://www.youtube.com/watch?v=Y29SSOS4UOc) для огляду того, як це працює. + +Підтримувані класи/методи: + +- `Mutex#lock`, `Mutex#unlock`, `Mutex#sleep` +- `ConditionVariable#wait` +- `Queue#pop`, `SizedQueue#push` +- `Thread#join` +- `Kernel#sleep` +- `Process.wait` +- `IO#wait`, `IO#read`, `IO#write` та пов'язані методи (напр., `#wait_readable`, `#gets`, `#puts` тощо). +- `IO#select` *не підтримується*. + +Ця приклад-програма виконує кілька HTTP-запитів паралельно: + +``` ruby +require 'async' +require 'net/http' +require 'uri' + +Async do + ["ruby", "rails", "async"].each do |topic| + Async do + Net::HTTP.get(URI "https://www.google.com/search?q=#{topic}") + end + end +end +``` + +Вона використовує [async](https://github.com/socketry/async), що надає цикл подій. Цей цикл подій використовує хуки `Fiber#scheduler`, щоб зробити `Net::HTTP` неблокувальним. Інші геми можуть використовувати цей інтерфейс для неблокувального виконання в Ruby. + +## Статичний аналіз + +> 2010-і були ерою статично типізованих мов програмування. Ruby шукає майбутнє зі статичною перевіркою типів без оголошення типів, використовуючи абстрактну інтерпретацію. RBS і TypeProf — перші кроки до цього майбутнього. Більше кроків попереду. — Matz + +### RBS + +RBS — це мова для опису типів програм Ruby. + +Перевірники типів, включаючи TypeProf та інші інструменти з підтримкою RBS, краще розумітимуть програми Ruby з визначеннями RBS. + +Ви можете записати визначення класів і модулів: методи, визначені в класі, змінні екземпляра та їхні типи, а також відносини наслідування/міксинів. + +Мета RBS — підтримувати типові патерни в програмах Ruby та дозволяти записувати розширені типи, включаючи типи-об'єднання, перевантаження методів і генерики. Він також підтримує duck typing за допомогою _інтерфейсних типів_. + +Ruby 3.0 поставляється з гемом `rbs`, який дозволяє парсити та обробляти визначення типів, записані в RBS. +Ось невеликий приклад RBS з визначеннями класу, модуля та константи. + +``` rbs +module ChatApp + VERSION: String + class Channel + attr_reader name: String + attr_reader messages: Array[Message] + attr_reader users: Array[User | Bot] # `|` означає типи-об'єднання, `User` або `Bot`. + def initialize: (String) -> void + def post: (String, from: User | Bot) -> Message # Підтримується перевантаження методів. + | (File, from: User | Bot) -> Message + end +end +``` + +Докладніше див. [README гема rbs](https://github.com/ruby/rbs). + +### TypeProf + +TypeProf — інструмент аналізу типів, що входить до пакету Ruby. + +Наразі TypeProf працює як виведення типів. + +Він читає звичайний (без анотацій типів) код Ruby, аналізує, які методи визначено та як вони використовуються, і генерує прототип сигнатури типу у форматі RBS. + +Ось коротка демонстрація TypeProf. + +Приклад вхідних даних: + +``` ruby +# test.rb +class User + def initialize(name:, age:) + @name, @age = name, age + end + attr_reader :name, :age +end +User.new(name: "John", age: 20) +``` + +Приклад виводу: + +``` +$ typeprof test.rb +# Classes +class User + attr_reader name : String + attr_reader age : Integer + def initialize : (name: String, age: Integer) -> [String, Integer] +end +``` + +Ви можете запустити TypeProf, зберігши вхідні дані як «test.rb» і виконавши команду «typeprof test.rb». + +Ви також можете [спробувати TypeProf онлайн](https://mame.github.io/typeprof-playground/#rb=%23+test.rb%0Aclass+User%0A++def+initialize%28name%3A%2C+age%3A%29%0A++++%40name%2C+%40age+%3D+name%2C+age%0A++end%0A++%0A++attr_reader+%3Aname%2C+%3Aage%0Aend%0A%0AUser.new%28name%3A+%22John%22%2C+age%3A+20%29&rbs=). (Він виконує TypeProf на сервері, тож вибачте, якщо не працює!) + +Докладніше див. [документацію TypeProf](https://github.com/ruby/typeprof/blob/master/doc/doc.md) та [демо](https://github.com/ruby/typeprof/blob/master/doc/demo.md). + +TypeProf експериментальний і ще не дозрілий; підтримується лише підмножина мови Ruby, а виявлення помилок типів обмежене. Проте він швидко розвивається. Будь-який зворотний зв'язок вітається. + +## Інші важливі нові функції + +* Однорядкове зіставлення шаблонів перероблено. (експериментально) + + * Додано `=>`. Можна використовувати як присвоєння справа наліво. + + ```ruby + 0 => a + p a #=> 0 + + {b: 0, c: 1} => {b:} + p b #=> 0 + ``` + + * `in` тепер повертає `true` або `false`. + + ```ruby + # версія 3.0 + 0 in 1 #=> false + + # версія 2.7 + 0 in 1 #=> raise NoMatchingPatternError + ``` + +* Додано Find-патерн. (експериментально) + + ``` ruby + case ["a", 1, "b", "c", 2, "d", "e", "f", 3] + in [*pre, String => x, String => y, *post] + p pre #=> ["a", 1] + p x #=> "b" + p y #=> "c" + p post #=> [2, "d", "e", "f", 3] + end + ``` + +* Додано безкінечне визначення методу. + + ``` ruby + def square(x) = x * x + ``` + +* `Hash#except` тепер вбудовано. + + ``` ruby + h = { a: 1, b: 2, c: 3 } + p h.except(:a) #=> {:b=>2, :c=>3} + ``` + +* Memory view додано як експериментальну функцію. + +## Покращення продуктивності + +* Вставка довгого коду в IRB стала в 53 рази швидшою, ніж у версії з Ruby 2.7.0. + +## Інші важливі зміни порівняно з 2.7 + +* Ключові аргументи відокремлено від інших аргументів. + * Код, що виводить попередження в Ruby 2.7, не працюватиме. Докладніше див. [цей документ](https://www.ruby-lang.org/en/news/2019/12/12/separation-of-positional-and-keyword-arguments-in-ruby-3-0/). + * До речі, передача аргументів тепер підтримує початкові аргументи. + +* Зіставлення шаблонів (`case`/`in`) більше не експериментальне. +* Функцію `$SAFE` повністю видалено; тепер це звичайна глобальна змінна. +* Деякі стандартні бібліотеки оновлено. +* Наступні бібліотеки більше не є bundled gems або стандартними бібліотеками: sdbm, webrick, net-telnet, xmlrpc. + +Докладніше див. [NEWS](https://github.com/ruby/ruby/blob/{{ release.tag }}/NEWS.md) +або [історію комітів](https://github.com/ruby/ruby/compare/v2_7_0...{{ release.tag }}). + +> Ruby3.0 — це віха. Мова еволюціонувала, зберігаючи сумісність. Але це не кінець. Ruby продовжить розвиватися і ставатиме ще кращим. Слідкуйте за новинами! — Matz + +Веселого Різдва, гарних свят і насолоджуйтесь програмуванням з Ruby 3.0! + +## Завантаження + +* <{{ release.url.gz }}> + + SIZE: {{ release.size.gz }} + SHA1: {{ release.sha1.gz }} + SHA256: {{ release.sha256.gz }} + SHA512: {{ release.sha512.gz }} + +* <{{ release.url.xz }}> + + SIZE: {{ release.size.xz }} + SHA1: {{ release.sha1.xz }} + SHA256: {{ release.sha256.xz }} + SHA512: {{ release.sha512.xz }} + +* <{{ release.url.zip }}> + + SIZE: {{ release.size.zip }} + SHA1: {{ release.sha1.zip }} + SHA256: {{ release.sha256.zip }} + SHA512: {{ release.sha512.zip }} + +## Що таке Ruby + +Ruby вперше розробив Matz (Yukihiro Matsumoto) у 1993 році, +і зараз розвивається як Open Source. Він працює на багатьох платформах +і використовується по всьому світу, особливо для веброзробки. From 546ae64705308cc3b9ce7dfd29babce63c136e98 Mon Sep 17 00:00:00 2001 From: Andrii Furmanets Date: Mon, 22 Dec 2025 16:14:22 +0200 Subject: [PATCH 3/5] docs: update Ruby 2.5.0 release news post --- ua/news/_posts/2017-12-25-ruby-2-5-0-released.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ua/news/_posts/2017-12-25-ruby-2-5-0-released.md b/ua/news/_posts/2017-12-25-ruby-2-5-0-released.md index 20b72ee250..910c35be7f 100644 --- a/ua/news/_posts/2017-12-25-ruby-2-5-0-released.md +++ b/ua/news/_posts/2017-12-25-ruby-2-5-0-released.md @@ -38,10 +38,10 @@ Ruby 2.5.0 — перший стабільний реліз серії Ruby 2.5. * Одну з найулюбленіших бібліотек, pp.rb, тепер завантажується автоматично. Вам більше не потрібно писати `require "pp"`. [[Feature #14123]](https://bugs.ruby-lang.org/issues/14123) -* Backtrace та повідомлення про помилку тепер друкуються у зворотному порядку - (спочатку найстаріший виклик, останнім — найновіший). Коли довгий backtrace +* Backtrace та повідомлення про помилку тепер друкуються у зворотному порядку + (спочатку найстаріший виклик, останнім — найновіший). Коли довгий backtrace з'являється у терміналі (TTY), ви можете легко знайти рядок причини внизу. - Зверніть увагу, що порядок змінюється, тільки коли backtrace виводиться + Зверніть увагу, що порядок змінюється, тільки коли backtrace виводиться безпосередньо в термінал. [[Feature #8661]](https://bugs.ruby-lang.org/issues/8661) [експериментально] From 7f522f591ee15e5ee2c23d6a42412fc6be36fab8 Mon Sep 17 00:00:00 2001 From: Andrii Furmanets Date: Mon, 22 Dec 2025 16:38:38 +0200 Subject: [PATCH 4/5] fix: update community link URL in Ukrainian locale --- _data/locales/home/ua.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_data/locales/home/ua.yml b/_data/locales/home/ua.yml index da3ff755ac..3b0c2f4829 100644 --- a/_data/locales/home/ua.yml +++ b/_data/locales/home/ua.yml @@ -100,7 +100,7 @@ community: motto_translation: "Matz is nice and so we are nice" links: - text: "Дізнайтеся більше про спільноту" - url: "/ua/community/" + url: "/community/" - text: "Майбутні міжнародні конференції" url: "https://www.rubyevents.org" external: true From f6abe0118b0cf7e1734d46832399f26fdf12dc59 Mon Sep 17 00:00:00 2001 From: Andrii Furmanets Date: Mon, 22 Dec 2025 17:29:52 +0200 Subject: [PATCH 5/5] fix: update Ukrainian translations for community motto and navigation items --- _data/locales/home/ua.yml | 2 +- _data/locales/ua.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/_data/locales/home/ua.yml b/_data/locales/home/ua.yml index 3b0c2f4829..0297d359b8 100644 --- a/_data/locales/home/ua.yml +++ b/_data/locales/home/ua.yml @@ -97,7 +97,7 @@ community: motto_prefix: "Універсальний девіз —" motto_minaswan: "MINASWAN" motto_separator: "—" - motto_translation: "Matz is nice and so we are nice" + motto_translation: "Matz добрий, тож і ми добрі" links: - text: "Дізнайтеся більше про спільноту" url: "/community/" diff --git a/_data/locales/ua.yml b/_data/locales/ua.yml index c0789a1f65..d26471fd45 100644 --- a/_data/locales/ua.yml +++ b/_data/locales/ua.yml @@ -54,13 +54,13 @@ navigation: url: /ua/documentation/faq/ - text: Почати та дослідити submenu: - - text: TryRuby + - text: Спробуйте Ruby url: https://try.ruby-lang.org/ external: true - - text: Ruby Reference Manual + - text: Довідник Ruby url: https://docs.ruby-lang.org/en/3.4/ external: true - - text: The Ruby Bibliography + - text: Бібліографія Ruby url: https://rubybib.org/ external: true - text: Бібліотеки