Lua基础知识入门

1 基础知识

标识符:标识符的定义和 C语言相同:字母和下划线_ 开头, 下划线_ + 大写字母一般是lua保留字, 如_VERSION
全局变量:默认情况下,变量总是认为是全局的,不需要申明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil

2 数据类型

数据类型:lua是动态型语言,变量不需要类型定义,直接赋值即可。 值可以存储在变量中,作为参数传递或者结果return
nil: 无效值, 在条件表达式中相当于false
boolean: true false, 注意: false 和 nil 看作是 false,其他的都为 true,数字 0 也是 true
number: 双精度类型的实浮点数 相当于double, 注意:Lua 默认只有一种 number 类型 – double(双精度)类型(默认类型可以修改 luaconf.h 里的定义)
string:字符串,由一对双引号或者单引号表示
funtcion: 由c或者lua编写的函数
userdata:表示任意存储在变量中的c数据结构
thread:表示执行的独立线路,用于执行协同程序
table:Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。
– 在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。

–可以使用type函数测试给定变量或者值的类型:
print(type(“Hello world”))
print(type(66))
print(type(‘66’))
print(type(“66”))
print(type(nil))

2.1 多重赋值

Lua可以对多个变量同时赋值,变量用逗号分开,赋值语句右边的值会依次赋给左边的变量

n = 1
a, b = 10, 2*n

2.2 交换变量

a = 34
b = 12
a, b = b, a
print(a, b) --输出:12   34

3 运算符

3.1 算数运算符

+ 加法
- 减法
* 乘法
/ 除法
% 取余,求出除法的余数
^ 乘幂,计算次方
- 负号,取负值

3.2 逻辑运算符

a = true
b = false
c = nilprint(a and b) -- 与  输出:false
print(a or b)  -- 或  输出:true
print(not a)   -- 非  输出:false

4 字符串相关

字符串的三种表示方式:

  1. 单引号间的一串字符
  2. 双引号间的一串字符
  3. [[…]] 间的一串字符, 支持换行

4.1 字符串操作

4.1.1字符串拼接: …

print("d"  ..  "cj")

4.1.2字符串转换

c = tostring(10) -- 数字 转 字符串 
print(c)d = tonumber("666") --字符串转数字,若转换失败返回nil
print(d)e = tonumber("abc")
print(e)

输出:
image.png

4.1.3 获取字符串长度

str = "dcj666"
print(#str)
print(#"dcj666")

输出:
image.png

5 函数

function lua_func_test(n)if 0 == n thenprint("0 == n")return 0else print("1 == n")return nend
end--这与上述是一样的
lua_func_test2 = function(n)if 0 == n thenprint("0 == n")return 0else print("1 == n")return nend
endret = lua_func_test(5)
print(ret)

输出:
image.png

函数支持多值返回:

function lua_func_test_02(a, b, c)return a, b, c
end
local i, j, k = lua_func_test_02(11, 22, 33)
print(i, j, k)

输出:
image.png

6 Table

lua的table中可以放置任意类型的数据:如number,string,function等

6.1 数字下标:从 1 开始

注意:lua中数组下标从 1 开始

a = {112,  {}, function () end, "dcj"}
print(a[1])
print(#a) --获取table元素个数a[1] = 666
print(a[1])table.insert(a, 2, "666")  --在a[2]处插入"666"
local s = table.remove(a, 2)  --删除a[2]这个元素, 并将删除的元素返回给s

输出:
image.png

function做table的元素

funcList = {function(a, b) return a*b end,function(a, b) return a-b end,function(a) return (-a) end
}
print(funcList[1](3,4))
print(funcList[2](3,4))
print(funcList[3](3))

输出:
image.png

6.2 table下标:指定下标

前面例子中的table都只是一些简单的List(列表),每个元素的下标都是自动从1排列的
实际上,Lua中,下标可以直接在声明时进行指定,像下面这样:

t = {6,7,8,9}
--上面和下面的代码等价
t = {[1] = 6,[2] = 7,[3] = 8,[4] = 9,
}--甚至你可以跳过某些下标
t = {[1] = 6,[3] = 7,[5] = 8,[7] = 9,
}
print(t[7]) --输出9--在声明后赋予元素值也是可以的
t = {}--空的table
t[101] = 10
print(t[101]) --输出10
t = {[1] = 123,[13] = "abc",[666] = "666",
}print("下标为1的元素:",t[1],type(t[1]))
print("下标为13的元素:",t[13],type(t[13]))
print("下标为666的元素:",t[666],type(t[666]))输出:
下标为1的元素:  123     number
下标为13的元素: abc     string
下标为666的元素:        666     string

6.3 字符串做下标

前面学习的table下标都是数字,在lua中,下标也可以是字符串:

t = {a1 = "aa",["666"] = "666", -- 666 = "666", 这样会报错["apple"] = 10,banana = 12,pear = 6,
}
--使用["下标"] = 值  和  下标 = 值  都是正确写法, 当第二种方式有歧义时,应该用第一种方式t["new"] = "new values" -- 也可以新增--可以用下面两种方式访问:
print(t["apple"]) --输出10
print(t.apple) --输出10print(t["666"]) --输出666
--print(t.666) --报错print(t["banana"]) --输出12
print(t.banana) --输出12print(t["new"]) --输出new values
t = {apple = {price = 7.52,weight = 2.1,},banana = {price = 8.31,weight = 1.4,year = '2018'},year = '2019',{price = 6.21,weight = 2.5,},
}print(t.price,                --输出nilt.apple.price,          --输出7.52t.banana.weight,        --输出1.4t.year,                 --输出2019t[1].price,             --输出6.21t[1].weight             --输出2.5
)print(  t["price"],             --输出nilt["apple"]["price"],    --输出7.52t["banana"]["weight"],  --输出1.4t["year"]               --输出2019
)

7 全局表 _G

lua中所有的全局变量都在** _G** 这个table中
例如定义一个全局变量a, 在_G这个table中打印出来:

dcj = 666;
print(_G["dcj"])

table自身也是个全局变量,也在_G中, 并且table.insert中的insert函数是table的下标,也可以将insert打印出来:

print(_G["table"])
print(_G["table"]["insert"])

输出:
image.png

8 boolean类型

注意:lua中只有false和nil表示假, 其余都为真(0也表示真)

a = true
b = false
c = nulprint(1 < 2)
print(1 > 2)
print(1 >= 2)
print(1 <= 2)
print(1 == 2)
print(1 ~= 2)  --  注意:~=表示不等于print(a and b) -- 与 
print(a or b)  -- 或
print(not a)   -- 非

输出:
image.png

b = 1
print(b > 10 and "yes" or "no")b = 11
print(b > 10 and "yes" or "no")

输出:no
yes

9 分支判断

a = 2if a == 1 thenprint("a == 1")
elseif a == 2 thenprint("a == 2")
elseif a == 3 thenprint("a == 3")
elseprint(a)
endif 0 thenprint("0 is true")
end

输出:
a == 2
0 is true

10 循环

10.1 for循环

image.png
临时变量名可以直接在代码区域使用(但不可更改),每次循环会自动加步长值,并且在到达结束值后停止循环。

for i = 1, 10, 2  do  -- 1表示循环储值,10表示结束值, 2表示步长, i的作用域仅仅在for循环内部print(i)
endprint(i) -- 输出nil,i的作用域仅仅在for循环内部

10.2 while循环

local n = 10while n >= 1 doif n==5 thenbreak --跳出循环endprint(n)n = n - 1   -- lua 不支持 n-- 这种操作
end

输出:
image.png

11 迭代器

pairs和ipairs的区别:
:::info
:都是能遍历集合(表、数组),两者均优先按顺序输出没有key的值;
:::
:::info
:对于有key的集合:
ipairs从第一个数字key开始,依次输出所有的key+1的键值,遇到字符下标并不会结束遍历,只是不输出而已,如果遇到nil则退出;
pairs无序输出字符类型key或者数字类型key的键值,遇到nil不输出,但不会停止遍历;
:::

11.1 ipairs

t = {"aa", "bb", "cc", "dd", "ee"}for i = 1, #t  do  --从下标1开始,到下标#t结束(#t表示t的元素个数)print(i, t[i])
end--针对数字下标的数组,可以使用ipairs迭代器
--等同于下面
for i, j  in ipairs(t)  do  -- i表示下标, j存放下标i对应的值print(i, j)
end

输出:
image.png

t = {[1] = "aaaaaa",[2] = "bbbbbbb",[3] = "ccccccc",[5] = "ddddddddd"  --下标不连续,t[4]为nil,遇到nil会自动停止
}for i, j  in ipairs(t)  do  -- i表示下标, j表示下标i对应的值print(i, j)
endfor i, j  in pairs(t)  do  -- i表示下标, j表示下标i对应的值print(i, j)
end

输出:
image.png
结论:
1、ipairs会按照key的顺序输出数据,遇到不连续的数据停止输出;
2、pairs会无序输出所有数据;

table = { [3] = "test3",["test"] = "val1","val3" ,[4] = "val2","val4"
}
print("-----------ipairs----------------")
for k,v in ipairs(table) doprint(k,v)
end
print("-----------pairs----------------")
for k,v in pairs(table) doprint(k,v)
end

image.png
结论:
1、pairs和ipairs均优先输出没有key的value;
2、pairs会输出所有的数据,不带key的值按顺序输出,带key的值无序输出;
3、ipairs会跳过字符串的key,按顺序输出数字型key的值;

table = { [6] = "test3",["test"] = "val1","val3" ,[11] = "val2",nil,"val4"
}
print("-----------ipairs----------------")
for k,v in ipairs(table) doprint(k,v)
end
print("-----------pairs----------------")
for k,v in pairs(table) doprint(k,v)
end

输出:
image.png
结论:
1、ipairs遇到nil会停止输出;
2、pairs遇到nil不会停止输出;

11.2 pairs

针对字符串做数组下标的数组迭代,使用pairs迭代器

t = {apple = "aa",banana = "bb",water = "cc",
}
for i, j  in pairs(t)  do  -- i表示下标, j存放下标i对应的值print(i, j)
end

输出:
image.png

12 多文件调用require

require:

  1. 运行指定文件
  2. 末尾不带拓展名
  3. 目录层级用“.”分隔
  4. 只会运行一次
  5. 从package.path中的路径里查找

13 元表、面向对象

t =     {a = 66,
}
mt = {__add = function(a, b)return a.a + bend,__index = function(table, key)return 123end
}
setmetatable(t, mt)
print(t+1) --输出67
print(t["dcj"]) --访问一个不存在的下标,会调用__index元方法, 输出123t = {a = 66,
}
mt = {__add = function(a, b)return a.a + bend,__index = {abc = 123,def = 456,},
}
setmetatable(t, mt)
print(t["dcj"]) --__index也可以是个table, 在__index也可以是个table找“dcj”元素,输出nil
print(t["abc"]) --__index也可以是个table, 在__index也可以是个table找“abc”元素, 输出123
print(t["def"]) --__index也可以是个table, 在__index也可以是个table找“def”元素, 输出456

image.png

13.1 语法糖:

t = {a = 66,add = function(tab, sum)tab.a = tab.a + sumend,
}t:add(10) -- 等价于 t.add(t, 10), 输出:76
print(t.a)

13.2 面向对象

需要好好理解!!!

bag = {}
bagmt = {put = function(t, item)table.insert(t.items, item)end,take = function(t)return table.remove(t.items, item)end,list = function(t)return table.concat(t.items, ", ")end,clear = function(t)t.items = {}end,
}
bagmt["__index"] = bagmt
function bag.new()local t = {items  = {}}setmetatable(t, bagmt) --当调用t中不存在的函数的时候,就回去t的metatable中去找return t
end--bag.new()函数中会新建一个表t,t设置了元表bagmt, bagmt中有四个元方法(put,take,list,clear)
--由于b中没有put这些方法,所以回去bagmt中找
local b = bag.new()
b:put("apple1") --等价于b.put(b, "apple1"), 将"apple1"放入b的items表中 
b:put("apple2")
b:put("apple3")
b:put("apple4")print(b:take())print(b:list())

14 数据打包和解包

aaa = 0x11223344
bbb = 0x55667788data = string.pack(">LL", aaa, bbb)  --数据打包print("len:", #data)for i=1, #data doprint(i, data:byte(i))
enda, b = string.unpack(">LL", data)  --数据解包
str_a = string.format("0x%x", a)
str_b = string.format("0x%x", b)print("str_a: ", str_a)
print("str_b: ", str_b)

输出:
image.png

15 C语言与lua的相关调用

15.1 C语言中调用lua

c代码只需要编译一次,lua可以随时改动;因为lua是动态语言。嵌入lua的好处是c只需要写一次代码,编译一次程序,所有的变化都可以通过修改lua的代码.
main.c 中调用math.lua中的函数

/** @Descripttion: xx模块* @Author: cjDong* @Date: 2024-07-15 11:30:05* @LastEditors: cjDong* @LastEditTime: 2024-07-17 14:07:04*/#include <stdio.h>#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"static int call_func(lua_State *L, const char* funcname, int x, int y)
{int ret;lua_getglobal(L, funcname); // 查找lua文件中的全局函数,并压入虚拟栈/* 压栈,传入参数 */lua_pushnumber(L, x);lua_pushnumber(L, y);lua_call(L, 2, 1); /* 执行函数,lua_call 的参数中第二个是参入参数个数,第三个是返回值个数 *//* 取出返回值 */ret = (int)lua_tonumber(L, -1);/*清除返回值的栈*/lua_pop(L, 1);return ret;
}int main(int argc, char *argv[])
{lua_State *L = luaL_newstate();  /* 创建lua虚拟机 */luaL_openlibs(L);     /* 加载lua库,比如math库、table库等 *//* 加载lua文件到c语言内存中,进行语法检查,不会编译 */luaL_dofile(L, "math.lua");/* 调用C函数,这个里面会调用lua函数 */call_func(L, "add", 2, 3);call_func(L, "sub", 2, 3);call_func(L, "mul", 2, 3);call_func(L, "div", 2, 3);/* 清除Lua */lua_close(L);return 0;
}
function add(x, y)print("lua: add function\r\n")return x + y
endfunction sub(x, y)print("lua: sub function\r\n")return x - y
endfunction mul(x, y)print("lua: mul function\r\n")return x * y
endfunction div(x, y)print("lua: div function\r\n")return x / y
end
#!/bin/bashgcc  -o out main.c -llua -ldl -lm./out

15.2 lua中调用c语言

Q:Lua调用C函数的两种方式?
A:
1、程序主体在C中运行,C函数注册到Lua中。C调用Lua,Lua调用C注册的函数,C得到函数的执行结果。
2、程序主体在Lua中运行,C函数作为库函数供Lua使用。
第一种方式看起来很罗嗦,也很奇怪。既然程序主体运行在C中,而且最终使用的也是C中定义的函数,那么为何要将函数注册给Lua,然后再通过Lua调用函数呢?
相比于第一种方式,第二种方式使用的更加普遍。
一个Lua库(Lua本身所提供的库)实际上是一个定义了若干Lua函数的”chunk”,这些函数通常作为”table”的域来保存。一个C库(C语言编写,注册给Lua使用的库)的实现方式类似于Lua库的实现方式。首先C库中定义提供给Lua使用的函数,其次还需要一个“特殊函数”,它的作用是注册所有C库中的函数,并将它们存储在适当的位置(类似于Lua库中的函数作为”table”的域来保存)。
Lua可以调用C库中的函数,就是通过这个注册的过程实现的。一旦C函数注册到Lua中,Lua就可以直接通过C函数的引用获取到C函数的地址(这也是我们注册的意义,将C函数的地址提供给Lua)。换句话说,一旦C函数注册,Lua调用他们不依赖于函数名,”package”位置,或者是可见规则。
以上两种方式下面都会列举对应的例子,理解第一种方式,将有助于你理解第二种方式的实现流程。

Q:从Lua中调用C所遵循的规则?
A:当C调用Lua函数的时候,必须遵循一些简单的协议来传递参数和获取返回结果。同样的,从Lua中调用C函数,也必须遵循一些协议来传递参数和获得返回结果。此外,从Lua调用C函数我们必须注册函数,也就是说,我们必须把C函数的地址以一个适当的方式传递给Lua解释器。
任何在Lua中注册的C函数必须有同样的原型,
typedef int (*lua_CFunction) (lua_State *L); // 定义在"lua.h"中。
被注册的C函数接收一个单一的lua_State类型的参数,同时返回一个表示返回值个数的数字。函数在将返回值入栈之前无需清理栈,在函数返回之后,Lua会自动清除栈中返回结果下面的所有内容。

15.2.1 方式1:程序主体在C中运行

该方式看起来很罗嗦,也很奇怪。既然程序主体运行在C中,而且最终使用的也是C中定义的函数,那么为何要将函数注册给Lua,然后再通过Lua调用函数呢?

15.2.2 方式2:程序主体在Lua中运行

该方式使用的更加普遍

#include <stdio.h>
#include <math.h>
#include <stdarg.h>
#include <stdlib.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>/* 所有注册给Lua的C函数具有* "typedef int (*lua_CFunction) (lua_State *L);"的原型。*/
static int l_sin(lua_State *L)
{   // 如果给定虚拟栈中索引处的元素可以转换为数字,则返回转换后的数字,否则报错。double d = luaL_checknumber(L, 1);lua_pushnumber(L, sin(d));  /* push result *//* 这里可以看出,C可以返回给Lua多个结果,* 通过多次调用lua_push*(),之后return返回结果的数量。*/return 1;  /* number of results */
}/* 需要一个"luaL_Reg"类型的结构体,其中每一个元素对应一个提供给Lua的函数。* 每一个元素中包含此函数在Lua中的名字,以及该函数在C库中的函数指针。* 最后一个元素为“哨兵元素”(两个"NULL"),用于告诉Lua没有其他的函数需要注册。*/
static const struct luaL_Reg mylib[] = {{"mysin", l_sin},{NULL, NULL}
};/* 此函数为C库中的“特殊函数”。* 通过调用它注册所有C库中的函数,并将它们存储在适当的位置。* 此函数的命名规则应遵循:* 1、使用"luaopen_"作为前缀。* 2、前缀之后的名字将作为"require"的参数。*/
extern int luaopen_mylib(lua_State* L)
{/* void luaL_newlib (lua_State *L, const luaL_Reg l[]);* 创建一个新的"table",并将"mylib"中所列出的函数注册为"table"的域。*/ luaL_newlib(L, mylib);return 1;
}
--[[ 这里"require"的参数对应C库中"luaopen_mylib()"中的"mylib"。C库就放在"main.lua"的同级目录,"require"可以找到。
]]local mylib = require "mylib"-- 结果与上面的例子中相同,但是这里是通过调用C库中的函数实现。
print(mylib.mysin(3.14 / 2))    --> 0.99999968293183
gcc math.c -fPIC -shared -o mylib.so -Walllua main.lua

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/378861.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

河南萌新联赛2024第(一)场:河南农业大学

A.造数 题目&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/86639/A 思路&#xff1a; 签到题&#xff0c;特判如果n0&#xff0c;输出0&#xff0c;如果n1或2&#xff0c;输出1&#xff1b;while循环&#xff0c;首先如果n%2!0&#xff0c;那么s&…

基于Web的特产美食销售系统的设计与实现

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

Spring Web MVC(常用的注解@RequestMapping,@RequestParam,@RequestBody等)

一、Spring MVC spring的启动类 启动类是看这个 SpringBootApplication 注解&#xff0c;而不是 类的名字 这个注解在哪&#xff0c;哪个类就是启动类 1.MVC思想 举例 二、Spring MVC mvc 是一种思想&#xff0c;而spring mvc是对mvc思想的一种实现。全称是 spring web mvc…

笔记 2 : 课本第 3 章开始,记录 arm 的汇编指令的格式

&#xff08;13&#xff09; 介绍 arm 中的第一个汇编指令的用法 mov &#xff1a; &#xff08;14&#xff09;立即数的概念&#xff1a; &#xff08;15&#xff09; 汇编中的移位写法&#xff1a; 举例 &#xff1a; &#xff08;16&#xff09; 学习一个新的指令 cmp &a…

【大型实战】企业网络实验(华为核心交换、ESXI7.0vmware虚拟机、DHCP中继、服务端网络及用户端网络配置)

需求 实验 vmware网络配置&#xff08;企业内部一般为ESXI&#xff09; 这样服务器虚拟机使用192.168.200.X网段才能与用户侧互通 vmware虚拟机配置&#xff08;DHCP服务器网络配置&#xff09; 打开网络管理页面 nmtui重置一下网络连接&#xff08;重启网卡&#xff09; …

ubuntu24.04 linux bcm94352hmb 无线网卡(带蓝牙功能)无法连接蓝牙设备的解决办法

ubuntu24.04 linux bcm94352hmb 无线网卡&#xff08;带蓝牙功能&#xff09;无法连接蓝牙设备的解决办法 问题描述 小本是自己换装的bcm94352hmb&#xff0c;现在跑不动黑苹果了&#xff0c;换装ubuntu&#xff0c;该网卡在黑苹果上和windows上都能正常工作&#xff0c;到了…

Go语言中的并发

简单介绍go中的并发编程. 涉及内容主要为goroutine, goroutine间的通信(主要是channel), 并发控制(等待、退出). 想查看更多与Go相关的内容, 可以查看我的Go编程栏目 Goroutine 语法 在一个函数调用前加上go即可, go func(). 语法很简单, 可以说是并发写起来最简单的程序语言…

Mongodb多键索引中索引边界的混合

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第93篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…

linux进程——概念理解与PCB

前言&#xff1a;本篇讲解Linux进程概念相关内容。 操作系统被称为计算机世界的哲学&#xff0c; 可以见得操作系统的知识并不好理解。 对于这篇进程概念的讲解&#xff0c; 博主认为&#xff0c; 如果没有一些前置知识的话&#xff0c;里面的有些概念并不好理解。 但是如果学习…

TDesign组件库日常应用的一些注意事项

【前言】Element&#xff08;饿了么开源组件库&#xff09;在国内使用的普及率和覆盖率高于TDesign-vue&#xff08;腾讯开源组件库&#xff09;&#xff0c;这也导致日常开发遇到组件使用上的疑惑时&#xff0c;网上几乎搜索不到其文章解决方案&#xff0c;只能深挖官方文档或…

防溺水预警系统引领水域安全新篇章

一、系统概述 随着人们对水域活动的需求增加&#xff0c;溺水事故频发&#xff0c;给人们的生命安全带来了严重威胁。然而&#xff0c;如今&#xff0c;一项创新科技正在以强大的功能和无限的潜力引领着水域安全的新篇章。智能防溺水预警系统&#xff0c;作为一种集成了智能感知…

文心一言:如何备考软考架构师

提问&#xff1a;软考高级:架构师指导&#xff0c;有哪些考点、重点考点有哪些&#xff1f;需要如何备考&#xff1f;案例分析题如何做&#xff1f;论文如何写&#xff1f; 文心一言回答1700字如下&#xff1a; 针对软考高级架构师的考试&#xff0c;以下是对考点、重点考点、备…

MongoDB自学笔记(三)

一、前文回顾 上一篇文章中我们学习了更新操作&#xff0c;以及讲解了部分的更新操作符&#xff0c;今天我们继续学习剩余的更新操作符。 二、更新操作符 1、$rename 语法&#xff1a;{ $rename: { < field1 >: < newName1 >, < field2 >: < newName2…

JDK、JRE、JVM的区别java的基本数据类型

说一说JDK、JRE、JVM的区别在哪&#xff1f; JDK&#xff1a; Java Delopment kit是java工具包&#xff0c;包含了编译器javac&#xff0c;调试器&#xff08;jdb&#xff09;以及其他用于开发和调试java程序的工具。JDK是开发人员在开发java应用程序时候所需要的的基本工具。…

Linux - 基础开发工具(yum、vim、gcc、g++、make/Makefile、git、gdb)

目录 Linux软件包管理器 - yum Linux下安装软件的方式 认识yum 查找软件包 安装软件 如何实现本地机器和云服务器之间的文件互传 卸载软件 Linux编辑器 - vim vim的基本概念 vim下各模式的切换 vim命令模式各命令汇总 vim底行模式各命令汇总 vim的简单配置 Linux编译器 - gc…

R语言实现SVM算法——分类与回归

### 11.6 基于支持向量机进行类别预测 ### # 构建数据子集 X <- iris[iris$Species! virginica,2:3] # 自变量&#xff1a;Sepal.Width, Petal.Length y <- iris[iris$Species ! virginica,Species] # 因变量 plot(X,col y,pch as.numeric(y)15,cex 1.5) # 绘制散点图…

[Redis]典型应用——缓存

什么是缓存 缓存&#xff08;Cache&#xff09;是一种用于临时存储数据的机制&#xff0c;目的是提高数据访问速度和系统性能。 核心思路就是把一些常用的数据放到触手可及(访问速度更快)的地方&#xff0c;方便随时读取 缓存是一个相对的概念&#xff0c;比如说&#xff0c…

uniapp转小程序,小程序转uniapp方法

&#x1f935; 作者&#xff1a;coderYYY &#x1f9d1; 个人简介&#xff1a;前端程序媛&#xff0c;目前主攻web前端&#xff0c;后端辅助&#xff0c;其他技术知识也会偶尔分享&#x1f340;欢迎和我一起交流&#xff01;&#x1f680;&#xff08;评论和私信一般会回&#…

数据结构day2

一、思维导图 内存分配 二、课后习题 分文件编译 //sys.h #ifndef TEST_H #define TEST_H #define MAX_SIZE 100//定义学生类型 typedef struct Stu {char name[20]; //姓名int age; //年龄double score; //分数 }stu;//定义班级类型 typedef struct Class {struct …

给Wordpress添加评分功能到评论表单

今天要 给你的 Wordpress 添加评分功能到评论表单 吗&#xff1f; 评分功能效果图 什么类型的网站需要评分&#xff1f; 资源站教程站其他&#xff0c;我也没想到。。。 但我这个网站&#xff0c;因为是电影类的网站&#xff0c;好像还是有点需要的&#xff0c;所以&#xf…