[ruby-core:62417] [ruby-trunk - Bug #5328] [Rejected] Splat args are treated wrongly in instance_exec and class_exec

From: akr@...
Date: 2014-05-06 13:05:49 UTC
List: ruby-core #62417
Issue #5328 has been updated by Akira Tanaka.

Status changed from Assigned to Rejected

Ruby 1.9 changes block arguments behavior.
Non-lambda block arguments always expands single array.
(Ruby 1.8 expands sometimes.)

If you needs block arguments behaving as methods, use lambda.

```
% cat splat_args
def foo(arg_1, *arg_2)
  puts "Arguments received by method:"
  puts "arg_1: #{arg_1.inspect}"
  puts "arg_2: #{arg_2.inspect}"
end
foo([1, 2, 3])

puts

Class.class_exec([1, 2, 3]) do |arg_1, *arg_2|
  puts "Arguments received by class_exec:"
  puts "arg_1: #{arg_1.inspect}"
  puts "arg_2: #{arg_2.inspect}"
end

puts

instance_exec([1, 2, 3]) do |arg_1, *arg_2|
  puts "Arguments received by instance_exec:"
  puts "arg_1: #{arg_1.inspect}"
  puts "arg_2: #{arg_2.inspect}"
end

puts

Class.class_exec([1, 2, 3], &lambda do |arg_1, *arg_2|
  puts "Arguments received by class_exec(lambda):"
  puts "arg_1: #{arg_1.inspect}"
  puts "arg_2: #{arg_2.inspect}"
end)

puts

instance_exec([1, 2, 3], &lambda do |arg_1, *arg_2|
  puts "Arguments received by instance_exec(lambda):"
  puts "arg_1: #{arg_1.inspect}"
  puts "arg_2: #{arg_2.inspect}"
end)

% ruby-1.9.1p0 splat_args
Arguments received by method:
arg_1: [1, 2, 3]
arg_2: []

Arguments received by class_exec:
arg_1: 1
arg_2: [2, 3]

Arguments received by instance_exec:
arg_1: 1
arg_2: [2, 3]

Arguments received by class_exec(lambda):
arg_1: [1, 2, 3]
arg_2: []

Arguments received by instance_exec(lambda):
arg_1: [1, 2, 3]
arg_2: []
```


----------------------------------------
Bug #5328: Splat args are treated wrongly in instance_exec and class_exec
https://bugs.ruby-lang.org/issues/5328#change-46567

* Author: Myron Marston
* Status: Rejected
* Priority: Normal
* Assignee: Akira Tanaka
* Category: 
* Target version: 
* ruby -v: ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin10.8.0]
* Backport: 
----------------------------------------
This gist demonstrates the issue:

https://gist.github.com/1218664

On 1.8.7, instance_exec and class_exec treat splat block args the same as method splat args.  On 1.9, it is treated differently and this is very unexpected.



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

In This Thread