如何在 Lua 中将一个函数传递给另一个函数?

我是 Lua 的初学者,我想为我的 nvim 配置 init.lua。我正在尝试将一个函数(来自 init.lua)作为参数传递给另一个函数(传递给nerdTree.lua),并在nerdTree.lua中调用它。

我认为这应该有效,但我遇到了一个错误:

/.config/nvim/init.lua:26: attempt to call a boolean value

为什么会这样?我做错了什么?

我的init.lua

local function load_plugins()
  local use = require('packer').use
  require("packer").startup(
    {
      function()
        use 'wbthomason/packer.nvim'
        use "neovim/nvim-lspconfig"
                use 'glepnir/lspsaga.nvim'
        use "nvim-lua/completion-nvim"
        use "nvim-treesitter/nvim-treesitter"
        use "joshdick/onedark.vim"
        use "itchyny/lightline.vim"
        use "ryanoasis/vim-devicons"
        require('nerdTree')(use) //感兴趣的点
      end,
      config = {package_root = '/tmp/nvim/site/pack'}
    }
  )
end

我的nerdTree.lua

function load(use)
    use "preservim/nerdtree"
end
点赞
用户2858170
用户2858170

你遇到了这个错误是因为你只能调用函数值或者实现了__call元方法的值。

根据你的实现:

function load(use)
    use "preservim/nerdtree"
end

require("nerdTree")会返回nil

这可能被nvim转换为布尔值,因为你否则会面临尝试调用一个空值的错误,但这只是我猜测的,因为我知道一些值会被转换为相应的VimL类型。另一个可能的原因是已经有另一个nerdtree模块,你没有加载你的模块,而是加载了一个返回布尔值的模块。你很快就会发现。

如果你想调用require的内容,你的模块需要返回一个可调用的值。

但是,由于你的模块定义了一个全局函数,你可以这样做:

require("nerdTree")
load(use)

或者将你的模块更改为

local function load(use)
  use "preservim/nerdtree"
end
return load

然后require("nerdTree")(use)就可以工作了。

2021-04-27 08:46:34