Lua 不寻常的变量名(问号变量)

我碰到了这行代码,我不确定 [ ? ] 部分代表什么(我猜它是一种通配符,但我搜索了一下,没有找到什么):

['?'] = function() return is_canadian and "eh" or "" end

我理解 RHS 是一个函数三目运算符。我很好奇 LHS 是什么,它实际上是什么。

编辑:参考(第二个例子):

http://lua-users.org/wiki/SwitchStatement

点赞
用户3574628
用户3574628

如果你仔细看问题中的代码,你会发现这一行是一个表构造器的一部分(在 {} 内部)。它本身不是一个完整的语句。正如评论中提到的,如果不在表构造器中,这将是一种语法错误。 ['?'] 仅仅是一个字符串键。

2021-01-18 05:14:51
用户10953006
用户10953006

实际上,这很简单。

  local t = {
    a = "aah",
    b = "bee",
    c = "see",

它将每个字母映射到一个发音。这里,a要发音为aahb要发音为bee,以此类推。一些字母在美式英语加拿大式英语中有不同的发音。因此,并不是每个字母都可以映射到一个单独的发音。

z = function() return is_canadian and "zed" or "zee" end,
['?'] = function() return is_canadian and "eh" or "" end

在映射中,字母z和字母?美式英语加拿大式英语中有不同的发音。当程序尝试获取'?'的发音时,它会调用一个函数检查用户是否想要使用加拿大式英语或其他英语,函数将返回zedzee

最后,以下两条表示法的意义相同:

  local t1 = {
    a     = "aah",
    b     = "bee",
    ["?"] = "bee"
  }

  local t2 = {
    ["a"] = "aah",
    ["b"] = "bee",
    ["?"] = "bee"
  }
2021-01-18 07:12:24
用户2858170
用户2858170

其他帖子已经解释了代码的功能,那么让我解释为什么需要以这种方式编写。

['?'] = function() return is_canadian and "eh" or "" end 嵌入在 {} 中。

它是 table constructor 的一部分,将函数值分配给字符串键 '?'

local tbl = {a = 1} 是语法上的糖果,等同于 local tbl = {['a'] = 1} 或者

local tbl = {}
tbl['a'] = 1

允许这种便利语法的字符串键必须遵循 Lua 的词法约定,因此只能包含字母、数字和下划线。它们不能以数字开头。

所以 local a = {? = 1} 是不可能的。它会导致语法错误 unexpected symbol near '?',因此必须显式地在方括号中提供字符串值,例如 local a = {['?'] = 1}

他们给每个表元素分配了自己的行

local a = {
    1,
    2,
    3
}

这极大地提高了长表元素或非常长表的可读性,并且允许您维护最大行长度。

你会同意

local tbl = {
    z     = function() return is_canadian and "zed" or "zee" end,
    ['?'] = function() return is_canadian and "eh" or "" end
}

看起来比

local tbl = {z = function() return is_canadian and "zed" or "zee" end,['?'] = function() return is_canadian and "eh" or "" end}

要干净得多。

2021-01-18 08:16:41