2012-02-21 75 views
11

我打电话给第三方API(用PHP编写)传递一些键/值对。Ruby Hash.new vs哈希文字

此代码:

h = Hash.new 
h['first_name'] = "Firstname" 
h['last_name'] = "Lastname" 
APICall([h]) # Record gets created 

这不:

h = {'first_name' => "Firstname", 'last_name' => "Lastname"} 
APICall([h]) # Record does not get created 

当我转储哈希在这两个实例中,我得到了相同的数据结构的控制台。那么为什么第一种方法可行,但第二种方法不行?

编辑:不知道这是否重要,但我使用的是Ruby 1.8.7p72/Linux。另外一个键/值对是Base64编码的图像字符串。

+2

有没有理由这会发生。在我的测试中,'Hash.object_id'返回与'Hash.new.class.object_id'和'{} .class.object_id'相同的值。他们都是同一班。你是否从API调用中收到任何错误? – Brandan 2012-02-21 13:52:14

+1

他们看起来和我一样。如果这是你的所有代码,我不知道为什么一个人会工作,而另一个不会。如果这是一个Rails应用程序,我会希望看到使用Hash需要[HashWithIndifferentAccess](http://as.rubyonrails.org/classes/HashWithIndifferentAccess.html)(这只是一个预感,如果你的代码和上面一样,这不会是你的问题)。 – gar 2012-02-21 13:55:27

+0

@Brandan:不幸的是没有API返回的错误。 – 2012-02-21 13:56:16

回答

1

Hash类的文档指出:

[](*args) public

创建填充了给定对象的新的散列。 等价于文字{key => value,...}。在第一种形式中,键和值是成对出现的,所以必须有偶数个参数。第二种和第三种形式采用单个参数,它可以是键值对的数组,也可以是可转换为散列的对象。

Hash["a", 100, "b", 200]    #=> {"a"=>100, "b"=>200} 
Hash[ [ ["a", 100], ["b", 200] ] ] #=> {"a"=>100, "b"=>200} 
Hash["a" => 100, "b" => 200]   #=> {"a"=>100, "b"=>200} 

http://apidock.com/ruby/Hash/%5B%5D/class

所以至少Hash[]应该有相同的行为{...}

+6

这与问题有什么关系? – 2012-02-21 18:36:40

+0

可能'Hash.new'产生与文字'{..}'不同的东西,因为文档只是明确地说'Hash []'等价于哈希文字。 – phoet 2012-02-21 18:47:34

+2

我知道的每个实现都会为问题中所描述的情况产生完全相同的结果。 – 2012-02-21 20:18:21

-1

哈希字面没有出来,直到1.9版。您正在使用v1.8。

http://www.ruby-lang.org/en/news/2009/01/30/ruby-1-9-1-released/

搜寻此链接为 “文本哈希语法”:

http://svn.ruby-lang.org/repos/ruby/tags/v1_9_1_0/NEWS

这里是一个反向移植功能到V1.8补丁:

http://bugs.ruby-lang.org/issues/1183

+14

Ruby从1.8.6开始就有哈希文字。 1.9中的新特性是散列文字的替代语法(例如'{foo:'bar'}'而不是'{:foo =>'bar'}'。但是,OP不使用替代语法。 – 2012-03-08 04:24:50