我正在阅读subr.el并看到了这段代码:
(defalias 'backward-delete-char 'delete-backward-char)
(defalias 'search-forward-regexp (symbol-function 're-search-forward))
有趣的是,第一行不使用符号函数,而第二行不使用符号函数。我知道这两种使用defalias的方法的唯一区别是对reverse-delete-char(第一个)的帮助显示它是delete-backward-char的别名,而search-forward-regexp的帮助没有吨。
是否存在第二种方式比第一种方式更好的情况?
答案 0 :(得分:34)
两个defalias
用法略有不同。第一个将'backward-delete-char
的函数单元格链接到'delete-backward-char
的函数单元格。第二个将'search-forward-regexp
链接到're-search-forward
当前调用的函数。
不同之处在于,如果您稍后更改“delete-backward-char
的定义,'backward-delete-char
现在将具有新行为。而在第二种情况下,更改're-search-forward
的功能对'search-forward-regexp
的行为没有影响。
也许一些ascii艺术可以提供帮助:
+-------------------------+ +-----------------+
|#<subr re-search-forward>| <-- |re-search-forward|
+-------------------------+ +-----------------+
^ +---------------------+
\------ |search-forward-regexp|
+---------------------+
+----------------------------+ +--------------------+ +--------------------+
|#<subr delete-backward-char>| <-- |delete-backward-char| <-- |backward-delete-char|
+----------------------------+ +--------------------+ +--------------------+
此documentation可能有助于澄清问题。
答案 1 :(得分:2)
嗯,这真的不一样......这是我刚刚玩的一个小游戏:
(defun a () (message "hello"))
a
(a)
"hello"
(defalias 'b (symbol-function 'a))
(lambda nil (message "hello"))
(defalias 'c 'a)
a
(b)
"hello"
(c)
"hello"
(defun a () (message "howdy"))
a
(a)
"howdy"
(b)
"hello"
(c)
"howdy" ' c changed meaning, b did not...