2016-11-09 21 views
6

Bởi vì tôi quên một bài tập, tôi đọc biến cục bộ chưa xác định hash trước khi viết nó. Bất ngờ: Thay vì nhận được một NameError, giá trị đã được đọc tốt: Đó là một số FixNum và chương trình bị rơi nhiều sau đó.`băm` trong ruby ​​là gì?

tra về vấn đề này, tôi đã làm như sau:

  • Mở IRB
  • loại hash và nhấn Enter
  • Surprise! câu trả lời là -1831075300640432498 (và đáng ngạc nhiên không phải là NameError, cũng không phải là 42)

Tại sao lại như vậy? Nó là một lỗi hay một tính năng? Tôi đang đọc gì ở đây?

+3

http://ruby-doc.org/core-2.0.0/Object.html#method-i-hash – mudasobwa

Trả lời

8

TL; DR - đó là giá trị hash cho đối tượng top-level Ruby, tương đương với self.hash.

Dưới đây là một chút gỡ rối giúp đỡ:

irb(main):001:0> hash 
#=> 3220857809431415791 

irb(main):002:0> defined? hash 
#=> "method" 

irb(main):003:0> method(:hash) 
#=> #<Method: Object(Kernel)#hash> 

Bây giờ bạn có thể tra cứu Object#hash trực tuyến:

http://ruby-doc.org/core-2.3.1/Object.html#method-i-hash

Hoặc trong IRB:

irb(main):004:0> help "Object#hash" 
= Object#hash 

(from ruby core) 
------------------------------------------------------------------------------ 
    obj.hash -> fixnum 

------------------------------------------------------------------------------ 

Generates a Fixnum hash value for this object. This function must have the 
property that a.eql?(b) implies a.hash == b.hash. 

The hash value is used along with #eql? by the Hash class to determine if two 
objects reference the same hash key. Any hash value that exceeds the capacity 
of a Fixnum will be truncated before being used. 

The hash value for an object may not be identical across invocations or 
implementations of Ruby. If you need a stable identifier across Ruby 
invocations and implementations you will need to generate one with a custom 
method. 


#=> nil 
irb(main):005:0> 

Object(Kernel)#hash thực sự có nghĩa là hash được định nghĩa trong Kernel, nhưng như đã nêu trong tài liệu hướng dẫn cho Object:

Mặc dù các phương pháp thể hiện của đối tượng được định nghĩa bởi các mô-đun hạt nhân, chúng tôi đã lựa chọn tìm hiểu về chúng ở đây cho rõ ràng.