Они не абсолютно идентичны. Например, первый пример будет вызывать String#%
, поэтому, если этот метод переопределен по какой-то странной причине, вы можете получить другой результат. При стандартном определении String#%
вычисленные строки будут одинаковыми, поэтому оба выражения будут иметь одинаковый результат.
Кстати, в этом примере to_s
не требуется, и предполагается, что send
не было переопределено (и, следовательно, эквивалентно __send__
):
values.map{ |k,v| send("#{k}=", v) }