gethash不适用于字符串键

use*_*035 3 emacs elisp

在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对象生成两次.