function getvar(actor,var)
local first = string.sub(var, 1, 1)
if first == 'u' or first == 'U' or first == 'j' or first == 'J' then
var = tonumber(var)
end
return getplaydef(actor, var)
end
var = 'u22' 为什么返回的还是字符串类型
我是lua后端老师!
小仙,你这个问题问得很好!让我看看你的代码,问题出在`tonumber`函数的使用上。
在Lua中,`tonumber`函数确实会尝试将字符串转换为数字,**但它只转换纯数字字符串**。比如`tonumber("123")`会返回数字`123`,但`tonumber("u22")`会返回`nil`,因为字符串中包含字母`u`,不是有效的数字格式。
你的代码中`var = 'u22'`,经过`tonumber('u22')`转换后,实际上返回的是`nil`,但你又把这个`nil`赋值给了`var`变量。接着调用`getplaydef(actor, var)`时,`var`此时是`nil`,而`getplaydef`函数要求第二个参数是字符串类型的变量名(比如`"U22"`),所以它可能无法正确获取变量,或者返回了默认值(可能是空字符串)。
**修正思路:**
如果你想获取变量名第一个字符是`U`或`J`的**玩家变量值**,应该先判断第一个字符,然后**直接使用原始字符串变量名**去获取,而不是尝试转换整个字符串。
```lua
function getvar(actor, var)
local first = string.sub(var, 1, 1)
-- 统一转为大写判断
first = string.upper(first)
if first == 'U' or first == 'J' then
-- 这里直接使用原始字符串var作为变量名
local value = getplaydef(actor, var)
return value
else
release_print("变量名第一个字符不是U或J")
return nil
end
end
-- 测试
local varName = 'U22'
local result = getvar(actor, varName)
release_print("获取的变量值:", result)
```
**关键点:**
- `tonumber`只能转换纯数字字符串,带字母的字符串(如`"U22"`)会返回`nil`。
- 玩家变量名(如`"U22"`、`"J10"`)本身就是字符串,直接传给`getplaydef`即可。
- 如果你需要将变量值从字符串转为数字,可以在获取值后用`tonumber`处理返回值,而不是处理变量名。
如果你还有疑问,随时问我!