【问题标题】:Select which array to write to based on variables given to a function, Lua根据给定函数 Lua 的变量选择要写入的数组
【发布时间】:2016-03-16 10:00:28
【问题描述】:

我正在尝试运行此代码:

function calcs.grps(Number,ion_color)
    grp .. ion_color .. Y[Number] = (ion_py_mm)
    grp .. ion_color .. Z[Number] = (ion_pz_mm)
end

在 Lua 脚本中,数组已经存在(例如 grp2Y、grp5Z 等),我想使用此函数根据输入的两个变量填充它们。我不断收到错误“'=' expected near '。 ''。我做错了什么?

稍微充实一下:

我在模拟中“飞行”了 120 个离子。这实际上是 12 组 10 个离子。 10 个单独的组由 ion_color 来区分,它是一个从 1 到 12 的整数值。变量“Number”每次只在 1 到 10 之间循环,然后再转到下一个颜色。一旦我填充了这些数组,我想获得每个组的标准偏差。

谢谢!

【问题讨论】:

  • Lua 是一个专有名称,而不是首字母缩略词。不要使用全部大写。

标签: arrays lua


【解决方案1】:

你不能“构造”变量的名字,但是你可以构造一个索引。使用两级嵌套表。

function calcs.grps(Number,ion_color)
    ion['grp' .. ion_color .. 'Y'][Number] = (ion_py_mm)
    ion['grp' .. ion_color .. 'Z'][Number] = (ion_pz_mm)
end

好吧,实际上你可以,因为所有全局变量都只是 _G 表中的条目,但不要这样做,因为它很糟糕 - 它不可读,会使内容溢出到你不打算的其他函数,等等

【讨论】:

  • 啊,这很有意义。我对这一切都很陌生,所以我边走边学。这也意味着我只需要创建一个名为 'ion' 的空数组,谢谢!
  • 您还需要在第一级手动构建空子表 - 没有像其他语言那样的自动激活。你可以使用类似ion['grp' .. ion_color .. 'Y'] = ion['grp' .. ion_color .. 'Y'] or {}; ion['grp' .. ion_color .. 'Y'][Number] = (ion_py_mm)
【解决方案2】:

您的问题的技术答案是简单地索引 _G,_G 是一个包含所有全局变量的表:

function calcs.grps(Number,ion_color)
    _G['grp' .. ion_color .. Y'][Number] = (ion_py_mm)
    _G['grp' .. ion_color .. 'Z'][Number] = (ion_pz_mm)
end

但我认为更好的问题是,你为什么不这样组织它...

local ions = {
    Red = {
        {
            Y = 0, --Y property
            Z = 0 --Z property
        },
        --Continue your red ions
    },
    NewColor = {
            Y = 0, --Y property
            Z = 0 --Z property
        },
        --Continue this color's ions
    },
    --You get the idea
}

function calcs.grps(color, number)
    ions[color][number].Y = (ion_py_mm)
    ions[color][number].Z = (ion_pz_mm)
end

然后你会传递一种颜色,以及一个数字,指示该颜色的哪个离子

IMO 看起来干净多了。

【讨论】:

  • 我以前没见过那个符号,它看起来干净多了!我不太明白你的问题。变量“数字”由我正在使用的软件生成,从 1 到飞行的离子总数(在本例中为 120)。它不关注不同性质的离子是如何分组的。我正在使用离子颜色对它们进行分组。
  • @Nick 你是说期间?它是字符串键的语法糖。就像你可以使用 {hi=1,hello=2} 代替 {['hi']=1,['hello']=2} 一样(希望你充分利用它)
  • @Nick 给我 2 分钟的时间来重写我的答案
  • @Nick 让我们核对我们的 cmets,看看新代码
  • 现在我们在同一页上!我以前也从未见过这样打出来的,所以这是你到目前为止教给我的第二件事。我将继续这样做,更整洁。如果您不介意,还有一个小问题,我将如何在嵌套表上使用“pairs”函数?
猜你喜欢
  • 2018-11-08
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 2021-02-04
相关资源
最近更新 更多