加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

什么是ruby中的`hash`?

发布时间:2020-12-16 23:33:29 所属栏目:百科 来源:网络整理
导读:因为我忘记了一个赋值,所以在写它之前我会读取未定义的局部变量哈希.惊喜:没有得到一个NameError,而是读取的值很好:它是一些FixNum,程序崩溃得很晚. 调查问题,我做了以下事情: 打开irb 键入hash并按Enter键 惊喜!答案是-1831075300640432498(令人惊讶的
因为我忘记了一个赋值,所以在写它之前我会读取未定义的局部变量哈希.惊喜:没有得到一个NameError,而是读取的值很好:它是一些FixNum,程序崩溃得很晚.

调查问题,我做了以下事情:

>打开irb
>键入hash并按Enter键
>惊喜!答案是-1831075300640432498(令人惊讶的是没有NameError,也没有42)

这是为什么?这是一个错误还是一个功能?我在这读什么?

解决方法

TL; DR – 它是 Ruby的 top-level对象的 hash值,相当于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#hash1:

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对象(内核)#hash实际上意味着哈希是在内核中定义的,但是如Object的文档中所述:

Although the instance methods of Object are defined by the Kernel module,we have chosen to document them here for clarity.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读