因为我忘记了一个赋值,所以在写它之前我会读取未定义的局部变量hash
。惊喜:没有得到一个NameError,而是读取的值很好:它是一些FixNum,程序崩溃得很晚。
调查问题,我做了以下事情:
hash
并按Enter键为什么?这是一个错误还是一个功能?我在这里读什么?
答案 0 :(得分:8)
TL; DR - 它是Ruby hash
对象的top-level值,相当于self.hash
。
这里有一点调试帮助:
irb(main):001:0> hash
#=> 3220857809431415791
irb(main):002:0> defined? hash
#=> "method"
irb(main):003:0> method(:hash)
#=> #<Method: Object(Kernel)#hash>
您现在可以在线查找Object#hash
1 :
http://ruby-doc.org/core-2.3.1/Object.html#method-i-hash
或者在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>
1 Object(Kernel)#hash
实际上意味着在hash
中定义了Kernel
,但正如Object
的文档中所述:
虽然Object的实例方法是由Kernel模块定义的,但为了清楚起见,我们选择在此处记录它们。