LUA入门以及ipairs pairs的区别

Posted LANGZI7758521

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LUA入门以及ipairs pairs的区别相关的知识,希望对你有一定的参考价值。

-- 注释行
print("hello world!")

-- 局部变量
local i = 1

--全局变量
name = "iPanda"

print(type("Hello world"))      --> string
print(type(10.4*3))             --> number
print(type(print))              --> function
print(type(type))               --> function
print(type(true))               --> boolean
print(type(nil))                --> nil
print(type(type(X)))            --> string

print(type(a))

-- nil的删除作用
tab1 = { key1 = "val1", key2 = "val2", "val3" }
for k, v in pairs(tab1) do
    print(k .." - " .. v)
end

tab1.key1 = nil
for k, v in pairs(tab1) do
    print(k .. " - " .. v)
end

--nil 作比较时应该加上双引号 ":
print(type(X))
print(nil)
print(type(nil))
print(type("nil"))
print(type(X) == nil)--type(X)==nil 结果为 false 的原因是 type(X) 实质是返回的 "nil" 字符串,是一个 string 类型:
print(type(X) == "nil")
print(type(type(x)))

--boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是 false,其他的都为 true,数字 0 也是 true:
print(type(true))
print(type(false))
print(type(nil))

if false or nil then
    print("至少有一个是 true")
else
    print("false 和 nil 都为 false")
end

if 0 then
    print("数字 0 是 true")
else
    print("数字 0 为 false")
end

--number
print(type(2))
print(type(2.2))
print(type(0.2))
print(type(2e+1))
print(type(0.2e-1))
print(type(7.8263692594256e-06))

--在对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字:
print("2" + 6)

print("2" + "6")
print("2 + 6")
print("-2e2" * "6")
--print("error" + 1)

-- 字符创..连接
print("a" .. 'b')
print(157 .. 428)

--#长度
len = "www.baidu.com"
print(#len)
print(#"www.baidu.com")

--table  Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串。
local table = {}

local tbl2 = {"apple", "pear", "orange", "grape"}

a = {}
a["key"] = "value"
key = 10
a[key] = 22
a[key] = a[key] + 11
for k, v in pairs(a) do
    print(k .. " : " .. v)
end

--不同于其他语言的数组把 0 作为数组的初始索引,在 Lua 里表的默认初始索引一般以 1 开始。
local tbl = {"apple", "pear", "orange", "grape"}
for key, val in pairs(tbl) do
    print("Key", key)
end

a3 = {}
for i = 1, 10 do
    a3[i] = i
end
print(a[1])
a3["key"] = "val"
print(a3["key"])
print(a3["none"])

function factorial1(n)
    if n == 0 then
        return 1
    else
        return n * factorial1(n - 1)
    end
end
print(factorial1(5))
factorial2 = factorial1
print(factorial2(5))

function testFun(tab,fun)
    for k ,v in pairs(tab) do
        print(fun(k,v));
    end
end
tab={key1="val1",key2="val2"};
testFun(tab,
        function(key,val)--匿名函数
            return key.."="..val;
        end
)

a = 5               -- 全局变量
local b = 5         -- 局部变量

function joke()
    c = 5           -- 全局变量
    local d = 6     -- 局部变量
end

joke()
print(c,d)


do
    local a = 6     -- 局部变量
    b = 6           -- 对局部变量重新赋值
    print(a,b);     --> 6 6
end

print(a,b)      --> 5 6

--a, b = 10, 2*x       -->       a=10; b=2*x

--遇到赋值语句Lua会先计算右边所有的值然后再执行赋值操作,所以我们可以这样进行交换变量的值:
--x, y = y, x                     -- swap 'x' for 'y'
--a[i], a[j] = a[j], a[i]         -- swap 'a[i]' for 'a[j]'

a, b, c = 0, 1
print(a,b,c)             --> 0   1   nil

a, b = a+1, b+1, b+2     -- value of b+2 is ignored
print(a,b)               --> 1   2

a, b, c = 0
print(a,b,c)             --> 0   nil   nil

--a, b = f() -- f()返回两个值,第一个赋给a,第二个赋给b。

a, b = 0, 1
a, b = a+1, a+1
print(a,b)               --> 1   1
a, b = 0, 1
a, b = b+1, b+1
print(a,b)               --> 2   2
a, b = 0, 1
a = a+1
b = a+1
print(a,b)               --> 1   2

--while( true )
--do
--    print("循环将永远执行下去")
--end

--[ 0 为 true ]
if(0)
then
    print("0 为 true")
else
    print("0 为 false")
end

--[[ 函数返回两个值的最大值 --]]
function max(num1, num2)

    if (num1 > num2) then
        result = num1;
    else
        result = num2;
    end

    return result;
end
-- 调用函数
print("两值比较最大值为 ",max(10,4))
print("两值比较最大值为 ",max(5,6))

myprint = function(param)
    print("这是打印函数 -   ##",param,"##")
end

function add(num1,num2,functionPrint)
    result = num1 + num2
    -- 调用传递的函数参数
    functionPrint(result)
end
myprint(10)
-- myprint 函数作为参数传递
add(2,5,myprint)

function maximum (a)
    local mi = 1             -- 最大值索引
    local m = a[mi]          -- 最大值
    for i,val in ipairs(a) do
        if val > m then
            mi = i
            m = val
        end
    end
    return m, mi
end

print(maximum({8,10,23,12,5}))

function add(...)
    local s = 0
    for i, v in ipairs{...} do   --> {...} 表示一个由所有变长参数构成的数组
        s = s + v
    end
    return s
end
print(add(3,4,5,6,7))  --->25

function average(...)
    result = 0
    local arg={...}    --> arg 为一个表,局部变量
    for i,v in ipairs(arg) do
        result = result + v
    end
    print("总共传入 " .. #arg .. " 个数")
    return result/#arg
end

print("平均值为",average(10,5,3,4,5,6))

function f(...)
    a = select(3,...)  -->从第三个位置开始,变量 a 对应右边变量列表的第一个参数
    print (a)
    print (select(3,...)) -->打印所有列表参数
end

f(0,1,2,3,4,5)

do
    function foo(...)
        for i = 1, select('#', ...) do  -->获取参数总数
            local arg = select(i, ...); -->读取参数,arg 对应的是右边变量列表的第一个参数
            print("arg", arg);
        end
    end

    foo(1, 2, 3, 4);
end

array = {"Google", "Runoob"}

for key,value in ipairs(array)
do
    print(key, value)
end

--Lua中ipairs和pairs的区别详解
--区别一:ipairs遇到nil会停止,pairs会输出nil值然后继续下去
--区别二:ipairs并不会输出table中存储的键值对,会跳过键值对,然后顺序输出table中的值,遇到nil则会停止。
--而pairs会输出table中的键和键值对,先顺序输出值,再乱序(键的哈希值)输出键值对。
--这是因为,table在存储值的时候是按照顺序的,但是在存储键值对的时候是按照键的哈希值存储的,并不会按照键的字母顺序或是数字顺序存储。
--=》对于a来说,如果执行print(a[3]),输出的结果也会是Good。也就是说table并不会给键值对一个索引值。
--也就是说,ipairs知识按照索引值顺序,打印出了table中有索引的数据,没有索引值的不管。
--而pairs是先按照索引值打印,打印完成后再按照键值对的键的哈希值打印它的值。
local a = {"Hello", "World", a = 1, b = 2, x = 10, y = 20, "Good", nil, "Bye"}
 for i,v in ipairs(a) do
     print(v)
 end

print("------------")
for k,v in pairs(a) do
    print(k,v)
end

--所以,怎么顺序输出一个table里面的键值对?
local tab = {
    key1 = 1,
    key2 = 2,
    key3 = 3,
    key4 = 4,
    key5 = 5,
    key6 = 6,
    key7 = 7,
}

function getLen(tab)
    local len = 0
    for _,v in pairs(tab) do
        len = len + 1
    end
    return len
end

local key
for i=1,getLen(tab) do
    key = "key"..i
    print(key, tab[key])
end

以上是关于LUA入门以及ipairs pairs的区别的主要内容,如果未能解决你的问题,请参考以下文章

lua 中pairs 和 ipairs区别

Lua中pairs()和ipairs()的区别是啥?

Lua中ipairs和pairs的区别详解

lua中pairs和ipairs的区别

lua pairs和ipairs的区别

Lua中,泛型for循环遍历table时,ipairs和pairs的区别