1

我正在使用红宝石。我需要抓取每个键/值并将其放入一个字符串中。

到目前为止,我有:

values = ['first' => '1', 'second' => '2']
  @thelink = values.collect do | key, value |
  "#{key}=#{value}&"
  end

当我打印时,@thelink我看到:

first1second2=&

但我真正想要的是

first=1&second=2

有人可以帮忙/解释一下吗?

4

2 回答 2

2

你在这里缺少一些微妙的东西{}vs []

请参阅 IRB 测试中的以下内容:

irb(main):002:0> {'first' => 1, 'second' => 2}
=> {"second"=>2, "first"=>1}

irb(main):003:0>  ['first' => 1, 'second' => 2]
=> [{"second"=>2, "first"=>1}]

irb(main):004:0> {'first' => 1, 'second' => 2}.class
=> Hash

irb(main):005:0>  ['first' => 1, 'second' => 2].class
=> Array

与此类似:

irb(main):006:0> {'first' => 1, 'second' => 2}.collect { |key,value| puts "#{key}:#{value}" }
second:2
first:1
=> [nil, nil]

irb(main):007:0> ['first' => 1, 'second' => 2].collect { |key,value| puts "#{key}:#{value}" }
second2first1:
=> [nil]

该数组有一个元素(散列),作为一个字符串,它是所有连接在一起的元素。这是这里要注意的重要一点。
另一方面,哈希通过将您期望的键/值对交给您来进行迭代。

希望有帮助。

于 2013-01-28T15:24:35.563 回答
1

我认为您的代码有错字(哈希由 {} 而不是 [] 分隔)。试试这个

values = {'first' => '1', 'second' => '2'}
r = values.map{|k,v| "#{k}=#{v}"}.join('&')
puts r
#shows: first=1&second=2
于 2013-01-28T15:31:38.927 回答