3

I stumbled upon what I believe to be a weird bug in Ruby (I'm using 2.2.2).

When I define a method like so:

def test(value, **kw)
  puts value
  puts kw
end

I get the expected output:

> test(1)
1
{}
=> nil

> test(1, channel: 'active')
1
{:channel=>"active"}
=> nil

> test(1, channel_s: 'active')
1
{:channel_s=>"active"}
=> nil

> test(1, channel_st: 'active')
1
{:channel_st=>"active"}
=> nil

> test(1, channel_sta: 'active')
1
{:channel_sta=>"active"}
=> nil

> test(1, channel_stat: 'active')
1
{:channel_stat=>"active"}
=> nil

> test(1, channel_state: 'active')
1
{:channel_state=>"active"}
=> nil

But when I define an equivalent method with define_singleton_method:

define_singleton_method(:test_2) do |value, **kw|
  puts value
  puts kw
end

I get a very peculiar result when a keyword is exactly 'channel_type':

> test_2(1)
1
{}
=> nil

> test_2(1, channel_state: 'active')

{:channel_state=>"active"}
=> nil

> test_2(1, channel_stat: 'active')
1
{:channel_stat=>"active"}
=> nil

> test_2(1, channel_states: 'active')
1
{:channel_states=>"active"}
=> nil

> test_2(1, channel_state: nil)

{:channel_state=>nil}
=> nil

Has anyone seen this before? Maybe with a different keyword?

Edit: This appears to only be affecting my ruby on rails application being run within a docker container. If someone can reproduce, please comment below!

Kevin Choubacha
  • 368
  • 3
  • 10

0 Answers0