2013-07-31 3 views
0

Я пытаюсь напечатать рубиновый хэш:Противоречивые печать с Рубином

opts = { 
    'one' => '1', 
    'two' => '1', 
    'three' => '0' 
} 

Я хочу выход быть

one=1 
two=1 
three=0 

Это прекрасно работает с этим кодом на одной машине, которая работает рубин 1.8. 7

print opts.map{|k,v| k + '=' + v + "\n"}.to_s 

Но на другой машине, которая работает рубин 1.9, он печатает

["one=1\n", "two=1\n", "three=0\n"] 

Что происходит не так?

ответ

5

Попробуйте

print opts.map{|k,v| k + '=' + v + "\n"}.join 

Объяснение легко: С рубина 1.9 Array.to_s changed его поведение.

Альтернатива:

puts opts.map{|k,v| k + '=' + v }.join("\n") 

или

puts opts.map{|k,v| "#{k}=#{v}" }.join("\n") 

я предпочел бы:

opts.each{|k,v| puts "#{k}=#{v}" } 

И еще один вариант, но с другой взгляд:

opts.each{|k,v| puts "%-10s= %s" % [k,v]} 

Результат:

one  = 1 
two  = 1 
three  = 0 

(Но ключи должны быть не длиннее, чем длина в %-10s.)

+0

Хороший и подробный ответ! – alfasin

+0

Спасибо, я закончил использовать вторую альтернативу. –

1

Try:

res = "" 
opts.map{|k,v| res += k + '=' + v + "\n"} 
puts res 
+0

Это отлично работает. Благодаря! –

+0

Это действительно избыточно, чтобы создать локальную переменную только для печати содержимого Хэша. –

+0

@DavidUnric right, в стеке есть пустая трата двух байтов ...;) – alfasin

4

Это работает, как ожидалось. Дайте это попробовать:

a={:one=>1, :two=>2, :three=>3} 
a.each {|k,v| puts "#{k}=>#{v}" } 
+0

Вы забыли 'newline' :) – alfasin

+0

@alfasin nope, hi did not;) –

+0

Вы получили +1 от меня тогда :))) – alfasin