Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

Write specs for new Ruby 3.4 features and changes

未关闭
#1,265 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
5/5
预计耗时
一周以上
新手友好度
35/100
Issue 类型
功能
描述清晰度
基本清楚
活跃度
停滞
技术栈
ruby
领域
testing

调研方向

首先查看 ruby/spec 中现有的 Ruby 3.4 spec,同时参考 Ruby 3.4 NEWS 和 Ruby Changes。识别一项尚未覆盖的功能或变更,在 ruby_version_is "3.4" guard 内添加 spec,并确认相关 spec 成功运行。

由索引模型根据 Issue 内容生成。

描述

Hacktoberfest help wanted

ruby/spec already contains some specs for 3.4, but we should aim to cover all new features and important changes.
This will improve the test coverage of these features (and maybe discover a few bugs along the way), allow other Ruby implementations to implement the changes faster with more confidence and document clearly the new behavior.

The new specs should be within a version guard block:

ruby_version_is "3.4" do
  # New specs
end

NOTE: https://rubyreferences.github.io/rubychanges/3.4.html gives more details for many features and changes.

Notes:

  • Ractor & RubyVM related changes are removed since they are CRuby-specific.

From https://github.com/ruby/ruby/blob/master/doc/NEWS/NEWS-3.4.0.md:

NEWS for Ruby 3.4.0

This document is a list of user-visible feature changes
since the 3.3.0 release, except for bug fixes.

Note that each entry is kept to a minimum, see links for details.

Language changes

  • it is added to reference a block parameter. [Feature #18980]

  • String literals in files without a frozen_string_literal comment now emit a deprecation warning
    when they are mutated.
    These warnings can be enabled with -W:deprecated or by setting Warning[:deprecated] = true.
    To disable this change, you can run Ruby with the --disable-frozen-string-literal
    command line argument. [Feature #20205]

    • String#+@ now duplicates when mutating the string would emit
      a deprecation warning, offered as a replacement for the
      str.dup if str.frozen? pattern.
  • Keyword splatting nil when calling methods is now supported.
    **nil is treated similarly to **{}, passing no keywords,
    and not calling any conversion methods. [Bug #20064]

  • Block passing is no longer allowed in index assignment
    (e.g. a[0, &b] = 1). [Bug #19918]

  • Keyword arguments are no longer allowed in index assignment
    (e.g. a[0, kw: 1] = 2). [Bug #20218]

  • The toplevel name ::Ruby is reserved now, and the definition will be warned
    when Warning[:deprecated]. [Feature #20884]

Core classes updates

Note: We're only listing outstanding class updates.

Array

Exception

  • Exception#set_backtrace now accepts arrays of Thread::Backtrace::Location.
    Kernel#raise, Thread#raise and Fiber#raise also accept this new format. [Feature #13557]

Fiber::Scheduler

  • An optional Fiber::Scheduler#blocking_operation_wait hook allows blocking operations to be moved out of the
    event loop in order to reduce latency and improve multi-core processor utilization. [Feature #20876]

GC

  • GC.config added to allow setting configuration variables on the Garbage
    Collector. [Feature #20443]

  • GC configuration parameter rgengc_allow_full_mark introduced. When false
    GC will only mark young objects. Default is true. [Feature #20443]

Hash

  • Hash.new now accepts an optional capacity: argument, to preallocate the hash with a given capacity.
    This can improve performance when building large hashes incrementally by saving on reallocation and
    rehashing of keys. [Feature #19236]

IO::Buffer

  • IO::Buffer#copy can release the GVL, allowing other threads to run while copying data. [Feature #20902]

Integer

  • Integer#** used to return Float::INFINITY when the return value is large, but now returns an Integer.
    If the return value is extremely large, it raises an exception.
    [Feature #20811]

MatchData

  • MatchData#bytebegin and MatchData#byteend have been added. [Feature #20576]

Object

  • Object#singleton_method now returns methods in modules prepended to or included in the
    receiver's singleton class. [Bug #20620]

      ```rb
      o = Object.new
      o.extend(Module.new{def a = 1})
      o.singleton_method(:a).call #=> 1
      ```
    

Range

  • Range#size now raises TypeError if the range is not iterable. [Misc #18984]

  • Range#step now consistently has a semantics of iterating by using + operator
    for all types, not only numerics. [Feature #18368]

      ```ruby
      (Time.utc(2022, 2, 24)..).step(24*60*60).take(3)
      #=> [2022-02-24 00:00:00 UTC, 2022-02-25 00:00:00 UTC, 2022-02-26 00:00:00 UTC]
      ```
    

Rational

  • Rational#** used to return Float::INFINITY or Float::NAN
    when the numerator of the return value is large, but now returns an Rational.
    If it is extremely large, it raises an exception. [Feature #20811]

String

  • String#append_as_bytes was added to more easily and efficiently work with binary buffers and protocols.
    It directly concatenate the arguments into the string without any encoding validation or conversion.
    [Feature #20594]

Symbol

  • The string returned by Symbol#to_s now emits a deprecation warning when mutated, and will be
    frozen in a future version of Ruby.
    These warnings can be enabled with -W:deprecated or by setting Warning[:deprecated] = true.
    [Feature #20350]

Time

  • On Windows, now Time#zone encodes the system timezone name in UTF-8
    instead of the active code page, if it contains non-ASCII characters.
    [Bug #20929]

  • Time#xmlschema, and its Time#iso8601 alias have been moved into the core Time
    class while previously it was an extension provided by the time gem. [Feature #20707]

Warning

  • Add Warning.categories method which returns a list of possible warning categories.
    [Feature #20293]

Stdlib updates

We only list stdlib changes that are notable feature changes.

RubyGems

  • Add --attestation option to gem push. It enabled to store signature of build artifact to sigstore.dev.

Bundler

  • Add a lockfile_checksums configuration to include checksums in fresh lockfiles.
  • Add bundle lock --add-checksums to add checksums to an existing lockfile.

JSON

  • Performance improvements JSON.parse about 1.5 times faster than json-2.7.x.

Tempfile

  • The keyword argument anonymous: true is implemented for Tempfile.create.
    Tempfile.create(anonymous: true) removes the created temporary file immediately.
    So applications don't need to remove the file.
    [Feature #20497]

win32/sspi.rb

Socket

  • Socket::ResolutionError and Socket::ResolutionError#error_code was added.
    [Feature #20018]

IRB

  • Interactive method completion is now improved with type information by default.
    [Feature #20778]

Compatibility issues

  • Error messages and backtrace displays have been changed.

    • Use a single quote instead of a backtick as an opening quote. [Feature #16495]

    • Display a class name before a method name (only when the class has a permanent name). [Feature #19117]

    • Extra rescue/ensure frames are no longer available on the backtrace. [Feature #20275]

    • Kernel#caller, Thread::Backtrace::Location’s methods, etc. are also changed accordingly.

      Old:

      test.rb:1:in `foo': undefined method `time' for an instance of Integer
              from test.rb:2:in `<main>'
      

      New:

      test.rb:1:in 'Object#foo': undefined method 'time' for an instance of Integer
              from test.rb:2:in '<main>'
      
  • Hash#inspect rendering have been changed. [Bug #20433]

    • Symbol keys are displayed using the modern symbol key syntax: "{user: 1}"
    • Other keys now have spaces around =>: '{"user" => 1}', while previously they didn't: '{"user"=>1}'
  • Kernel#Float() now accepts a decimal string with decimal part omitted. [Feature #20705]

    Float("1.")    #=> 1.0 (previously, an ArgumentError was raised)
    Float("1.E-1") #=> 0.1 (previously, an ArgumentError was raised)
    
  • String#to_f now accepts a decimal string with decimal part omitted. [Feature #20705]
    Note that the result changes when an exponent is specified.

    "1.".to_f    #=> 1.0
    "1.E-1".to_f #=> 0.1 (previously, 1.0 was returned)
    
  • Refinement#refined_class has been removed. [Feature #19714]

Stdlib compatibility issues

DidYouMean

  • DidYouMean::SPELL_CHECKERS[]= and DidYouMean::SPELL_CHECKERS.merge! are removed.

Net::HTTP

  • Removed the following deprecated constants:
    * Net::HTTP::ProxyMod
    * Net::NetPrivate::HTTPRequest
    * Net::HTTPInformationCode
    * Net::HTTPSuccessCode
    * Net::HTTPRedirectionCode
    * Net::HTTPRetriableCode
    * Net::HTTPClientErrorCode
    * Net::HTTPFatalErrorCode
    * Net::HTTPServerErrorCode
    * Net::HTTPResponseReceiver
    * Net::HTTPResponceReceiver

    These constants were deprecated from 2012.
    

Timeout

  • Reject negative values for Timeout.timeout. [Bug #20795]

URI

  • Switched default parser to RFC 3986 compliant from RFC 2396 compliant.
    [Bug #19266]

C API updates

  • rb_newobj and rb_newobj_of (and corresponding macros RB_NEWOBJ, RB_NEWOBJ_OF, NEWOBJ, NEWOBJ_OF) have been removed. [Feature #20265]
  • Removed deprecated function rb_gc_force_recycle. [Feature #18290]

Implementation improvements

  • Happy Eyeballs version 2 (RFC8305), an algorithm that ensures faster and more reliable connections
    by attempting IPv6 and IPv4 concurrently, is used in Socket.tcp and TCPSocket.new.
    To disable it globally, set the environment variable RUBY_TCP_NO_FAST_FALLBACK=1 or
    call Socket.tcp_fast_fallback=false.
    Or to disable it on a per-method basis, use the keyword argument fast_fallback: false.
    [Feature #20108] [Feature #20782]

Miscellaneous changes

  • Passing a block to a method which doesn't use the passed block will show
    a warning on verbose mode (-w).
    In connection with this, a new strict_unused_block warning category was introduced.
    Turn them on with -W:strict_unused_block or Warning[:strict_unused_block] = true.
    [Feature #15554]

  • Redefining some core methods that are specially optimized by the interpreter
    and JIT like String#freeze or Integer#+ now emits a performance class
    warning (-W:performance or Warning[:performance] = true).
    [Feature #20429]

主要语言
Ruby
星标
622
派生
402
平均合并
14 小时 51 分钟
30 天内合并 PR
6

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

ruby/spec 的其他 Issue

查看 ruby/spec 的全部 Issue

相似的 Issue

更多 Ruby Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。