【问题标题】:Strings that appear same are reflected as unequal in lua看起来相同的字符串在lua中反映为不相等
【发布时间】:2019-07-27 14:25:18
【问题描述】:

我在 Lua 中有以下功能。

function tempchange(m1)
if type(m1) ~="string" then  return  m1 end
    for w in string.gmatch(m1, "%d%+%d*i") do
        words[#words+1]=w
      end
    for i = 1, #words do
        words[i]=string.gsub(words[i],"+","uuu")
    end
m1=string.gsub(m1,"+","uuu")
for i = 1, #words do
m1=string.gsub(m1,words[i],'"'..words[i]..'"')
end
m1=string.gsub(m1,"uuu","+")
return m1
end

字符串 m 和 n 定义为

m = '{{1,2,3},{4,5,6},{7,8,"9+i"}}'
n = '{{1,2,3},{4,5,6},{7,8,9+i}}'

我希望字符串 mtempchange(n) 相同。事实上,我做了以下检查。

print(m)
print(tempchange(n))
print(type(m))
print(type(tempchange(n)))
print(m==tempchange(n))

输出是

{{1,2,3},{4,5,6},{7,8,"9+i"}}
{{1,2,3},{4,5,6},{7,8,"9+i"}}
string
string
false

因此,即使 mtempchange(n) 两个字符串都是字符串并且它们看起来相同,但在比较它们时我们会得到错误。这意味着它们是不同的。为什么会这样?我是 lua 新手,正在努力学习它。任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 我已经编辑了帖子。我说得非常清楚和简单。它也为我解释了这种功能的必要性。请检查。
  • 这是对我的要求。查看ntempstring(n) 之间的区别。我无法删除该行。
  • 我认为我发布了具有完整代码和清晰性的有效问题。我不能把它编码得更简单。查看 n 和 tempchange(n) 之间的区别。字符串 n 可以包含更多的 a+ib 形式的数字。因此 for 循环是必要的。仍然投反对票。有人可以解释为什么对新用户投反对票吗?
  • 两个问题:1.您没有显示定义words的代码。没有它,代码就无法运行,我们不能只假设你把那行放在哪里。 2. 你应该更好地缩进你的代码。这很难解释,但基本上,您需要将每个代码块的主体缩进比该块的头部和end 深一级。

标签: string replace lua string-comparison substitution


【解决方案1】:

问题是每次调用tempchange 时都没有重新初始化words 表。要解决您的问题,请将此行添加到您的 tempchange 函数的开头:

local words = {}

按照你的方式,每次你调用tempchange(3次,在你上面的打印语句序列中),你继续添加到words。这意味着在这个 for 循环中:

for i = 1, #words do
    m1 = string.gsub(m1,words[i],'"'..words[i]..'"')
end

...您不断添加更多引号。

您只需在每次调用该函数时从一个新的words 表开始。

另外,我今天早些时候误解了你的问题。对此我深表歉意。

【讨论】:

  • 感谢您的回复。我仍然很好奇为什么即使没有本地单词 = {},字符串的最终输出也是相同的。所以当输出相同时,它应该反映真实。不是吗?
  • 如果words 是全局的,那么每次调用tempchange 的返回值都会改变。这就是为什么在您的问题中包含 words 定义会很好的原因。
  • 但是为什么不管单词是本地的还是全局的,输出都是一样的?
  • 重要的是在函数的开头重新声明了它。 local 是一种很好的做法,为了不弄乱全局符号空间,以及避免使用全局变量的所有其他原因。
  • @Maths89 尝试在有和没有local words = {} 的情况下运行for i=1,5 do print(tempchange(n)) end 并查看差异。这应该很明显发生了什么;)
猜你喜欢
  • 2017-07-31
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
相关资源
最近更新 更多