Project

General

Profile

Actions

Bug #21256

open

`it` value is wrapped in an array when that doesn't happen with numbered parameter

Added by Earlopain (Earlopain _) 6 days ago. Updated about 23 hours ago.

Status:
Assigned
Assignee:
Target version:
-
ruby -v:
ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [x86_64-linux]
[ruby-core:121592]

Description

I have the following script:

require "bundler/inline"

gemfile do
  source "https://rubygems.org"

  gem "rspec-core", "3.13.3"
  gem "rspec-expectations", "3.13.3"
end

require "rspec/autorun"
require "rspec/expectations"

RSpec::Matchers.define :example do
  chain(:foo) { pp _1 }
  chain(:bar) { pp it }
end

RSpec.describe "demo" do
  it do
    example.foo(1)
    example.bar(2)
  end
end

It calls two methods were the only difference is that one accesses the argument with _1, the other with it. It prints the following:

1
[2]

So, it for some reason wraps it in an array. I appologise for the reproduction script, it uses rspec and the amount of metaprogramming it uses makes it impossible for me to reduce this further.

When running with parser=parse.y, the expected output is returned (just 2, no array). I also tested against current ruby-dev and it also happens there.

Updated by mame (Yusuke Endoh) 6 days ago

  • Status changed from Open to Assigned
  • Assignee set to prism

Here is a repro without rspec.

class C
  define_method(:foo) do
    p it
  end
end

class D < C
  def foo(*args)
    super(*args)
  end
end

D.new.foo(1)
$ ./local/bin/ruby --parser=parse.y t.rb
1

$ ./local/bin/ruby --parser=prism t.rb
[1]

Updated by Earlopain (Earlopain _) about 23 hours ago

Thanks for that info, it allowed me to make a potential fix: https://github.com/ruby/ruby/pull/13108

Actions

Also available in: Atom PDF

Like1
Like2Like0