- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我相信你们中的一些人可能会遇到这个问题。我有一个用 C++ 编写的名为矩阵的用户数据对象,使用常用的运算符重载方式,例如。
CMatrix<T>& operator=(const CMatrix<T>& b);
CMatrix<T>& operator=(const T& rhs);
在 C++ 中,当我创建两个矩阵时说 A
和 B
并使 A=B
然后 A 和 B 可以用作两个独立的对象。但是,在 Lua 中,当我编写 A=B
并更改 B
的任何属性时,A
也会更改。
很明显,从 Lua 手册中也可以看出,Lua 通过引用分配用户数据,这解释了上述行为。但是,我怎样才能使 A=B
按值传递,以便当 B
更改时 A
不受影响。
事实上,我想让赋值 A=B
通过引用传递,这确实非常快,Matlab 也这样做,但是当我设置 B< 的属性时
第一次,我希望独立创建 B
,这是在我的 Matlab 中实践的,因为我可以从 Matlab 的内存使用情况中跟踪。
如果这是可能的,它是在 C++ 中还是在 lua 包装器代码中的某个地方完成的?任何示例代码都会很棒。
编辑 1:这是我的想法,我不确定它是否会起作用或者是否足够快
typedef struct luaelement
{
int type;
std::string name;
void* addr; //newly added field
bool isRef; //newly added
} luaelement;
glbLuaElementSet=new set<luaelement,comparenocaseforluaelement>();
int l_newindex(lua_State* L)
{
luaelement element;
const char* key=lua_tostring(L,-2);
string str=key;
element.name=key;
element.type=lua_type(L,-1);
//How can I get the address, maybe a metamethod named address
glbLuaElementSet->insert(element);
lua_rawset(L,1);
}
void l_registermetamethod(lua_State* L)
{
lua_getglobal(L,"_G");
lua_createtable(L, 0, 1);
lua_pushcfunction(L, l_newindex);
lua_setfield(L, -2, "__newindex");
lua_setmetatable(L, -2);
}
现在有了 glbLuaElementSet
变量和 l_newindex
元方法,我可以跟踪插入到全局 _G
表中的所有变量。我计划通过检查 void*
地址来实现并查看是否存在对现有 userdata 变量的任何引用。我不确定这是否真的有效,以及在性能方面是否值得付出努力。
最佳答案
However, how can I make A=B to pass by value so that when B changes A is not affected.
你不能。
记住:Lua 是动态类型。因此,虽然 A
和 B
恰好现在存储了您的矩阵类型,但以后再去 A = 1
就完全没问题了。现在,A
存储一个整数。
C++ 和 Lua 是非常不同的语言。在 C++ 中,变量要么是对象,要么是对对象的引用(指针是指针类型的对象)。每个变量只会保存它开头的对象。存储在该对象中的值可以更改,但对象本身存在并且具有由相关变量的生命周期定义的生命周期。
在 Lua 中,变量只是一个可以存储对象的盒子。那个盒子与它当前恰好存储的对象没有关系;任何盒子都可以容纳任何物体。在任何时候,您都可以将那个盒子里的东西与任何其他盒子里的东西交换。
您不能干涉将一个变量复制到另一个变量(通常。您可以进行元表体操,但这只适用于该表的成员。局部变量永远不会受到影响)。这就是 Lua 作为一种语言的工作方式。 C++ 变量是对象; Lua变量是储物箱。最好接受你不能在 Lua 中编写 C++ 风格的代码,而是专注于在 Lua 中编写 Lua 风格的代码。
因此,如果您想创建对象的拷贝,则必须显式创建该对象的拷贝。
Here is my idea, I am not sure if it will work at all or if so fast enough
由于多种原因,它不会工作。
首先,您要将元表应用于全局表本身,这通常是……粗鲁的。
其次,即使您的代码有效,它也不适用于像这样简单的事情:
globalVar = {} --Perfectly legal to set a table inside the global table.
globalVar.value = A
globalVar.value = B --Will not alert your copying code.
__newindex
元方法不是递归。它不能在表的层次结构中上下移动。因此存储在全局表中的表仍然可以更改其成员。
停止尝试将 Lua 变成它不是的东西。使用您拥有的语言,而不是您想要的语言。
关于c++ - lua userdata 按值传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35214952/
我对 react 和尝试从 .json 文件(称为 userData.json)获取数据还很陌生,但是即使 userData 是一个数组,.map 也不起作用。 我已经检查过了 console.lo
在我的 asp.net 网站上。我将一些数据放入表单例份验证票证的 UserData 部分。稍后我可以使用访问这些数据 (FormsIdentity)(HttpContext.Current.User
OSX 中的磁盘实用程序可以轻松地将 SD 卡镜像装载为设备,但其他 img 文件则不然。 我想将我刚刚在 Android 模拟器中创建的数据库从驱动器中取出并放入我的 osx 文件系统中。 我使用
这是一个小的 C 测试程序来演示我所看到的。它向 Lua 注册一个新的对象类型并执行一个 Lua 脚本。当脚本调用 __len 元方法时,我希望堆栈上只传递一个参数——对象 userdata。相反,它
在Lua中可以通过自定义类型的方式与C语言代码更高效、更灵活的交互。这里我们通过一个简单完整的示例来学习一下Lua中userdata的使用方式。需要说明的是,该示例完全来自于Programming
我需要搜索事件日志,这是我的代码: IEnumerable q = ( from entry in el.Entries.Cast() where entry.Source =
在 C 函数声明中,我看到了这个参数定义: void *userData 所以,那到底是什么?我的猜测:void 表示它可以是任意的,甚至什么都不是。几乎类似于 objective-c 的 id。它只
我在 lua 中有一个接受用户数据对象的函数。 function Class:AttachToUserdataObject(userdataObject) userDataObject.table
我在 lua 中有一个接受用户数据对象的函数。 function Class:AttachToUserdataObject(userdataObject) userDataObject.table
我有以下代码: if (HttpContext.Current.Request.IsAuthenticated == false) { // this isn't reached so i k
我需要我的标记来保存一些数据(不仅仅是位置、片段和标题,它们已经在使用中)。我创建了一个字典,然后将 marker.userData 设置为该字典。但是,我在从字典中获取值时遇到问题。任何帮助将不胜感
只是想在这里确认一下。是否可以直接将 jqGrid 的 userData 与 JavaScript 类型一起使用(而不是使用带有字段的对象)? 如果我修改example在 jqGrid 文档中,我想将
如何适本地缓存从用户的 callbackBegin() 生成的 userData并发送给用户的callbackEnd() . 简单版本(无用户数据 - demo) 我想创建一个支持回调的复杂数据库。对
我正在根据本教程使用表单例份验证为 ASP.Net 4.0 站点实现自定义标识类: Forms Authentication Configuration and Advanced Topics 我想在
我相信你们中的一些人可能会遇到这个问题。我有一个用 C++ 编写的名为矩阵的用户数据对象,使用常用的运算符重载方式,例如。 CMatrix& operator=(const CMatrix& b);
为了防止 Cluster Auto Scaler 终止某些节点,我需要使用以下内容注释它们: cluster-autoscaler.kubernetes.io/scale-down-disabled=
我想使用 LuaJIT,因为它能够在 Lua 中创建结构和数组。但是我使用数据的函数需要存储数据的用户数据或字符串(不是字符串表示形式,仅用作容器)。 但是通过api我看不到这是否可能。是吗? 谢谢。
UserData: Fn::Base64: !Sub | #!/bin/bash echo "Start" >> /v
我有一个运行良好的 Cloudformation 模板。当我以 Base64 形式为其中一项启动配置添加用户数据时,CloudFormation Ruby API 回复我的 JSON 格式不正确。这是
我正在构建并尝试部署打包的 Electron 应用程序。对于我使用的 package Electron package 器 Electron 安装程序-debian Electron 安装程序-dmg
我是一名优秀的程序员,十分优秀!