Вышел Ruby 4.0.0
Опубликовал naruse 25-12-2025
Перевел: ablzh
Мы рады сообщить о выпуске Ruby 4.0.0. Ruby 4.0 представляет «Ruby Box» и «ZJIT», а также добавляет множество улучшений.
Ruby Box
Ruby Box — это новая (экспериментальная) возможность для обеспечения разделения определений. Ruby Box включается, когда задана переменная окружения RUBY_BOX=1. Класс — Ruby::Box.
Определения, загруженные в box (коробку), изолированы внутри неё. Ruby Box может изолировать/разделять monkey patches, изменения глобальных переменных и переменных класса, определения классов/модулей и загруженные нативные/ruby библиотеки от других boxes.
Ожидаемые сценарии использования:
- Запуск тест-кейсов в box для защиты других тестов, когда тест-кейс использует monkey patches для переопределения чего-либо
- Параллельный запуск boxes веб-приложения для выполнения blue-green развертывания на сервере приложений в процессе Ruby
- Параллельный запуск boxes веб-приложения для оценки обновлений зависимостей в течение определенного периода времени путем проверки разницы ответов с использованием кода Ruby
- Использование в качестве базового (низкоуровневого) API для реализации API типа «пакет» (высокоуровневого) (он пока не спроектирован)
Подробнее о «Ruby Box» смотрите Ruby::Box. [Feature #21311] [Misc #21385]
ZJIT
ZJIT — это новый just-in-time (JIT) компилятор, который разрабатывается как следующее поколение YJIT. Вам нужен Rust 1.85.0 или новее для сборки Ruby с поддержкой ZJIT, и ZJIT включается, когда указан --zjit.
Мы создаем новый компилятор для Ruby, потому что хотим одновременно поднять потолок производительности (больший размер единицы компиляции и SSA IR) и поощрить больший вклад извне (став более традиционным компилятором методов). Смотрите наш пост в блоге для подробностей.
ZJIT быстрее интерпретатора, но пока не так быстр, как YJIT. Мы призываем вас экспериментировать с ZJIT, но, возможно, воздержаться от развертывания его в продакшене на данный момент. Следите за новостями о ZJIT в Ruby 4.1.
Улучшения Ractor
Ractor, механизм параллельного выполнения Ruby, получил несколько улучшений. Был представлен новый класс Ractor::Port для решения проблем, связанных с отправкой и получением сообщений (смотрите наш пост в блоге). Кроме того, Ractor.shareable_proc упрощает совместное использование объектов Proc между Ractor-ами.
Что касается производительности, многие внутренние структуры данных были улучшены для значительного снижения конкуренции за глобальную блокировку, открывая лучшую параллельность. Ractor-ы теперь также разделяют меньше внутренних данных, что приводит к меньшей конкуренции за кэш CPU при параллельном запуске.
Ractor был впервые представлен в Ruby 3.0 как экспериментальная возможность. Мы стремимся снять с него статус «экспериментальный» в следующем году.
Изменения языка
-
*nilбольше не вызываетnil.to_a, подобно тому, как**nilне вызываетnil.to_hash. [Feature #21047] -
Логические бинарные операторы (
||,&&,andиor) в начале строки продолжают предыдущую строку, как fluent dot. Следующие примеры кода эквивалентны:if condition1 && condition2 ... endРаньше:
if condition1 && condition2 ... endif condition1 && condition2 ... end
Обновления основных классов
Примечание: Мы перечисляем только значимые обновления классов.
-
Array
Array#rfindбыл добавлен как более эффективная альтернативаarray.reverse_each.find[Feature #21678]Array#findбыл добавлен как более эффективное переопределениеEnumerable#find[Feature #21678]
-
Binding
-
Binding#local_variablesбольше не включает нумерованные параметры. ТакжеBinding#local_variable_get,Binding#local_variable_setиBinding#local_variable_defined?отказываются обрабатывать нумерованные параметры. [Bug #21049] -
Binding#implicit_parameters,Binding#implicit_parameter_getиBinding#implicit_parameter_defined?были добавлены для доступа к нумерованным параметрам и параметру “it”. [Bug #21049]
-
-
Enumerator
-
Enumerator.produceтеперь принимает опциональный именованный аргументsizeдля указания размера энумератора. Это может быть целое число,Float::INFINITY, вызываемый объект (например, лямбда) илиnilдля обозначения неизвестного размера. Если не указано, размер по умолчаниюFloat::INFINITY.# Infinite enumerator enum = Enumerator.produce(1, size: Float::INFINITY, &:succ) enum.size # => Float::INFINITY # Finite enumerator with known/computable size abs_dir = File.expand_path("./baz") # => "/foo/bar/baz" traverser = Enumerator.produce(abs_dir, size: -> { abs_dir.count("/") + 1 }) { raise StopIteration if it == "/" File.dirname(it) } traverser.size # => 4
-
-
ErrorHighlight
-
Когда вызывается ArgumentError, теперь отображаются фрагменты кода для вызова метода (caller) и определения метода (callee). [Feature #21543]
test.rb:1:in 'Object#add': wrong number of arguments (given 1, expected 2) (ArgumentError) caller: test.rb:3 | add(1) ^^^ callee: test.rb:1 | def add(x, y) = x + y ^^^ from test.rb:3:in '<main>'
-
-
Fiber
- Представлена поддержка аргумента
Fiber#raise(cause:)аналогичноKernel#raise. [Feature #21360]
- Представлена поддержка аргумента
-
Fiber::Scheduler
-
Представлен
Fiber::Scheduler#fiber_interruptдля прерывания файбера заданным исключением. Первоначальный сценарий использования — прерывание файбера, который ожидает блокирующей операции ввода-вывода, когда операция ввода-вывода закрывается. [Feature #21166] -
Представлен
Fiber::Scheduler#yield, чтобы позволить планировщику файберов продолжать обработку, когда исключения сигналов отключены. [Bug #21633] -
Вновь представлен хук
Fiber::Scheduler#io_closeдля асинхронногоIO#close. -
Вызов
Fiber::Scheduler#io_writeпри сбросе буфера записи IO. [Bug #21789]
-
-
File
File::Stat#birthtimeтеперь доступен в Linux через системный вызов statx, когда поддерживается ядром и файловой системой. [Feature #21205]
-
IO
-
IO.selectпринимаетFloat::INFINITYв качестве аргумента таймаута. [Feature #20610] -
Устаревшее поведение, создание процесса методами класса
IOс ведущим|, было удалено. [Feature #19630]
-
-
Kernel
-
Kernel#inspectтеперь проверяет наличие метода#instance_variables_to_inspect, позволяя контролировать, какие переменные экземпляра отображаются в строке#inspect: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 #=> #<DatabaseConfig:0x0000000104def350 @host="localhost", @user="root"> -
Устаревшее поведение, создание процесса с помощью
Kernel#openс ведущим|, было удалено. [Feature #19630]
-
-
Math
- Добавлены
Math.log1pиMath.expm1. [Feature #21527]
- Добавлены
-
Pathname
- Pathname был повышен с стандартного гема до основного класса Ruby. [Feature #17473]
-
Proc
Proc#parametersтеперь показывает анонимные опциональные параметры как[:opt]вместо[:opt, nil], делая вывод согласованным с тем, когда анонимный параметр является обязательным. [Bug #20974]
-
Ractor
-
Был добавлен класс
Ractor::Portдля нового механизма синхронизации для общения между Ractor-ами. [Feature #21262]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, 12Ractor::Portпредоставляет следующие методы:Ractor::Port#receiveRactor::Port#send(илиRactor::Port#<<)Ractor::Port#closeRactor::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для создания shareable Proc или lambda. [Feature #21550], [Feature #21557]
-
-
Range
-
Range#to_setтеперь выполняет проверки размера для предотвращения проблем с бесконечными диапазонами. [Bug #21654] -
Range#overlap?теперь корректно обрабатывает бесконечные (неограниченные) диапазоны. [Bug #21185] -
Поведение
Range#maxна целочисленных диапазонах без начала (beginless) было исправлено. [Bug #21174] [Bug #21175]
-
-
Ruby
- Был определен новый модуль верхнего уровня
Ruby, который содержит константы, связанные с Ruby. Этот модуль был зарезервирован в Ruby 3.4 и теперь официально определен. [Feature #20884]
- Был определен новый модуль верхнего уровня
-
Ruby::Box
- Новая (экспериментальная) возможность для обеспечения разделения определений. Подробнее о «Ruby Box» смотрите doc/language/box.md. [Feature #21311] [Misc #21385]
-
Set
-
Setтеперь основной класс, вместо автозагружаемого класса стандартной библиотеки. [Feature #21216] -
Set#inspectтеперь использует более простое отображение, подобно литеральным массивам. (например,Set[1, 2, 3]вместо#<Set: {1, 2, 3}>). [Feature #21389] -
Передача аргументов в
Set#to_setиEnumerable#to_setтеперь устарела. [Feature #21390]
-
-
Socket
Socket.tcpиTCPSocket.newпринимают именованный аргументopen_timeoutдля указания таймаута для начального соединения. [Feature #21347]- Когда в
TCPSocket.newпроисходил заданный пользователем таймаут, ранее могло вызываться либоErrno::ETIMEDOUT, либоIO::TimeoutErrorв зависимости от ситуации. Это поведение было унифицировано, так что теперь последовательно вызываетсяIO::TimeoutError. (Пожалуйста, обратите внимание, что вSocket.tcpвсе еще есть случаи, когдаErrno::ETIMEDOUTможет быть вызван в подобных ситуациях, и что в обоих случаяхErrno::ETIMEDOUTможет быть вызван, когда таймаут происходит на уровне ОС.)
-
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]
- Представлена поддержка аргумента
Обновления стандартной библиотеки (Stdlib)
Мы перечисляем только изменения stdlib, которые являются заметными изменениями функциональности.
Другие изменения перечислены в следующих разделах. Мы также перечислили историю релизов с предыдущей поставляемой версии, которой является Ruby 3.4.0, если у нее есть релизы на GitHub.
Следующие поставляемые (bundled) гемы повышены с дефолтных (default) гемов.
- ostruct 0.6.3
- pstore 0.2.0
- 0.1.4 to v0.2.0
- benchmark 0.5.0
- logger 1.7.0
- rdoc 7.0.2
- win32ole 1.9.2
- 1.9.1 to v1.9.2
- irb 1.16.0
- reline 0.6.3
- readline 0.0.4
- fiddle 1.1.8
Следующий дефолтный гем добавлен.
- win32-registry 0.1.2
Следующие дефолтные гемы обновлены.
- RubyGems 4.0.3
- bundler 4.0.3
- date 3.5.1
- delegate 0.6.1
- digest 3.2.1
- 3.2.0 to v3.2.1
- english 0.8.1
- 0.8.0 to v0.8.1
- erb 6.0.1
- error_highlight 0.7.1
- etc 1.4.6
- fcntl 1.3.0
- 1.2.0 to v1.3.0
- fileutils 1.8.0
- 1.7.3 to v1.8.0
- forwardable 1.4.0
- 1.3.3 to v1.4.0
- io-console 0.8.2
- 0.8.1 to v0.8.2
- io-nonblock 0.3.2
- io-wait 0.4.0
- 0.3.2 to v0.3.3, v0.3.5.test1, v0.3.5, v0.3.6, v0.4.0
- ipaddr 1.2.8
- json 2.18.0
- net-http 0.9.1
- openssl 4.0.0
- optparse 0.8.1
- pp 0.6.3
- 0.6.2 to v0.6.3
- prism 1.7.0
- psych 5.3.1
- resolv 0.7.0
- stringio 3.2.0
- strscan 3.1.6
- time 0.4.2
- 0.4.1 to v0.4.2
- timeout 0.6.0
- uri 1.1.1
- weakref 0.1.4
- 0.1.3 to v0.1.4
- zlib 3.2.2
- 3.2.1 to v3.2.2
Следующие поставляемые (bundled) гемы обновлены.
- minitest 6.0.0
- power_assert 3.0.1
- rake 13.3.1
- test-unit 3.7.5
- rexml 3.4.4
- rss 0.3.2
- 0.3.1 to 0.3.2
- net-ftp 0.3.9
- 0.3.8 to v0.3.9
- net-imap 0.6.2
- net-smtp 0.5.1
- 0.5.0 to v0.5.1
- matrix 0.4.3
- 0.4.2 to v0.4.3
- prime 0.1.4
- 0.1.3 to v0.1.4
- rbs 3.10.0
- 3.8.0 to v3.8.1, v3.9.0.dev.1, v3.9.0.pre.1, v3.9.0.pre.2, v3.9.0, v3.9.1, v3.9.2, v3.9.3, v3.9.4, v3.9.5, v3.10.0.pre.1, v3.10.0.pre.2, v3.10.0
- typeprof 0.31.1
- debug 1.11.1
- 1.11.0 to v1.11.1
- base64 0.3.0
- 0.2.0 to v0.3.0
- bigdecimal 4.0.1
- drb 2.2.3
- 2.2.1 to v2.2.3
- syslog 0.3.0
- 0.2.0 to v0.3.0
- csv 3.3.5
- repl_type_completor 0.1.12
RubyGems и Bundler
Ruby 4.0 включает RubyGems и Bundler версии 4. Смотрите следующие ссылки для подробностей.
- Upgrading to RubyGems/Bundler 4 - RubyGems Blog
- 4.0.0 Released - RubyGems Blog
- 4.0.1 Released - RubyGems Blog
- 4.0.2 Released - RubyGems Blog
- 4.0.3 Released - RubyGems Blog
Поддерживаемые платформы
-
Windows
- Прекращена поддержка версий MSVC старее 14.0 (_MSC_VER 1900). Это означает, что Visual Studio 2015 или новее теперь требуется.
Проблемы совместимости
-
Следующие методы были удалены из Ractor из-за добавления
Ractor::Port:Ractor.yieldRactor#takeRactor#close_incomingRactor#close_outgoing
-
ObjectSpace._id2refобъявлен устаревшим. [Feature #15408] -
Process::Status#&иProcess::Status#>>были удалены. Они были объявлены устаревшими в Ruby 3.3. [Bug #19868] -
rb_path_checkбыл удален. Эта функция использовалась для проверки пути$SAFE, которая была удалена в Ruby 2.7, и уже была устаревшей. [Feature #20971] -
Трассировка стека для
ArgumentErrorо “неправильном количестве аргументов” теперь включает имя класса или модуля получателя (например, вFoo#barвместо вbar). [Bug #21698] -
Трассировки стека больше не отображают
internalфреймы. Эти методы теперь отображаются так, как будто они находятся в исходном файле Ruby, согласованно с другими методами, реализованными на C. [Bug #20968]Раньше:
ruby -e '[1].fetch_values(42)' <internal:array>:211:in 'Array#fetch': index 42 outside of array bounds: -1...1 (IndexError) from <internal:array>:211:in 'block in Array#fetch_values' from <internal:array>:211:in 'Array#map!' from <internal:array>:211:in 'Array#fetch_values' from -e:1:in '<main>'После:
$ ruby -e '[1].fetch_values(42)' -e:1:in 'Array#fetch_values': index 42 outside of array bounds: -1...1 (IndexError) from -e:1:in '<main>'
Проблемы совместимости стандартной библиотеки (Stdlib)
-
Библиотека CGI удалена из дефолтных гемов. Теперь мы предоставляем только
cgi/escapeдля следующих методов:CGI.escapeиCGI.unescapeCGI.escapeHTMLиCGI.unescapeHTMLCGI.escapeURIComponentиCGI.unescapeURIComponentCGI.escapeElementиCGI.unescapeElement
-
С переносом
Setиз stdlib в основной класс,set/sorted_set.rbбыл удален, иSortedSetбольше не является автозагружаемой константой. Пожалуйста, установите гемsorted_setиrequire 'sorted_set', чтобы использоватьSortedSet. [Feature #21287] -
Net::HTTP
- Поведение по умолчанию автоматической установки заголовка
Content-Typeвapplication/x-www-form-urlencodedдля запросов с телом (например,POST,PUT), когда заголовок не был явно установлен, было удалено. Если ваше приложение полагалось на это автоматическое поведение по умолчанию, ваши запросы теперь будут отправляться без заголовка Content-Type, что потенциально нарушает совместимость с некоторыми серверами. [GH-net-http #205]
- Поведение по умолчанию автоматической установки заголовка
Обновления C API
-
IO
rb_thread_fd_closeустарел и теперь является no-op (ничего не делает). Если вам нужно открыть файловые дескрипторы из расширений C для кода Ruby, создайте экземплярIO, используяRUBY_IO_MODE_EXTERNAL, и используйтеrb_io_close(io)для его закрытия (это также прерывает и ожидает все ожидающие операции на экземпляреIO). Прямое закрытие файловых дескрипторов не прерывает ожидающие операции и может привести к неопределенному поведению. Другими словами, если два объектаIOразделяют один и тот же файловый дескриптор, закрытие одного не влияет на другой. [Feature #18455]
-
GVL
rb_thread_call_with_gvlтеперь работает с или без GVL. Это позволяет гемам избегать проверкиruby_thread_has_gvl_p. Пожалуйста, по-прежнему будьте внимательны с GVL. [Feature #20750]
-
Set
-
C API для
Setбыл добавлен. Следующие методы поддерживаются: [Feature #21459]rb_set_foreachrb_set_newrb_set_new_caparb_set_lookuprb_set_addrb_set_clearrb_set_deleterb_set_size
-
Улучшения реализации
Class#new(напр.Object.new) быстрее во всех случаях, но особенно при передаче именованных аргументов. Это также было интегрировано в YJIT и ZJIT. [Feature #21254]- Кучи GC разных размеров (pools) теперь растут независимо, уменьшая использование памяти, когда только некоторые пулы содержат долгоживущие объекты
- GC sweeping (очистка) быстрее на страницах больших объектов
- Объекты “Generic ivar” (String, Array,
TypedDataи т.д.) теперь используют новый внутренний объект “fields” для более быстрого доступа к переменным экземпляра - GC избегает поддержки внутренней таблицы
id2refдо тех пор, пока она не будет впервые использована, делая выделениеobject_idи очистку GC быстрее object_idиhashбыстрее на объектах Class и Module- Большие bignum целые числа могут оставаться встроенными (embedded), используя allocation переменной ширины
Random,Enumerator::Product,Enumerator::Chain,Addrinfo,StringScannerи некоторые внутренние объекты теперь защищены write-barrier, что уменьшает накладные расходы GC.
Ractor
Много работы было проделано, чтобы сделать Ractor-ы более стабильными, производительными и пригодными к использованию. Эти улучшения приближают реализацию Ractor к выходу из статуса экспериментальной.
- Улучшения производительности
- Замороженные строки и таблица символов внутренне используют hash set без блокировок [Feature #21268]
- Поиски в кэше методов избегают блокировок в большинстве случаев
- Доступ к переменным экземпляра класса (и generic ivar) быстрее и избегает блокировок
- Конкуренция за кэш CPU избегается при выделении объектов за счет использования счетчика на каждый ractor
- Конкуренция за кэш CPU избегается в xmalloc/xfree за счет использования локального для потока счетчика
object_idизбегает блокировок в большинстве случаев
- Исправления ошибок и стабильность
- Исправлены возможные взаимные блокировки (deadlocks) при объединении Ractor-ов и потоков (Threads)
- Исправлены проблемы с require и autoload в Ractor
- Исправлены проблемы кодирования/перекодирования между Ractor-ами
- Исправлены состояния гонки (race conditions) в операциях GC и инвалидации методов
- Исправлены проблемы с форкингом процессов после запуска Ractor
- Подсчеты выделения GC теперь точны под Ractor-ами
- Исправлено: TracePoints не работали после GC [Bug #19112]
JIT
- ZJIT
- Представлен экспериментальный JIT компилятор на основе методов.
Где доступно, ZJIT может быть включен во время выполнения с опцией
--zjitили вызовомRubyVM::ZJIT.enable. При сборке Ruby требуется Rust 1.85.0 или новее для включения поддержки ZJIT. - По состоянию на Ruby 4.0.0, ZJIT быстрее интерпретатора, но пока не так быстр, как YJIT. Мы поощряем эксперименты с ZJIT, но советуем воздержаться от развертывания его в продакшене на данный момент.
- Наша цель — сделать ZJIT быстрее YJIT и готовым к продакшену в Ruby 4.1.
- Представлен экспериментальный JIT компилятор на основе методов.
Где доступно, ZJIT может быть включен во время выполнения с опцией
- YJIT
RubyVM::YJIT.runtime_statsratio_in_yjitбольше не работает в сборке по умолчанию. Используйте--enable-yjit=statsприconfigure, чтобы включить его в--yjit-stats.- Добавлен
invalidate_everythingв статистику по умолчанию, который увеличивается, когда весь код инвалидируется TracePoint-ом.
- Добавлены опции
mem_size:иcall_threshold:вRubyVM::YJIT.enable.
- RJIT
--rjitудален. Мы перенесем реализацию стороннего JIT API в репозиторий ruby/rjit.
Смотрите NEWS или логи коммитов для подробностей.
С этими изменениями, 3889 файлов изменено, 230769 вставок(+), 297003 удалений(-) с момента выхода Ruby 3.4.0!
Счастливого Рождества, С Новым Годом, и приятного кодинга с Ruby 4.0!
Скачать
-
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.tar.gz
SIZE: 23955109 SHA1: 754e39e9ad122e1b6deaed860350bac133a35ed3 SHA256: 2e8389c8c072cb658c93a1372732d9eac84082c88b065750db1e52a5ac630271 SHA512: 688254e939b197d564e896fb951bc1abf07142f489e91c5ed0b11f68f52d6adb6b1f86616fe03f1f0bb434beeef7e75e158b9c616afb39bb34403b0b78d2ee19 -
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.tar.xz
SIZE: 18008368 SHA1: 05ec670e86f84325c5353ef2f2888e53b6adc602 SHA256: a72bacee9de07283ebc19baa4ac243b193129f21aa4e168c7186fb1fe7d07fe1 SHA512: 2d5b2e566eaf70a5f3ea6ce6afc0611c0415de58a41336ef7a0b855c9a91eda9aa790a5f8b48e40a1eb9d50f8ea0f687216e617f16c8d040a08474f3116518a4 -
https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0.zip
SIZE: 29253204 SHA1: 0b69f89d1d140157251c0d3a6032f6c45cdf81e8 SHA256: 70cb1bf89279b86ab9a975d504607c051fc05ee03e311d550a5541b65e373455 SHA512: a72e076ef618c0aeb9d20cf22e6fb12fda36809c0064ef0f98153b95a0bac257ef606342444a38f992c4594bf376a4d264686cf597463aa6f111220798784302
Что такое Ruby
Ruby был впервые разработан Matz (Yukihiro Matsumoto) в 1993 году, и сейчас разрабатывается как Open Source. Он работает на множестве платформ и используется по всему миру, особенно для веб-разработки.
Последние новости
Вышел Ruby 3.2.10
Вышел Ruby 3.2.10.
Опубликовал hsbt 14-01-2026
Вышел Ruby 4.0.1
Вышел Ruby 4.0.1.
Опубликовал k0kubun 13-01-2026
Новый облик документации Ruby
Вслед за редизайном ruby-lang.org, у нас есть еще новости в честь 30-летия Ruby: docs.ruby-lang.org получил полностью новый облик с Aliki — новым стандартным шаблоном RDoc....
Опубликовал Stan Lo 23-12-2025
Редизайн айдентики нашего сайта
Мы рады сообщить о масштабном редизайне нашего сайта. Дизайн для этого обновления был создан Taeko Akatsuka.
Опубликовал Hiroshi SHIBATA 22-12-2025