[#54738] [ruby-trunk - Bug #8358][Open] TestSprintf#test_float test failuer on mingw32 — "phasis68 (Heesob Park)" <phasis@...>

36 messages 2013/05/02

[#54749] [ruby-trunk - Feature #8361][Open] Alternative syntax for block parameter — "alexeymuranov (Alexey Muranov)" <redmine@...>

12 messages 2013/05/02

[#54798] [ruby-trunk - Bug #8370][Open] Constants MAX_MULTIPART_LENGTH in cgi\core.rb — "xibbar (Takeyuki FUJIOKA)" <xibbar@...>

17 messages 2013/05/05

[#54850] [ruby-trunk - Feature #8377][Open] Deprecate :: for method calls in 2.1 — "charliesome (Charlie Somerville)" <charliesome@...>

27 messages 2013/05/07

[#54881] [ruby-trunk - Bug #8384][Open] Cannot build ruby against OpenSSL build with "no-ec2m" — "vo.x (Vit Ondruch)" <v.ondruch@...>

16 messages 2013/05/09

[#54921] [ruby-trunk - Bug #8393][Open] A class who's parent class is in a module can go wrong if files are required in the wrong order — "eLobato (Daniel Lobato Garcia)" <elobatocs@...>

15 messages 2013/05/12

[#54939] [ruby-trunk - Bug #8399][Open] Remove usage of RARRAY_PTR in C extensions when not needed — "dbussink (Dirkjan Bussink)" <d.bussink@...>

32 messages 2013/05/12

[#55053] [ruby-trunk - Feature #8426][Open] Implement class hierarchy method caching — "charliesome (Charlie Somerville)" <charliesome@...>

21 messages 2013/05/19

[#55096] [ruby-trunk - Feature #8430][Open] Rational number literal — "mrkn (Kenta Murata)" <muraken@...>

28 messages 2013/05/21

[#55197] [ruby-trunk - Feature #8461][Open] Easy way to disable certificate checking in XMLRPC::Client — "herwinw (Herwin Weststrate)" <herwin@...>

11 messages 2013/05/29

[ruby-core:55207] [Backport 200 - Backport #8040] Unexpect behavior when using keyword arguments

From: "nagachika (Tomoyuki Chikanaga)" <nagachika00@...>
Date: 2013-05-30 13:37:53 UTC
List: ruby-core #55207
Issue #8040 has been updated by nagachika (Tomoyuki Chikanaga).

Priority changed from Normal to High

I also think new behavior is better than former behavior.
I'll backport it till next release.
----------------------------------------
Backport #8040: Unexpect behavior when using keyword arguments
https://bugs.ruby-lang.org/issues/8040#change-39569

Author: pabloh (Pablo Herrero)
Status: Assigned
Priority: High
Assignee: nagachika (Tomoyuki Chikanaga)
Category: 
Target version: 


=begin
There is an odd behavior when calling methods with the new keyword arguments syntax, when you have a method defined with mandatory arguments that also takes options, like this:

  def foo value, **keywords
    puts [value,keywords].inspect
  end
  
  foo("somthing") #This works
  foo("somthing", key: 'value') #This also works
  
  foo(Hash.new(something: 'else')) #This raises 'ArgumentError: wrong number of arguments (0 for 1)'

This feels weird regardless the fact that keyword arguments are a Hash at the bottom, since you ARE PASSING an argument.

Other side effect from this, is that when you call the method ((|foo|)) with a single argument, you can't anticipate how many argument you will be actually passing at runtime unless you know beforehand the argument's class.

What's maybe even more concerning is the fact than this happens even when you pass an argument which class derives from Hash:

  class MyDirectory < Hash; end
   
  foo(MyDirectory.new(something: 'else')) #This also raises 'ArgumentError: wrong number of arguments (0 for 1)'


Besides finding this behavior surprising, I think this could also possibly lead to old code been unexpectedly broken when updating old methods that takes options to the new syntax.

For example if you have this code:

  def foo_with_options argument, options = {}
    #Do some stuff with options
  end
  
  
  #And at someplace else...
  
  my_hash_thingy = Hash.new
  foo_with_options(my_hash_thingy) #Only passing mandatory argument, with no options, works fine.


When updating to the new syntax:

  def foo_with_options argument, an_option: 'value1', another_option: 'value2'
    #Do some stuff with options
  end
  
  
  
  #And at someplace else...
  
  my_hash_thingy = Hash.new
  foo_with_options(my_hash_thingy) #Only passing mandatory argument, with no options, doesn't work anymore.
=end


-- 
http://bugs.ruby-lang.org/

In This Thread

Prev Next