能否在Lua shell提示符中运行函数?

我可以用 _PROMPT = "> " 设置提示符,但是我能让提示符每次更新吗?

我尝试了这个,但它不起作用:

i = 0

function inc()
    i = i + 1
    return i
end

_PROMPT = inc

这显示了 _PROMPT,但与此无关:

for k, v in pairs(_G) do
    print(k)
end
点赞
用户6632736
用户6632736

主提示是全局变量 \ _PROMPT 的值,如果这个值是一个字符串; 否则,将使用默认提示。

https://www.lua.org/manual/5.1/lua.html

您将一个函数分配给_PROMPT。我尝试过

_PROMPT = {no = 0}; setmetatable (_PROMPT, {__tostring = function (self) self.no = self.no + 1; return tostring (self.no) .. ' >' end})

,不过没有成功,尽管我每次输入“= _PROMPT”时,_PROMPT都会增加。

更新不过,这是可以做到的!在Lua邮件列表中,有人建议我使用

setmetatable(_ENV, {__index = function(t, k) if k == '_PROMPT' then t._N = (t._N or 0) + 1; return t._N .. ' >' end end})

它有效。这实际上是一种深层次的方法,用于覆盖任何全局变量,而不仅仅是将新值分配给它,或使一组全局变量有效地变为无限。

您可以使用一行命令在交互模式下启动Lua:

lua -i -e "setmetatable(_ENV, {__index = function(t, k) if k == '_PROMPT' then t._N = (t._N or 0) + 1; return t._N .. ' >' end end})"
2020-10-22 03:24:33
用户11740758
用户11740758

我通过debug.sethook()找到了一种方法。

听起来有点奇怪,但它真的很简单 ;-)

在这里......

#/usr/bin/lua -i
Lua 5.3.5版版权所有(C)1994-2018 Lua.org PUC-Rio
>debug.sethook(function(...)_PROMPT = os.date('%H:%M:%S#')end,'r')
10:49:42#--一些回车
10:51:00#
10:51:01#
10:51:05#

(以Lua 5.3.5完成并测试了5.4-应该使用5.1但未经测试)

'r'的意思是:每次返回时都会触发

编辑

另一种直接使用_PROMPT和_PROMPT2的方法...

--更改/或时间记录提示的简单方法
_PROMPT =setmetatable({},{__index=table})
_PROMPT2 =setmetatable({},{__index=table})

getmetatable(_PROMPT)。__ tostring = function()
_PROMPT:插入(os.date('%H:%M:%S',os.time())..'>')
return string.format('%s',_PROMPTconcat(#_PROMPT,#_PROMPT))
end

getmetatable_PROMPT2)。__ tostring = function()
_PROMPT2insertos.date('%H:%M:%S',os.time())..'>>')
return string.format('%s',_PROMPT2concat(#_PROMPT2,#_PROMPT2))
end

...使用__tostring和__index具有表元方法。

...玩得开心,保持健康。

2021-04-06 09:56:18