表字段中的变量名不起作用
Posted
技术标签:
【中文标题】表字段中的变量名不起作用【英文标题】:Variable names in table field not working 【发布时间】:2013-03-21 18:31:42 【问题描述】:我在为游戏编写一些代码时遇到了一个问题。看来我不能在语句中使用变量;
local Username = "Cranavvo"
game.Players.Username:BreakJoints() -- Kills the player
输出告诉我“No such user as 'Username'”应该是"Cranavvo"
。
【问题讨论】:
【参考方案1】:来自Lua PiL on tables
要表示记录,您可以使用字段名称作为索引。 Lua 支持 通过提供
a.name
作为语法糖a["name"]
。初学者的一个常见错误是将
a.x
与a[x]
混淆。首先 form表示a["x"]
,即以字符串"x"
为索引的表。
因此,当你尝试时:
game.Players.Username:BreakJoints()
Lua 将其解释为:
game["Players"]["Username"]:BreakJoints()
这当然是错的。如果您想使用不同的名称作为表的索引,请像这样使用它们:
local foo = "Cranavvo"
game.Players[foo]:BreakJoints()
但要提到的是Player 类没有BreakJoints 方法,您必须借助.Character 属性来获取字符model,如下所示:
local foo = "Cranavvo"
game.Players[foo].Character:BreakJoints()
另外要提到的是,如果同名的玩家不存在,代码会中断,而且角色可以为空,在这种情况下也会中断。因此,您需要添加一些错误处理。像这样:
local foo = "Cranavvo"
local Player = game.Players:findFirstChild(foo)
if Player ~= nil and Player.Character ~= nil then
Player.Character:BreakJoints()
end
【讨论】:
@ZombieSpy 感谢您提供额外信息 :)【参考方案2】:在 roblox 中执行此操作的正确方法是:
local Username = "Cranavvo"
local p = game.Players:FindFirstChild(Username)
if(p ~= nil) then
if(p.Character ~= nil) then
p.Character:BreakJoints()
end
end
【讨论】:
【参考方案3】:在你的代码被执行时仔细检查用户是否真的存在。
也应该是:
game.Players.Username:BreakJoints()
编辑:
我误读了您想要做的事情: 在
...Players.Username
lua 将 Username 解释为命名索引,并且不使用预先声明的 Username 变量。
如果你想访问一个动态名称的数组变量,你可以这样做:
game.Players[Username]:BreakJoints()
此外,在 roblox 中,您可以使用以下内容:
game.Players:GetPlayerByID(userId):BreakJoints()
【讨论】:
这只是我为 *** 做的一篇文章,例如我在脚本上的代码是正确的并链接到正确的库,只是我需要将“用户名”定义为“Cranavvo”,但它没有这样做。它认为“用户名”是库的名称。 我更新了答案,您需要以不同方式访问动态变量名称【参考方案4】:Lua 中的变量有时会让人很困惑。
例如,有 global 和 local 变量。
局部变量是操作结束后可以忘记/擦除的变量:local x = 2
全局变量是留在游戏/应用程序中不会被遗忘的变量,这对高分和其他简洁的东西很有用。 x = 2
(注意没有“local”声明)
【讨论】:
这与问题有什么关系?以上是关于表字段中的变量名不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Postgresql:对 plpgsql 中的临时表执行更新不起作用