1.下载安装包
去http://www.lua.org/ftp/,最新的是5.21版本,单击下载就Ok。
2.安装一些工具
终端运行
sudo apt-get install libreadline5
sudo apt-get install libreadline-gplv2-dev
3.安装
解压之前下载好的安装包,终端cd进入目录
运行
make linux sudo make install
Lua就装好了。
4.测试
直接在终端输入Lua,回车,就可以看到版本信息,Helloworld之要一行语句就搞定了,就像下面这样:
也可以写成单个文件来运行,例如求下面这个例子,求Fabnacci数列。
function fact( n ) if n==0 then return 1 else return n*fact(n-1) end end print("enter a number:") --read a number a=io.read("*number") print(fact(a))
终端运行,结果如下:
参考:Programming in lua 2rd
值类型与引用类型的区别
namespace _1 { class ValueClass //定义类 { public int value = 0; } class ValueAndRefType //定义类 { public static void Main() //方法 { int a = 0; //a的初始变量未整型0 int b = a; b = 10; ValueClass ref1 = new ValueClass(); //创建类对象ref1 ValueClass ref2 = ref1; //创建类对象ref2,并赋值ref1 ref2.value = 10; Console.WriteLine("Value:{0},{1}", a, b); //对变量ref2重新赋值 Console.WriteLine("Refs:{0},{1}", ref1.value, ref2.value); //通过ref2重新赋值,影响了ref1和ref2所引用对象 } } } 运行结果: Value:0,1 Refs:10,10
在这里例子中,大家看到对局部变量a、b初始化后,b重新赋值并没有影响a的值。a仍然是0.而当我们将ref2的值赋上
拆箱操作
本文分六部分介绍Android binder机制和结构; 理解和行文难免有误, 一切以代码为准.
转载请注明出处.
Android Binder机制之RefBase & smart pointer在组件技术中必然需要引用计数的机制,用于控制指针所指向的本端代理对象和所对应的远端进程内的组件对象的生命周期。
LPC通用行为和smart pointer
如同Windows COM二进制兼容跨进程接口调用机制,LPC(Local Procedure Call)三要素:
QueryInterface
AddRef/ReleaseRef
Method Invoke
另外,实现上对于本进程内的组件,要可以直接引用,这关乎运行效率。这也是LPC实现普遍要考虑的一个点(特别是用socket实现时)。
对于Android Binder Framework,Interface Query由ServiceManager负责,AddRef/ReleaseRef由RefBase计数负责;Method Invoke由对应Service的Interface和Binder负责。
正是因为组件有计数功能,smart pointer的“smart”才有了着落,即通过指针对象自身的生命周期来增减引用的组件的计数,从而控制组件的生命周期。
在Android中,android::RefBase及其派生类负责计数,而smart pointer(sp<T>和wp<T>)负责所引用对象的计数增减的调用。下面将分别从对象角度和指针角度来考察android binder需求而引入的计数机制。
RefBase和sp/wp的静态关系如下图(此图从网络引来):
计数的祖宗---基类RefBase和LightRefBase
实现计数的对象的类是RefBase和LightRefBase。绝大多数情况下的类是继承自RefBase。
RefBase虽然借助关联的嵌套类对象实现了强引用计数和弱引用计数,但是对外只表露出了增减强引用计数的方法(如incStrong、decStrong)。
LightRefBase的Light表现在只实现强引用计数,没有弱引用计数!LightRefBase主要用在OpenGL ES需要的FrameBuffer NativeWindow实现中。
RefBase的设计原则
1. 因为调用incStrong/decStrong的时候,需要相应地调用incWeak/decWeak,如果表露出incWeak/decWeak就需要外部遵循不同情景的调用规则,可能会导致计数的混乱,所以incWeak/decWeak尽量不对外使用,内部实现类维护。
2. incStrong/decStrong表露出来是因为有些情况,直接由普通指针调用,否则,都不应该表露出,而是应该sp<T>友元类访问即可。
3. RefBase既然需要对象的强引用计数和弱引用计数,由于强引用指针和弱引用指针的相互引用和相互赋值及弱引用提升为强引用,所以,为了设计的方便和运行的效率,强/弱引用计数及其操作的内部实现又不能过于独立。
4. 弱引用计数接口(android::RefBase::weakref_type)供弱引用计数实现使用,需要分离出来。
综上设计原则,于是有了Android RefBase的略显怪胎式的实现:
In frameworks/base/include/utils/RefBase.h
class RefBase
{
public:
void incStrong(const void* id) const;
void decStrong(const void* id) const;
void forceIncStrong(const void* id) const;
//! DEBUGGING ONLY: Get current strong ref count.
int32_t getStrongCount() const;
class weakref_type
{
public:
RefBase* refBase() const;