Quick+PROTOC-GEN-LUA 发现的名字冲突

    Q.   当.PROTO文件内的变量名全部写成大写的话, 将会导至出现 attempt to call field 'MSG_XXX_XXX' (a nil value)

           在查证后发现, XXX.PROTO 文件与XXX_PB.LUA 里边的消息名是重复的,所以会造成这个问题,

           原因是在生成LUA文件的时候中间变量名用的是全大写同名名字, 如果自定的消息名字为小写,则没有此问题

           例如: XXX.proto 文件里边有这样一个消息:  message MSG_C2L_LOGIN_SYN {...}

               在生成XXX_pb.lua中将出现如下内容:

              local MSG_C2L_LOGIN_SYN = protobuf.Descriptor();

              MSG_C2L_LOGIN_SYN.name = "MSG_C2L_LOGIN"
              MSG_C2L_LOGIN_SYN.full_name = ".net.MSG_C2L_LOGIN"
              MSG_C2L_LOGIN_SYN.nested_types = {}
              MSG_C2L_LOGIN_SYN.enum_types = {}
              MSG_C2L_LOGIN_SYN.fields = {}
              MSG_C2L_LOGIN_SYN.is_extendable = false
              MSG_C2L_LOGIN_SYN.extensions = {}

              MSG_C2L_LOGIN_SYN = protobuf.Message(MSG_C2L_LOGIN_SYN)

 

              如上: 大家看出来了吧, 这个文件本来是想导出一个全局变量来的, 结果这个变量已经被局部占有了!

      A:    解决方法:

                      需要修改生成LUA脚本的代码!

                      打开protoc-gen-lua文件, 找到336行

                     将原内容:

                     def code_gen_message(message_descriptor, env, containing_type = None):
                         env.enter(message_descriptor.name)
                         full_name = env.get_local_name()
                         obj_name = full_name.upper().replace('.', '_') 
                         env.descriptor.append(
                             "local %s = protobuf.Descriptor();\n"% obj_name
                         )

                     修改成:

                     def code_gen_message(message_descriptor, env, containing_type = None):
                         env.enter(message_descriptor.name)
                         full_name = env.get_local_name()
                         obj_name = full_name.upper().replace('.', '_') + '_DEC'
                         env.descriptor.append(
                             "local %s = protobuf.Descriptor();\n"% obj_name
                         )

                     重新编译后, 便解决这个问题了!
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值