Chapter 17_4 终结器

  Lua中的垃圾回收主要是针对Lua对象,但是也可以做一些额外的资源管理工作。

  可以为表设定垃圾收集的元方法(对于完全用户数据,则需要使用C API),该元方法称为 终结器。

  Lua用"__gc" 元方法实现终结器:

o = {x  = "hi" }
setmetatable(o , {__gc = function (o ) print (o.x) end } )
o = nil
collectgarbage()  --> hi       -- 触发元方法__gc

如果我们没有对对象进行__gc标记,它就不会终结。

在它之后才给元表加上这个__gc域,那么这个对象是没有被标记需要触发终结器的:

o = { x = "hi"}
mt = {}
setmetatable(o,mt )
mt.__gc = function(o) print(o.x) end
o = nil
collectgarbage()   -->  不会打印任何东西

在标记__gc域后,还是可以自由地改变其元表中的 “__gc” 域:

o = {x = "hi" }
mt = {__gc = true }             --先用任何值给它赋值,作为占位符
setmetatable(o, mt )
mt.__gc = function(o) print (o.x) end   --再次修改,也是可以的
o = nil
collectgarbage()   --> hi

当用同一个循环对几个对象进行垃圾回收,调用终结器的顺序和标记对象__gc域的顺序刚好相反。

mt = { __gc = function (o) print (o[1]) end }
list = nil
for i = 1, 3 do
    list = setmetatable({i , link = list}, mt )
end
list = nil
collectgarbage()
--> 3
--> 2 
--> 1

未完待续.....

以上内容来自:《Lua程序设计第二版》和《Programming in Lua  third edition 》

转载于:https://www.cnblogs.com/daiker/p/5886440.html

要解决在 `/home/ls/dev1/chapter3_ws/install/chapter3_tutorials/share/chapter3_tutorials` 包的共享目录中找不到 `example4_5.launch` 文件的问题,可以按以下步骤排查和解决: ### 检查文件是否存在于源码目录 通常,ROS 包在编译后会将 `launch` 文件等资源安装到共享目录。首先需要确认该文件是否存在于源码目录中。一般 `launch` 文件会存放在 `launch` 子目录下,使用以下命令检查: ```bash ls /home/ls/dev1/chapter3_ws/src/chapter3_tutorials/launch ``` 如果文件不存在,可能是没有正确编写或者放置该 `launch` 文件。 ### 检查编译配置 确保 `CMakeLists.txt` 文件中正确配置了 `launch` 文件的安装规则。在 `CMakeLists.txt` 中应该有类似如下的内容: ```cmake install(DIRECTORY launch/ DESTINATION share/${PROJECT_NAME} FILES_MATCHING PATTERN "*.launch" ) ``` 如果没有这部分内容,需要添加进去。 ### 重新编译工作空间 在修改了 `CMakeLists.txt` 后,需要重新编译工作空间,使用以下命令: ```bash cd /home/ls/dev1/chapter3_ws catkin_make ``` 或者使用 `catkin build`(如果使用 `catkin_tools`): ```bash cd /home/ls/dev1/chapter3_ws catkin build ``` ### 检查环境变量 确保 ROS 环境变量正确设置,每次打开新的终端都需要重新加载环境变量: ```bash source /home/ls/dev1/chapter3_ws/devel/setup.bash ``` ### 检查文件权限 确保文件权限允许被复制到共享目录。可以使用以下命令修改文件权限: ```bash chmod +x /home/ls/dev1/chapter3_ws/src/chapter3_tutorials/launch/example4_5.launch ``` ### 检查安装目录 再次确认文件是否已经被正确安装到共享目录: ```bash ls /home/ls/dev1/chapter3_ws/install/chapter3_tutorials/share/chapter3_tutorials ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值