From: akr@... Date: 2014-05-06T13:05:49+00:00 Subject: [ruby-core:62417] [ruby-trunk - Bug #5328] [Rejected] Splat args are treated wrongly in instance_exec and class_exec 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/