2012-02-21 73 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