首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么‘i’总是被认为是1-循环

为什么‘i’总是被认为是1-循环
EN

Stack Overflow用户
提问于 2012-07-19 08:25:46
回答 2查看 318关注 0票数 0

我编写了这个简单的脚本来更新MySQL中的表。为此,我创建了一个For -循环,并尝试了以下操作(码页链路):

代码语言:javascript
复制
sUpdate = [[UPDATE `latest`
SET `date` = '%s'
WHERE `date` = '%s'
AND `fid` > 50000]]

for i = 1, 12 do
  print( i )
  sOldDate = "2009-"..tostring(i).."-10"
  sNewDate = "2010-09-"..tostring(i)
  sUpdate = string.format( sUpdate, sNewDate, sOldDate )
  print( sUpdate )
end

产出如下:

代码语言:javascript
复制
1
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
2
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
3
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
4
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
5
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
6
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
7
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
8
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
9
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
10
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
11
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
12
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000

如您所见,print(i)打印得很好,但是sOldDatesNewDate都将我作为1处理。然后,我将sOldDatesNewDate更改如下:

代码语言:javascript
复制
sOldDate = string.format("2009-%d-10", i)
sNewDate = string.format("2010-09-%d", i)

我仍然得到两个日期的输出为: 2009-1-10和2010-09-1,如这里所见。

这个循环有什么问题。我已经在这样的循环上工作了很长一段时间,直到今天,它们从来没有让我失望过。

我认为这只是我的一个愚蠢的错误,我无法辨认。任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-19 08:39:57

是的,问题是你每次都要覆盖sUpdate

第一次,您将覆盖字符串占位符%s,在此之后,字符串不会再次更改。

尝试重命名内部sUpdate。我想你希望所有变量都像local一样

代码语言:javascript
复制
local sUpdate = [[UPDATE `latest`
SET `date` = '%s'
WHERE `date` = '%s'
AND `fid` > 50000]]

for i = 1, 12 do
  print( i )
  local sOldDate = "2009-"..tostring(i).."-10"
  local sNewDate = "2010-09-"..tostring(i)
  local sUpdate = string.format( sUpdate, sNewDate, sOldDate )
  print( sUpdate )
end

编辑:正如您在上面看到的那样,我保留了您的变量名,但是内部sUpdate并不隐藏外部名称,因为它被声明为local。默认情况下,Lua中的所有变量都是全局的,因此确保在local中使用声明局部变量是很好的建议。我会选择不同的变量名,比如:

代码语言:javascript
复制
local sUpdateTemplate = [[UPDATE `latest`
SET `date` = '%s'
WHERE `date` = '%s'
AND `fid` > 50000]]

for i = 1, 12 do
  print( i )
  local sOldDate = "2009-"..tostring(i).."-10"
  local sNewDate = "2010-09-"..tostring(i)
  local sUpdate = string.format( sUpdateTemplate, sNewDate, sOldDate )
  print( sUpdate )
end
票数 4
EN

Stack Overflow用户

发布于 2012-07-19 08:49:13

如前所述,您需要在循环中重命名sUpdate,以避免覆盖外部string.format()。然后,您可以在string.format()中使用%02d对至少两位数字长度为零的衬垫数字:

代码语言:javascript
复制
local sUpdate = [[UPDATE `latest`
SET `date` = '%s'
WHERE `date` = '%s'
AND `fid` > 50000]]

for i = 1, 12 do
  print( i )
  local sOldDate = string.format("2010-%02d-10", i)
  local sNewDate = string.format("2010-09-%02d", i)
  local update = string.format( sUpdate, sNewDate, sOldDate )
  print( update )
end
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11556789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档