在elisp中研究哈希表,我试着写一个简单的例子:
(setq animals (make-hash-table))
(puthash "tiger" 120 animals)
(gethash "tiger" animals)
Run Code Online (Sandbox Code Playgroud)
当我逐行执行它们时,调用gethash返回nil,尽管事实上,当我评估动物符号时,emacs会打印出这样的信息:
#s(hash-table size 65 test eql rehash-size 1.5 rehash-threshold
0.8 data ("tiger" 120 ...))
Run Code Online (Sandbox Code Playgroud)
所以,"老虎"就在那里,但是由于某些原因,gethash不会返回它.
怎么了?
Bar*_*mar 10
哈希表的默认测试是eql.每次键入字符串时,都会创建一个不同的字符串,因此它们eql彼此不相符.
(eql "tiger" "tiger") => nil
Run Code Online (Sandbox Code Playgroud)
你需要equal用作测试:
(setq animals (make-hash-table :test 'equal))
Run Code Online (Sandbox Code Playgroud)
或者使用符号而不是字符串作为表格中的键; 由于符号是实体的,因此键入相同的符号名称会导致eql对象生成两次.
| 归档时间: |
|
| 查看次数: |
139 次 |
| 最近记录: |