Будущие версии Ruby (1.9 и более поздние версии, выпуск Ruby 1.9 запланирован на конец января 2009 г.) могут это сделать.
Однако не всегда очевидно, какое значение связано с каким параметром.
Ruby 1.9 принимает:
0 или более обязательных аргументов, за которыми следуют 0 или более необязательных аргументов, за которыми следуют 0 или более обязательных аргументов, за которыми следуют остальные аргументы, за которыми следуют 0 или более обязательных аргументов.
Пример:
def meth mand1, opt1 = :def1, o2 = :d2, *args, m2, m3
puts %w[mand1 opt1 o2 m2 args m3].inject('') { |s, arg|
s << "#{arg} = #{(eval arg).inspect}, "
}.gsub /, $/, ''
end
meth :arg1, :a2, :a3
# => mand1 = :arg1, opt1 = :def1, o2 = :d2, m2 = :a2, args = [], m3 = :a3
meth :arg1, :a2, :a3, :a4
# => mand1 = :arg1, opt1 = :a2, o2 = :d2, m2 = :a3, args = [], m3 = :a4
meth :arg1, :a2, :a3, :a4, :a5
# => mand1 = :arg1, opt1 = :a2, o2 = :a3, m2 = :a4, args = [], m3 = :a5
meth :arg1, :a2, :a3, :a4, :a5, :a6
# => mand1 = :arg1, opt1 = :a2, o2 = :a3, m2 = :a5, args = [:a4], m3 = :a6
meth :arg1, :a2, :a3, :a4, :a5, :a6, :a7
# => mand1 = :arg1, opt1 = :a2, o2 = :a3, m2 = :a6, args = [:a4, :a5], m3 = :a7
Как видите, обязательные аргументы связаны в первую очередь как слева, так и справа. Затем необязательные аргументы связываются, и если какие-либо аргументы остаются, они объединяются в массив и связываются с остальным аргументом.