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: []