零基础入门,我应该学python,c++,lua其中的哪一个

零基础入门,我应该学python,c++,lua其中的哪一个,第1张

Python(英语发音:/ˈpaɪθən/), 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年,Python 源代码同样遵循 GPL(GNU General Public License)协议。Python语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C++重写,而后封装为Python可以调用的扩展类库。需要注意的是在您使用扩展类库时可能需要考虑平台问题,某些可能不提供跨平台的实现。

1编写一个简单的模块

Lua的模块是什么东西呢?通常我们可以理解为是一个table,这个table里有一些变量、一些函数

等等,这不就是我们所熟悉的类吗?

没错,和类很像(实际上我说不出它们的区别)。

我们来看看一个简单的模块,新建一个文件,命名为gamelua,代码如下:

复制代码 代码如下:

game = {}

function gameplay()

print("那么,开始吧");

end

function gamequit()

print("你走吧,我保证你不会出事的,呵,呵呵");

end

return game;

我们定义了一个table,并且给这个table加了两个字段,只不过这两个字段的值是函数而已。

至于如何使用模块,那就要用到我们之前介绍过的require了。

我们在main函数里这么使用:

复制代码 代码如下:

local function main()

ccFileUtils:getInstance():addSearchPath("src")

game = require("game");

gameplay();

end

注意,我们要require其他文件的时候,要把文件路径给设置好,否则会找不到文件。

因为我使用的是Cocos Code IDE,直接调用addSearchPath函数就可以了,我的gamelua文件是在src目录下的。

好了,运行代码,结果如下:

复制代码 代码如下:

[LUA-print] 那么,开始吧

OK,这就是一个很简单的模块,如果我们习惯了Java、C++等面向对象语言,那也可以简单地把模块理解为类。

2为以后的自己偷懒——避免修改每个函数中的模块名

假设我们想把刚刚的game模块改个名字,改成eatDaddyGame,那么,我们需要做以下两件事情:

1)修改gamelua的文件名

2)修改gamelua的内容,把所有的game改成eatDaddyGame

目前的gamelua函数还算少,就两个,实际上一个模块的函数肯定不会少的,那么,要这么去改这些函数,太烦了。

如果批量修改,又怕有哪个地方改错。

于是,我们可以这么偷懒:

复制代码 代码如下:

game = {}

local M = game;

function Mplay()

print("那么,开始吧");

end

function Mquit()

print("你走吧,我保证你不会出事的,呵,呵呵");

end

return M;

我们用一个局部变量M来代替了game,于是,以后我们只需要修改前面两个的game就可以了,函数部分的内容完全不需要去修改。

这个偷懒其实蛮有用的,某些情况下,修改越少,越安全~

3更进一步的偷懒——模块名参数

实际上,我们可以更加得偷懒,以后修改模块名,只需要修改模块的文件名就可以了,文件内容可以不管,具体怎么实现?

看代码:

复制代码 代码如下:

local M = {};

local modelName = ;

_G[modelName] = M;

function Mplay()

print("那么,开始吧");

end

function Mquit()

print("你走吧,我保证你不会出事的,呵,呵呵");

end

return M;

留意一下,这里有一个 local modelName = …

“…”就是传递给模块的模块名,在这里其实就是“game”这个字符串。

接着,有点微妙了,还记得之前介绍的全局环境_G吗?我们以”game”作为字段名,添加到_G这个table里。

于是,当我们直接调用game的时候,其实就是在调用_G["game"]的内容了,而这个内容就是这里的M。

能逻辑过来吗?就是这么简单,在你没有忘记_G的前提下~

4利用非全局环境制作更简洁和安全的模块

如果说,刚刚已经达到了我们作为高(ai)智(zhe)商(teng)人群的巅峰,那,你就太天真了。

巅峰就是要拿来超越的,还记得我们的非全局环境吗?就是那个setfenv函数。

我们来看看下面的代码:

复制代码 代码如下:

local M = {};

local modelName = ;

_G[modelName] = M;

setfenv(1, M);

function play()

print("那么,开始吧");

end

function quit()

print("你走吧,我保证你不会出事的,呵,呵呵");

end

return M;

我们把gamelua这个模块里的全局环境设置为M,于是,我们直接定义函数的时候,不需要再带M前缀。

因为此时的全局环境就是M,不带前缀去定义变量,就是全局变量,这时的全局变量是保存在M里。

所以,实际上,play和quit函数仍然是在M这个table里。

于是,我们连前缀都不用写了,这真是懒到了一个极致,简直就是艺术~

另外,由于当前的全局环境是M,所以, 在这里不需要担心重新定义了已存在的函数名,因为外部的全局变量与这里无关了。

当然,如果大家现在就运行代码,肯定会报错了。

因为我们的全局环境改变了,所以print函数也找不到了。

为了解决这个问题,我们看看第5条内容吧~

5解决原全局变量的无法找到的问题——方案1

第一个方法,就是我们之前介绍过的,使用继承,如下代码:

复制代码 代码如下:

local M = {};

local modelName = ;

_G[modelName] = M;

-- 方法1:使用继承

setmetatable(M, {__index = _G});

setfenv(1, M);

function play()

print("那么,开始吧");

end

function quit()

print("你走吧,我保证你不会出事的,呵,呵呵");

end

return M;

没错,使用__index元方法就能解决这个问题了,当找不到print等函数时,就会去原来的_G里查找。

6解决原全局变量的无法找到的问题——方案2

第二个方法更简单,使用一个局部变量把原来的_G保存起来,如下代码:

复制代码 代码如下:

local M = {};

local modelName = ;

_G[modelName] = M;

-- 方法2:使用局部变量保存_G

local _G = _G;

setfenv(1, M);

function play()

_Gprint("那么,开始吧");

end

function quit()

_Gprint("你走吧,我保证你不会出事的,呵,呵呵");

end

return M;

这种方法的缺点比较明显,那就是,每次调用print等函数时,都要使用_G前缀。

7解决原全局变量的无法找到的问题——方案3

第三个方法比较繁琐,使用局部变量把需要用到的其他模块保存起来,如下代码:

复制代码 代码如下:

local M = {};

local modelName = ;

_G[modelName] = M;

-- 方法3:保存需要使用到的模块

local print = print;

setfenv(1, M);

function play()

print("那么,开始吧");

end

function quit()

print("你走吧,我保证你不会出事的,呵,呵呵");

end

return M;

这种方法的缺点更明显了,所有用到的模块都要用局部变量声明一次,烦人。

但,就速度而言,第三种方案比第二种方案快,第二种方法又比第一种快。

但至于快多少,我也不知道,只是理论上~我也没测试。

8你就笑吧,但,我还想更加偷懒——module函数

本以为刚刚介绍的那些技巧已经够偷懒的吧?

但Lua似乎知道我们有多懒似的,它竟然把我们把这一切都自动完成了。

再来回忆我们刚刚为了偷懒而写的几句代码:

复制代码 代码如下:

local M = {};

local modelName = ;

_G[modelName] = M;

setmetatable(M, {__index = _G});

setfenv(1, M);

就这几句代码,其实我们可以忽略不写,因为,我们有module函数,它的功能就相当于写了这些代码。

我们修改一下gamelua的内容,如下代码:

复制代码 代码如下:

module(, packageseeall);

function play()

print("那么,开始吧");

end

function quit()

print("你走吧,我保证你不会出事的,呵,呵呵");

end

注意,前面的几行代码都没了,只留下了一个module函数的调用。

module函数的调用已经相当于之前的那些代码了。

而packageseeall参数的作用就是让原来的_G依然生效,相当于调用了:setmetatable(M, {__index = _G});

再次留意一下,代码末尾的return M也不见了,因为module函数的存在,已经不需要我们主动去返回这个模块的table了。

9结束

这篇结束的内容似乎有点多,我也写了一个多小时了。

其实我还省略不少东西,比如packageloaded,lua路径查找的规则等等。

因为这些Cocos Code IDE,或者说是Cocos2d-x lua,已经帮我们做了,我们不需要去管这些。

所以我就避重就轻了,啊不,是顾此失彼…不对~!反正,就是那个意思了~!

您可能感兴趣的文章:

Lua教程(十一):模块与包详解

Lua模块与包学习笔记

Lua中的模块(module)和包(package)详解

Lua的函数环境、包实例讲解

Lua调用自定义C模块

Lua中使用模块的一些基础知识

使用Lua编写Nginx服务器的认证模块的方法

在Lua中使用模块的基础教程

Lua极简入门指南(六):模块

Lua模块和模块载入浅析

解析Lua中的全局环境、包、模块组织结构

以上就是关于零基础入门,我应该学python,c++,lua其中的哪一个全部的内容,包括:零基础入门,我应该学python,c++,lua其中的哪一个、lua里有类似help的函数吗、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9810933.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存