2012-02-21 33 views
11

Tôi đang gọi API của bên thứ ba (viết bằng PHP) đi qua trong một số cặp khóa/giá trị.Ruby Hash.new vs Hash literal

Mã này hoạt động:

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

này không:

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

Khi tôi đổ Hash ra cửa sổ Console trong cả hai trường hợp tôi nhận được cấu trúc dữ liệu tương tự. Vì vậy, tại sao nó là cách đầu tiên hoạt động nhưng thứ 2 không?

EDIT: Không chắc chắn nếu điều này quan trọng nhưng tôi đang sử dụng Ruby 1.8.7p72/Linux. Một trong những cặp khóa/giá trị là một chuỗi hình ảnh được mã hóa Base64.

+2

Có không có lý do gì nên xảy ra. Trong các thử nghiệm của tôi, 'Hash.object_id' trả về cùng giá trị với' Hash.new.class.object_id' và '{} .class.object_id'. Họ đều cùng lớp. Bạn có nhận được bất kỳ lỗi nào từ cuộc gọi API không? – Brandan

+1

Họ trông giống như tôi. Nếu đây là tất cả các mã của bạn, tôi không chắc chắn lý do tại sao một người sẽ làm việc và người kia thì không. Nếu đây là một ứng dụng Rails, tôi sẽ xem xét bạn đang bị ảnh hưởng bằng cách sử dụng một Hash nơi một [HashWithIndifferentAccess] (http://as.rubyonrails.org/classes/HashWithIndifferentAccess.html) là bắt buộc (đây chỉ là một linh cảm , nếu mã của bạn là như trên đây sẽ không phải là vấn đề của bạn). – gar

+0

@ Brand: Rất tiếc, không có lỗi nào được API trả lại. –

Trả lời

1

như tài liệu của lớp Hash khẳng định:

[](*args) public

Tạo một hash mới dân cư với các đối tượng nhất định. Tương đương với {key => value,…} theo nghĩa đen. Ở dạng đầu tiên, các khóa và giá trị xuất hiện theo cặp, vì vậy phải có số lượng đối số bằng nhau. Dạng thứ hai và thứ ba lấy một đối số đơn lẻ hoặc là một mảng các cặp khóa-giá trị hoặc một đối tượng có thể chuyển đổi thành một băm.

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

Vì vậy, ít nhất Hash[] nên có hành vi tương tự như {...}

+6

Điều đó có liên quan gì đến câu hỏi? –

+0

rằng có thể 'Hash.new' tạo ra một cái gì đó khác với chữ' {..} ', bởi vì tài liệu chỉ nói rõ ràng rằng' Hash [] 'tương đương với chữ băm. – phoet

+2

Mọi triển khai tôi biết đều tạo ra kết quả tương tự cho các trường hợp được mô tả trong câu hỏi. –

-1

Các băm đen đã không đi ra cho đến khi v1.9. Bạn đang sử dụng v1.8.

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

Tìm kiếm liên kết này cho "cú pháp băm đen":

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

Đây là một bản vá để backport tính năng vào v1.8:

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

+14

Ruby đã có các hash literals từ ít nhất 1.8.6. Có gì mới trong 1.9 là một cú pháp thay thế cho các chữ băm (ví dụ: '{foo: 'bar'}' thay vì '{: foo => 'bar'}'. OP, tuy nhiên, không sử dụng cú pháp thay thế. –