Если это возможно в вашем случае использования, я бы не добавил символ замены в качестве параметра, а затем использовал бы стандартный механизм форматирования строки ruby для форматирования строки. Это дает вам намного лучший контроль над переменными, которые вы хотите заменить внутри строки.
def x(string, values, rep='%s')
if rep != '%s'
string.gsub!(rep, '%s')
end
string % values
end
a = %w[hello do 12]
puts x("? world what ? you say ?", a, '?')
puts x("%s world what %s you say %3.2f", a)
puts x("%s world what %s you say %3.2f", a, '%s')
И вывод из этого выглядит следующим образом
hello world what do you say 12
hello world what do you say 12.00
hello world what do you say 12.00
Вы должны быть осторожны с этим, так как слишком мало аргументов вызовут исключения, поэтому вы можете захотеть перехватывать исключения и вести себя соответствующим образом. Не зная вашего варианта использования, трудно сказать, подходит ли это или нет.