- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我看到了here如何使用 Lua 中的 debug.getlocal 函数在表中插入局部变量(5.1)。
function locals()
local variables = {}
local idx = 1
while true do
local ln, lv = debug.getlocal(2, idx)
if ln ~= nil then
variables[ln] = lv
else
break
end
idx = 1 + idx
end
return variables
end
但是,当我尝试返回创建的表并访问其条目时,它不起作用。
function test1()
local v = 'I am a local!'
return locals()
end
print(test1().v) -- nil
经过一些尝试和错误,我注意到在返回之前将表绑定(bind)到变量,或者简单地添加括号可以修复该行为:
function test2()
local v = 'I am a local!'
return (locals())
end
print(test2().v) -- 'I am a local!'
这让我很困惑。为什么这两个程序有任何不同?我不明白什么? locals() 处于尾部调用位置这一事实有什么区别吗?
最佳答案
我猜让你感到困惑的是proper tail call lua的特点。
为了理解这一点,我们修改您的 locals
函数,使其接受一个参数作为调用 debug.getlocal
时使用的级别堆栈。 (我使用的是Lua 5.3.3)
-- Get local variables with stack level 'level'.
function locals(level)
local variables = {}
local idx = 1
while true do
local ln, lv = debug.getlocal(level, idx)
if ln ~= nil then
variables[ln] = lv
else
break
end
idx = 1 + idx
end
return variables
end
然后我们修改您的测试函数,添加相同的参数,并添加 test3
函数以供引用。
function test1(level)
local v = 'I am a local!'
return locals(level)
end
function test2(level)
local v = 'I am a local!'
return (locals(level))
end
function test3(level)
local v = 'I am a local!'
local a = locals(level)
return a
end
最后我们添加一些代码来运行测试。
local function printTable(t)
-- print(t)
for k, v in pairs(t) do
print(string.format("key = %s, val = %s.", k, v))
end
end
for level = 1, 3 do
print("==== Stack level: " .. tostring(level))
for num = 1, 3 do
print(string.format("What test%d returns: ", num))
printTable(_G[(string.format("test%d", num))](level))
print("")
end
end
上面的代码运行不同堆栈级别的测试函数并打印返回的键值对。我的结果如下:
==== Stack level: 1
What test1 returns:
key = variables, val = table: 0x7fa14bc081e0.
key = idx, val = 3.
key = level, val = 1.
What test2 returns:
key = variables, val = table: 0x7fa14bc08220.
key = idx, val = 3.
key = level, val = 1.
What test3 returns:
key = variables, val = table: 0x7fa14bc088b0.
key = idx, val = 3.
key = level, val = 1.
==== Stack level: 2
What test1 returns:
key = (for step), val = 1.
key = (for limit), val = 3.
key = (for index), val = 1.
key = level, val = 2.
key = printTable, val = function: 0x7fa14bc08360.
key = (*temporary), val = function: 0x7fa14bc08360.
key = num, val = 1.
What test2 returns:
key = level, val = 2.
key = v, val = I am a local!.
What test3 returns:
key = level, val = 2.
key = v, val = I am a local!.
==== Stack level: 3
What test1 returns:
key = (*temporary), val = function: 0x109f5a070.
What test2 returns:
key = (for step), val = 1.
key = (for limit), val = 3.
key = (for index), val = 2.
key = level, val = 3.
key = printTable, val = function: 0x7fa14bc08360.
key = (*temporary), val = function: 0x7fa14bc08360.
key = num, val = 2.
What test3 returns:
key = (for step), val = 1.
key = (for limit), val = 3.
key = (for index), val = 3.
key = level, val = 3.
key = printTable, val = function: 0x7fa14bc08360.
key = (*temporary), val = function: 0x7fa14bc08360.
key = num, val = 3.
当level
为1时,locals
可以很好地给出自己的局部变量。但是当level
为2时,test1
返回外部作用域的变量,而test2
和test3
给出你的结果预计。对于堆栈级别 3 test2
和 test3
在堆栈级别 2 返回类似 test1
的内容。所以看起来 test1
跳过堆栈级别,我能想到的唯一解释是正确的尾部调用。
根据 PIL(我在开头提供的链接),正确的尾部调用永远不会导致堆栈溢出,我认为这是以某种内联方式进行调用。如果我的观点是正确的,这就解释了 test1
的 return 语句的跳过行为,因为这是一个正确的尾部调用,并且是 3 个测试函数中唯一的一个。
关于lua - Lua 中与 debug.getlocal 的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38800475/
我的代码应该返回设备的位置,以便放置图钉。 由于某种原因,当多次调用它时,它总是返回第一次调用时返回的值。 代码中的打印返回第一个值。我可能忽略了一些显而易见的事情,但我无法弄清楚是什么。 func
local function ThisIsAFunction() local test1 = "im a local var" local asd = "im also a local
我编写了一个非常简单的应用程序,它向 LocationProvider 询问位置并将其打印到 System.out。这在模拟器中效果很好。但是,当我在我的黑莓设备上运行它时,对 getLocation
我正在使用 symfony2 开发一个应用程序。我面临本地化问题。我想在学说生命周期的 postLoad 事件中设置,但可以找到一种方法来做到这一点。我正在使用路线方法来设置我的本地例如: http:
大家好,我需要在我的网站上显示一个谷歌地图,其中包含我的家标记(我使用商店位置)并以用户位置为中心。我尝试: var myCenter = new google.maps.LatLn
我正在使用 symfony2 开发一个应用程序。我面临本地化问题。我想在学说生命周期的 postLoad 事件中设置,但可以找到一种方法来做到这一点。我正在使用路线方法来设置我的本地例如: http:
我想获取设备的经度和纬度。我使用 location api 来获取经度和纬度,现在我面临的问题是我无法在按钮单击事件中调用 getLocation() 方法。它抛出一个错误,因为无法从事件线程调用 g
我的公司正在尝试将浏览器从 IE8 更新到 IE11。他们希望我的团队能够自动进行测试,以确定与 IE8 相比,他们的应用程序的 Web 元素在 IE11 中是否发生了变化。 我做了一些researc
这个函数有两个不同的引用: 一个用 const 声明的 here ; 还有一个没有 const here ; 哪个是正确的? 最佳答案 标准说 (27.5.3.3) 定义应该是: locale get
我正在使用 Equinox OSGi 实现。当我检索一个包并询问它的位置(getLocation() 方法)时,返回的字符串以“initial@reference”为前缀。 OSGi 4.3 规范没有
我正在用 OpenLayers 编写 map (4.6.5) 和 Angular (6).我正在使用法语 API在这样的请求结束时返回 GeoJSON 文件: https://api-adresse.
我在 Activity 中使用 StreetViewPanorama View 。 最初我使用设置 StreetViewPanorama 的位置。 streetViewPanorama.setPosi
在运行我的 Protractor 测试时,我正在尝试获取页面上元素的 x 和 y 值。 it('should keep the left nav links floating along with t
我正在使用 Android 地理编码通过 Address.getLocality() 获取当前城市。它运行良好,直到最近它似乎经常为本地返回 null。 这是一个例子: try { Geoco
本文整理了Java中org.geoserver.wfs.WFSException.getLocator()方法的一些代码示例,展示了WFSException.getLocator()的具体用法。这些代
本文整理了Java中javolution.xml.stream.XMLStreamReader.getLocation()方法的一些代码示例,展示了XMLStreamReader.getLocatio
我正在开发一个应用程序,试图获取当前位置。但是,即使我创建了一个新线程,也会收到错误“无法从事件线程调用 getLocation() 方法”。谁能帮我吗? 这是我的代码 Thread t = new
我使用 rails 3.2.6、ruby 1.9.3 和 mongoid gem 3.0。 我想显示数据库条目的 created_at 字段,但收到以下错误: undefined method `ge
我找不到 FileSystem.getLocal() 类的 jar 文件; FileSystem fs = FileSystem.get(conf); Path clusters = new Path
好的,所以我使用以下代码在 J 面板上动态制作了一行具有空布局的 J 按钮: int Y = 100; int X = 100; for(x=1, x<=20, x++){ button =
我是一名优秀的程序员,十分优秀!