【问题标题】:How to advice-add a function with no arguments to a function that takes arguments?如何建议将不带参数的函数添加到带参数的函数中?
【发布时间】:2021-11-20 02:40:52
【问题描述】:

假设我有如下函数:

  (defun my/test-a (n)
    (interactive)
    (message n))
    
  (defun my/test-b ()
    (interactive)
    (sleep-for .5)
    (message "Message - B.")
    (sleep-for .5))

然后我建议 my/test-a 使用 mytest-b,如下所示:(advice-add 'my/test-a :after #'my/test-b)

但是,当我调用 (my/test-a "Message - A.") 时,我收到“参数数量错误”错误。我的理解是 add-advice 将参数输入到 my/test-b 中,它不期望任何参数。

如何建议将不带参数的函数添加到带参数的函数中?

我可以改变 my/test-b 让它接受一个参数并且不使用它,但这感觉很混乱。

相关跟进 - 我如何建议 find-file 使用没有参数的函数(如 my/test-b)?我知道 find-file 是一个不寻常的情况,因为如果以交互方式调用它不需要参数。但是如果我运行 (advice-add 'find-file :after #'my/test-b) 然后 (call-interactively 'find-file) 我再次收到“错误数量的参数”错误。

TIA。

【问题讨论】:

    标签: elisp


    【解决方案1】:

    你不能这样做。

    您的建议函数必须接受原始函数的参数。

    C-hig (elisp)Advice Combinators 说:

    :after
    在旧函数之后调用 FUNCTION。 这两个函数都收到 相同的参数,组合的返回值是 旧函数的返回值。更具体地说, 这两个函数的组合行为类似于:
    (lambda (&rest r) (prog1 (apply OLDFUN r) (apply FUNCTION r)))

    采用任意参数并忽略它们的方法是:

    (defun foo (&rest _args) ...)
    

    下划线告诉字节编译器,参数在函数体中是故意不使用的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-13
      • 2016-09-27
      • 2011-08-07
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 2019-02-02
      • 2013-06-22
      相关资源
      最近更新 更多