RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 775143
Accepted
Beast Winterwolf
Beast Winterwolf
Asked:2020-01-24 23:37:06 +0000 UTC2020-01-24 23:37:06 +0000 UTC 2020-01-24 23:37:06 +0000 UTC

如何从表中提取变量并将它们放在当前范围内?

  • 772

我有一个包含许多不同类的表。我想直接从连接这个表的模块中使用这些类,而不是参考父母(Window而不是app.gui.Window)。

这是我需要的最简单的示例:

t = {
  a = 1,
  b = 2,
  c = 3
}

function f(t)
  print(t.b) -- так работает
  print(b) -- как заставить работать так?
end

f(t)

UPD:当然,最简单的方法是以这种方式解决问题:b = t.b,但是让我们同意我事先不知道表 t 中的键的名称(更准确地说,它们是我知道的,当然,但这a = t.a; b = t.b; c = t.c ... z = t.z是某种狗屎代码)。

这是我刚刚提出的解决方案:

function f(t)
  print(t.b) -- так работает
  for k, v in pairs(t) do _G[k] = v end
  print(b) -- и так работает!
end

...但是,正如您所看到的,它会影响全局范围,而不是本地范围,这是不允许的!我需要_G的本地类似物,某种_L。

有一个想法是创建这样一个变量并将其注册到元方法debug.getlocal和debug.setlocal中,虽然我并没有真正理解这些函数的语法并且我对元方法的能力也不强,但我会尝试。

lua
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Mike V.
    2020-01-25T18:01:51Z2020-01-25T18:01:51Z

    我将尝试通过模块来实现范围,将代码放在文件中test.lua:

    module('test', package.seeall)
    t = {   a = 1, b = 2,  c = 3 }
    
    for k,v in pairs(t) do
          _M[k] = v -- вынимаем переменные из таблицы в область видимости модуля _M
    end
    
    print(t.b, b)  -- 2 2
    

    例如,我们调用模块并检查全局变量b:

    b = 4
    
    local test = require "test"
    
    print(test.t.b) -- 2
    print(test.b)  -- 2  ( b в модуле )
    print(b)        --  4   ( b глобальная )
    

    2 使用元表和继承的方法:

    local _M = {}   
    setmetatable(_M, {__index = _G})
    setfenv(1, _M)
    
    t = { a = 1, b = 2, c = 3 }
    
    for k,v in pairs(t) do
          _M[k] = v
    end
    
    print(t.b, b)  -- 2 2
    
    return _M
    

    如果你用help调用这个文件,require结果是一样的,缺点是继承_G的额外开销。

    而3方式,你可以只使用setenv设置范围,但是你需要通过类型构造显式调用函数_G.pairs,这不是很漂亮:

    local _M = {}
    local _G = _G
    setfenv(1, _M)
    
    t = {  a = 1,  b = 2,  c = 3 }
    
    for k,v in  _G.pairs(t) do
          _M[k] = v
    end
    
    _G.print(t.b, b)  -- 2  2
    
    return _M
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5