血のばら
微软为Azure Cloud添加了Java程序包
展开Biu

据外媒Infoworld报道,微软的操作策略团队的高级项目经理Martin Sawicki上周说,6月份Eclipse发布的Windows Azure Java插件CTP(社区技术预览)其最终目的是帮助Eclipse的Azure用户构建和配置Java应用程序部署。

Sawicki在博客中还说道,请关注他们的最新版本和给予他们建议,帮助他们的Java开发人员使Windows Azure cloud的优势更进一步”。

星期二Sawicki在一封电子邮件中回应:“其实有许多方法去构建软件部署包到Windows Azure,包括视觉工作室和命令line-based工具。他们相信对于Java开发者来说,他们提供的是最简单的Eclipse插件。他们已收到来自开发人员强烈的回应并把这些建议作为很好学习工具去明白如何有助于提供Windows Azure cloud。”

CTP是在3月和4月发布的第一个版本和第二个版本,6月份发布了CTP的第三个版本。

Sawicki说他们将继续更新这些工具,并在Windows Azure的更新中提供使用。

[查看全文]
vtuqpfiy
这里好冷清。。发个JAVA经典报数问题数组方法解答
展开Biu

学校老师给出的题。。我想了好久才想出来 问题是这样的 : 有100个人报数。。每逢7的倍数就出列。。直到队列里剩下50个人为止,问哪些人出列了?

public class baoshu {

public static void main(String[] args) {

boolean[] bairen = new boolean[100];

int next = 1;

int index = 0;

int shengyu = 100;

while (shengyu > 50) {

if (bairen[index] == false) {

if (next == 7) {

bairen[index] = true;

--shengyu;

next = 1;

System.out.println((index + 1));

} else {

next++;

}

}

index++;

if (index == 100) {

index = 0;

}

}

}

}

[查看全文]
xiaowuhello
內置了一个非常強劲的防火牆
展开Biu

1. 引言

CentOS 內置了一个非常強劲的防火牆,统称为 iptables,但更正确的名称是 iptables/netfilter。iptables是一个用戶空间的模块。作为用戶,你在命令行就是通过它将防火牆规则放进缺省的表裡。netfilter 是一个核心模块,它內置於內核中,进行实际的过滤。iptables 有很多前缀图像界面可以让用戶新增或定义规则,但它们很多时不及使用命令行般有灵活性,而且限制用戶了解实际发生的事情。我们将会学习 iptables 的命令行界面。

在我们正式应付 iptables 前,我们必须对它的运作有一个基本的理解。iptables 利用到 IP 地址、协议(tcp、udp、icmp)及端口这些概念。我们不需要成为这些方面的专家(因为我们可以找到所需的信息),但对它们有一般的理解会有帮助。

iptables 将规则放进缺省的规则链(INPUT、OUTPUT 及 FORWARD),而所有流量(IP 压缩)都会被相关的规则链检查,根据当中的规则判断如何处理每个压缩,例如:接纳或丟棄它。这些动作称为目标,而最常见的两个缺省目标就是 DROP 来丟棄压缩;或 ACCEPT 来接纳压缩。

规则链

我们可以在过滤表的 3 条缺省规则链內加入规则,来处理通过这些规则链的压缩。它们分別是:

* INPUT - 所有以主机为目的地的压缩。

* OUTPUT - 所有源自主机的压缩。

* FORWARD - 这些压缩的目的地或来源地都不是主机,但路经主机(由它选路)。假若你的主机是一个路由器,这条规则链将会被应用。

我们将会花费最多时间处理 INPUT 规则链,借以过滤进入我们的机器的压缩 —— 亦即是将坏蛋拒诸门外。

规则是以列表的方式被加进每条规则链。每个压缩会被头一条规则开始检查,才至最后一条。假若压缩与其中一条规则吻合,相应的动作便会被执行,例如接纳(ACCEPT)或丟棄(DROP)压缩。一但有吻合的规则,这个压缩便会按照规则来处理,而不再被规则链內的其它规则所检查。假如压缩通过所有检查而不符合任何规则链內的任何一条规则,那应这条规则链的缺省动作将会被执行。这就是所谓的缺省政策,可以设置为接纳(ACCEPT)或丟棄(DROP)压缩。

规则链拥有缺省政策这个概念带来两个基本的可能性,而我们必须考虑它们才能決定如何组织我们的防火牆。

1. 我们可以缺省一个政策来丟棄(DROP)所有压缩,然后刻意加入规则来接纳(ACCEPT)源自被信任的 IP 地址的压缩,或者打开那些提供服务的端口,如:bittorrent、FTP 服务器、网页服务器、Samba 文件服务器等。

又或者,

2. 我们可以缺省一个政策来接纳(ACCEPT)所有压缩,然后刻意加入规则来拦截(DROP)来自有问题的 IP 地址或系列的压缩,也或者阻止压缩进出只作私人用途或未提供服务的端口。

普遍来說,第一个方法多数用在 INPUT 规则链,因为我们会希望控制哪些东西可以访问我们的机器;而第二个方法多数用在 OUTPUT 规则链,因为我们多数信赖那些离开(源自)我们机器的压缩。

2. 準备开始

在命令行上使用 iptables 需要 root 的权限,因此你必须化身为 root 用戶来做下面的事情。

[attachment:ArtWork/WikiDesign/icon-admonition-attention.png]

注意: 我们将会停用 iptables 及复位你的防火牆规则,因此假若你依赖你的 Linux 防火牆作为第一道防線,请特別留意这点。

iptables 应该缺省被安装在所有 CentOS 3.x、4.x 及 5.x 上。你可以这樣来检查 iptables 是否已安装在你的系统上:

$ rpm -q iptables

iptables-1.3.5-1.2.1

要知道 iptables 是否正在运作中,我们可以检查 iptables 这个模块是否已被装入,並利用 -L 这个选项来查看活动的规则:

# lsmod | grep ip_tables

ip_tables 29288 1 iptable_filter

x_tables 29192 6 ip6t_REJECT,ip6_tables,ipt_REJECT,xt_state,xt_tcpudp,ip_tables

# iptables -L

Chain INPUT (policy ACCEPT)

target prot opt source destination

RH-Firewall-1-INPUT all -- anywhere anywhere

Chain FORWARD (policy ACCEPT)

target prot opt source destination

RH-Firewall-1-INPUT all -- anywhere anywhere

Chain OUTPUT (policy ACCEPT)

target prot opt source destination

Chain RH-Firewall-1-INPUT (2 references)

target prot opt source destination

ACCEPT all -- anywhere anywhere

ACCEPT icmp -- anywhere anywhere icmp any

ACCEPT esp -- anywhere anywhere

ACCEPT ah -- anywhere anywhere

ACCEPT udp -- anywhere 224.0.0.251 udp dpt:mdns

ACCEPT udp -- anywhere anywhere udp dpt:ipp

ACCEPT tcp -- anywhere anywhere tcp dpt:ipp

ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED

ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh

REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

从上面我们可看见缺省的规则,与及访问 SSH 服务用的规则。

如果 iptables 並未被执行,你可以这樣啟用它:

# system-config-securitylevel

3. 创建一组简单的规则

[attachment:ArtWork/WikiDesign/icon-admonition-attention.png]

注意: 此刻我们将会清除缺省的规则集。如果你是通过 SSH 远程连接到一台服务器来进行学习,你有可能会将自己拒诸这台机器之外。你必须将缺省的输入(input)政策改为接纳(accept),然后才清除现有规则,接著你要预先加入一条容许你自己访问机器的规则,避免你将自己封锁在外。

我们会採用一个以样例为本的方法来查看 iptables 的不同指令。在首个样例中,我们会创建一组简单的规则来设置一个「状态压缩检验」(SPI)防火牆,容许对外的连接但拦截一切无用的对內连接:

# iptables -P INPUT ACCEPT

# iptables -F

# iptables -A INPUT -i lo -j ACCEPT

# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# iptables -P INPUT DROP

# iptables -P FORWARD DROP

# iptables -P OUTPUT ACCEPT

# iptables -L -v

你应该得到这樣的输出:

Chain INPUT (policy DROP 0 packets, 0 bytes)

pkts bytes target prot opt in out source destination

0 0 ACCEPT all -- lo any anywhere anywhere

0 0 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED

0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh

Chain FORWARD (policy DROP 0 packets, 0 bytes)

pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)

pkts bytes target prot opt in out source destination

现在让我们逐一看看以上的 8 个指令,並理解我们实际做了甚麼:

1.

iptables -P INPUT ACCEPT 假如利用远程连接,我们必须临时将 INPUT 链的缺省政策改为 ACCEPT,否则当我们清除现有的规则集时,便会将自己封锁在服务器之外。

2.

iptables -F 我们利用 -F 选项来清除一切现存的规则,好让我们能夠在崭新的状态下加入的规则。

3.

iptables -A INPUT -i lo -j ACCEPT 现在是时候加入一些规则了。我们利用 -A 选项来附加(新增)规则到某条链,而这裡所指的是 INPUT 链。接著我们利用 -i 选项(interface「界面」之意)来指定那些符合或来自 lo(localhost、127.0.0.1)界面的压缩。最后我们 -j(jump「跳至」)符合这条规则的目标动作:在这裡是 ACCEPT。所以这条规则会导致所有转至 localhost 界面的对內压缩获得接纳。一般来說这是必须的,因为很多软件预期能夠与 localhost 适配器沟通。

4.

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 这是担负起大部份工作的规则,而我们再一次将它加进(-A)INPUT 链內。这裡我们利用 -m 选项来装入一个模块(state)。state 模块能夠查看一个压缩並判断它的状态是 NEW、ESTABLISHED 抑或 RELATED。NEW 指內进的压缩属於不是由主机啟主导的新增连接。ESTABLISHED 及 RELATED 指內进的压缩隸属於一条现存的连接,或者与现存的连接有关系。

5.

iptables -A INPUT -p tcp --dport 22 -j ACCEPT 现在我们加入一条规则来容许 SSH 通过 tcp 端口 22 来连接。这樣做是要防止我们连接到远程系统的 SSH 连接意外地被封销。我们稍后会更详细解释这条规则。

6.

iptables -P INPUT DROP 这个 -P 选项设置某条规则链上的缺省政策。我们现在可以将 INPUT 链的缺省政策改为 DROP。意思就是,不符合任何一条规则的对內压缩将会被丟棄。要是我们通过 SSH 远程连接而沒有加入上一条规则,此刻我们便会被封锁於系统之外。

7.

iptables -P FORWARD DROP 同樣地,在这裡我们将 FORWARD 链的缺省政策设为 DROP,因为我们並不是用计算机作为路由器,所以理应沒有任何压缩路经它。

8.

iptables -P OUTPUT ACCEPT 而最后,我们将 OUTPUT 链的缺省政策设为 ACCEPT,因为我们想容许所有对外的流量(由於我们信任我们的用戶)。

9.

iptables -L -v 最后,我们可以列出(-L)刚加入的规则,並检查它们是否被正确地装入。

我们需要做的最后一件事情,就是存储我们的规则,好让它们在下次开机时会自动被重新装入:

# /sbin/service iptables save

这 樣做会执行 iptables 的 init 腳本,它会执行 /sbin/iptables-ave 並将现有的 iptables 设置写进 /etc/sysconfig/iptables。开机时,iptables 的 init 腳本会通过 /sbin/iptables-restore 这个指令重新施用存储在 /etc/sysconfig/iptables 內的规则。

很明显的,在指令殼內输入这堆指令会颇乏味,因此运用 iptables 的最简易方法就是创建一个代你做以上一切的腳本。你可以将上面的指令输入到你喜欢的文字编辑器內並存储为 myfirewall,例如:

#!/bin/bash

#

# iptables 样例设置腳本

#

# 清除 iptables 內一切现存的规则

#

iptables -F

#

# 容让 SSH 连接到 tcp 端口 22

# 当通过 SSH 远程连接到服务器,你必须这樣做才能群免被封锁於系统外

#

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

#

# 设置 INPUT、FORWARD、及 OUTPUT 链的缺省政策

#

iptables -P INPUT DROP

iptables -P FORWARD DROP

iptables -P OUTPUT ACCEPT

#

# 设置 localhost 的访问权

#

iptables -A INPUT -i lo -j ACCEPT

#

# 接纳属於现存及相关连接的压缩

#

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#

# 存储设置

#

/sbin/service iptables save

#

# 列出规则

#

iptables -L -v

註: 我们可以在腳本內加入註释来提醒自己正在做甚麼。

现在令腳本可以被执行:

# chmod +x myfirewall

我们现在可以编辑这个腳本,並在指令殼內用以下指令来执行它:

# ./myfirewall

4. 界面

在上一个范本中,我们看见如何能接纳所有来自某个界面的压缩,也就是 localhost 界面:

iptables -A INPUT -i lo -j ACCEPT

假设我们现在有两个独立的界面,分別是将我们连接到內联网的 eth0 及连接到外部互联网的 ppp0 拨号调制解调器(或者 eth1 适配器)。我们或许会想接纳所有来自內联网的对內压缩,但依然过滤那些来自互联网的压缩。我们可以这樣做:

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -i eth0 -j ACCEPT

让特別留意 —— 假如你接纳来自互联网界面(例如 ppp0 拨号调制解调器)的所有压缩:

iptables -A INPUT -i ppp0 -j ACCEPT

你便等同於停用了我们的防火牆!

5. IP 地址

将整个界面开放给对內的压缩也许不夠严谨,而你想拥有更多控制权来決定接纳甚麼及拒絕甚麼。现在假设我们拥有一群採用 192.168.0.x 私人网络的计算机。我们可以打开防火牆给来自某个被信任 IP 地址(例如 192.168.0.4)的对內压缩:

# 接纳来自被信任 IP 地址的压缩

iptables -A INPUT -s 192.168.0.4 -j ACCEPT # change the IP address as appropriate

将这个指令分解,我们首先附加(-A)一条规则到 INPUT 链,指明来源(-s)IP 地址是 192.168.0.4 的压缩都应该被接纳(ACCEPT)(请亦留意我们如何利用 # 符号来解释我们的腳本,因为 # 之后的所有文字都会被视为註释)。

当 然,如果我们想接纳来自一系列 IP 地址的压缩,我们可以为每个被位任的 IP 地址加入一条规则,而这樣做的确是可行的。但是假如它们的数量很多,一次过加入一系列 IP 地址会比较简单。要这樣做,我们可以利用一个子网掩码或标準的斜線记法来指定 IP 地址的范围。举个例說,如果我们想将防火牆开放给来自整个 192.168.0.x(当中 x=1 到 254)范围的压缩,我们可以用下面其中一个方法来达致目的:

# 接纳来自被信任 IP 地址的压缩

iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT # using standard slash notation

iptables -A INPUT -s 192.168.0.0/255.255.255.0 -j ACCEPT # using a subnet mask

最 后,除了过滤单一的 IP 地址外,我们亦可以配对该设备的 MAC 地址。要这应做,我们需要装入一个容许过滤 MAC 地址的模块(mac 模块)。较早前当我们用 state 模块来配对 ESTABLISHED 及 RELATED 压缩时,我们看见模块扩展 iptables 功能的例子。在这裡我们除了检查压缩的 IP 地址外,更利用 mac 模块来检查来源地的 MAC 地址:

# 接纳来自被信任 IP 地址的压缩

iptables -A INPUT -s 192.168.0.4 -m mac --mac-source 00:50:8D:FD:E6:32 -j ACCEPT

首先我们用 -m mac 来装入 mac 模块,然后我们用 --mac-source 来指定来源 IP 地址(192.168.0.4)的 MAC 地址。你要为每个需要过滤的乙太网设备找出 mac 地址。以 root 的身份执行 ifconfig(无線设备用 iwconfig)可以将 mac 地址告䜣你。

这 樣可防止来源地的 IP 地址被偽装,因为只有真正源於 192.168.0.4(MAC 地址是 00:50:8D:5D:E6:32)的压缩才会被接纳,而所有假扮源於该地址的压缩都会被拦截。请注意,过滤 MAC 地址在互联网上不能使用,卻絕对能正确地在內联网裡运作。

6. 端口及协议

由上面我们看见如何将新增规则在防火牆內,用来过滤符合某个界面或来源 IP 地址的压缩。这樣做让我们能经过防火牆访问某些被信任的来源(主机)。现在我们看看如何过滤协议及端口,好叫我们能进一步区別要接纳及拦截那些对內的压缩。

在 我们开始之先,我们须要知道个別服务所使用的协议及端口编号。让我们以 bittorrent 作为一个简单的样例。bittorrent 在 6881 端口上採用 tcp 协议,因此我们需要容许所有以 6881 为目标端口(它们抵步时所用的端口)的 tcp 压缩。

# 接纳目标端口是 6881 号(bittorrent)的 tcp 压缩

iptables -A INPUT -p tcp --dport 6881 -j ACCEPT

在这裡我们附加(-A)一条规则到 INPUT 链,配对 tcp 协议(-p tcp)及从 6881 目标端口进入我们的机器(--dport 6881)。

註: 要配对目标或来源端口(--dport 或 --sport),你必须先指定协议(tcp、udp、icmp、all)。

我们亦可以扩展以上的样例来包含一系列的端口,例如,接纳 6881 至 6890 端口上的所有 tcp 压缩:

# 接纳目标端口是 6881-6890 号的 tcp 压缩

iptables -A INPUT -p tcp --dport 6881:6890 -j ACCEPT

7. 融会贯通

既然我们已经有基本认识,现在便可以合併这些规则。

UNIX/Linux 上一个受欢迎的服务就是容许远程登录的 SSH 服务。SSH 缺省使用 22 号端口及採用 tcp 协议。因此假若我们想允许远程登录,我们需要容许 tcp 连接到 22 号端口:

# 接纳目标端口是 22 号(SSH)的 tcp 压缩

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

这 樣做会开放 22 号端口(SSH)给所有对內的 tcp 连接,卻会构成潛在的安全性威胁,因为骇客可以強行破入使用易猜测口令的戶口。然而,假若我们知道那些通过 SSH 作远程登录的可信任机器的 IP 地址,我们便可以将访问权限制到那些来源 IP 地址。举个例說,如果我们只想将 SSH 的访问权开放给我们的私人內联网(192.168.0.x),我们可以将来源 IP 地址限制在这个范围:

# 接纳来自私人內联网,目标端口是 22 号(SSH)的 tcp 压缩

iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 22 -j ACCEPT

利 用来源 IP 进行过滤容让我们能安全地开放 22 号端口上的 SSH 给可信任的 IP 地址来访问。举个例說,我们可以用这个方法允许工作与家用机器之间的登录。对於其它 IP 地址来說,这个端口(与及服务)就好像了关闭了一樣,而服务亦依被停用,因此扫描端口的骇客多数会略过我们。

8. 总结

这裡只是很初步地介绍 iptables 可以做的事情,但我希望这份教学文档提供了一个良好的基础,帮助各位创建更复杂的规则集。

9. 连结

http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-fw.html

http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-iptables.html

该贴已经同步到 nekor的微博

[查看全文]
e_qing
e_qing回复给帖子:3558
展开Biu

testtesttesttesttest

[查看全文]
番茄星人
本帖最后由
展开Biu

本帖最后由 番茄星人 于 2014-8-28 21:16 编辑

tset

[查看全文]
番茄星人
本帖最后由
展开Biu

本帖最后由 番茄星人 于 2014-10-9 11:24 编辑

[index]

[#2]1

[#3]2

[/index]

  
 

[page]1

[page]2

[page]3

[查看全文]
【K】
【Swift】从零开始学Swift App开发
展开Biu

本帖最后由 【K】 于 2014-7-15 17:32 编辑

本教程将从零开始教大家使用Swift来开发一款iOS计时器App。
本教程首发于自己跟朋友的swift小社区,技术宅(gn00.com)是二发,转载请通知注明!

前言
操作很简单:
  • 点击复位可以对时间清零;
  • 点击秒、1分、3分、5分可以不断增加倒计时时间;
  • 点击 开始/停止 来启动或停止倒计时;

通过此教程,你将学习:
  • 如何使用Xcode
  • 如何灵活运用Swift中的语法来解决实际问题;
  • 如何使用基本的UI控件UIButtonUILabel 来创建界面,使用NSTimer来触发定时事件,以及使用UILocalNotification来实现本地提醒。

项目源代码

托管在github

创建项目

首先,打开Xcode,新建一个项目,Xcode将提示选择一个工程模板。由于我们将从零开始学习,请在左侧窗口选则iOS/Application,右侧窗口选择Empty Application,点击Next,然后在Product Name项填入SwiftCounter,Language注意选择Swift,再点击Next,选择项目保存的路径,最后点击Create即可完成项目创建。
项目新建完成后,我们可以看到工程中已经自动生成了AppDelegate.swift文件。
应用代理类(AppDelegate)
AppDelegate类中定义了app进入不同生命周期(包括app启动动、闲置、进入后台、进入前台、激活、完全退出)时的回调方法。实际上在app启动时,app会自动执行一个叫main的入口函数,它通过调用UIApplicationMain函数来创建出AppDelegate类实例,并委托其实现app在不同生命周期的定制行为。
屏幕(Screen)、窗口(Window)和视图(View)
在app启动完成的回调方法application:didFinishLaunchingWithOptions中,首先创建一个UIWindow对象。在此,我先简单介绍一下iOS开发中基本UI元素:

  • UIScreen 代表一块物理屏幕;
  • UIWindow 代表一个窗口,在iPhone上每个app一般只有一个窗口,而在Mac上一个app经常有多个窗口;
  • UIView 代表窗口里某一块矩形显示区域,用来展示用户界面和响应用户操作;
  • UILabel和UIButton,继承自UIView的特定UI控件,实现了特定的样式和行为。

继续看application:didFinishLaunchingWithOptions中的默认实现:

[mw_shl_code=applescript,true] self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

self.window!.backgroundColor = UIColor.whiteColor()

self.window!.makeKeyAndVisible()[/mw_shl_code]

首先,它通过获取主屏幕的尺寸,创建了一个跟屏幕一样大小的窗口;然后将其背景色为白色;并调用makeKeyAndVisible()方法将此窗口显示在屏幕上。
视图控制器(ViewController)
在iOS开发中,主要使用ViewController来管理与之关联的View、响应界面横竖屏变化以及协调处理事务的逻辑。每个ViewController都有一个view对象,定制的UI对象都将添加到此view上。
为了给计时器创建页面并实现功能,我们需要新建一个视图控制器,命名为CounterViewController:点击文件,新建文件,类型选择Swift,然后输入类名CounterViewController,确定。
我们先为其添加基础的结构代码:
[mw_shl_code=applescript,true] import UIKit

class CounterViewController : UIViewController {

override func viewDidLoad() {

super.viewDidLoad()

}

}[/mw_shl_code]

其中重载的方法viewDidLoad非常重要,它在控制器对应的view装载入内存后调用,主要用来创建和初始化UI。
在介绍如何定制计时器UI之前,我们需要先将CounterViewController的view跟app中唯一的窗口Window关联起来。完成此操作只需在application:didFinishLaunchingWithOptions中加一行代码:

[mw_shl_code=applescript,true] self.window!.rootViewController = CounterViewController()[/mw_shl_code]

[查看全文]
ZHZY
[Lua]从元表到面向对象 - 元表
展开Biu

本帖最后由 ZHZY 于 2013-7-13 19:38 编辑

=534=好吧 看不到Lua分类果然有淡淡的忧桑QAQ

原创教程 根据个人经验所得← ←求纠错


元表这个东西啊,很神奇的说

[一点也不神奇(摔)]

通过元表,小的来说,我们可以给表定义行为,例如a+b,a..b这样的操作符;大了来说,我们可以设置表的索引(__index)来达到面向对象的效果甚至可以写一个完整的类(class)机制

关于元表,个人给出的定义如下:

如果一个表能对另一个或多个表的行为或方法进行定义,那么这个表就是另一个或多个表的元表(metatable)

1.元表可以说是两个表在行为上的关系(- -微妙的字眼),只能是表和表之间的关系;

2.一个表可以设置其元表,也可以成为其它单个或多个表的元表;

3.如果一个表需要被设置为元表,表中需要有元方法才能起到元表的效果.

设置元表和获取元表方法如下:

setmetatable(table,metatable)设置表的元表

getmetatable(table) 获取表的元表

举一个例子(- -代码框没有Lua语言求补救)

[mw_shl_code=cpp,true]metatable = {} -- 元表

theTable = {} -- 表

-- 设置theTable的元表为metatable

setmetatable(theTable,metatable)

print(metatable)

print(getmetatable(theTable)) -- 获取theTable的元表并输出地址[/mw_shl_code]

这样的话,我们就给theTable设置了元表,但是元表中没有任何元方法,设置了它根本没有效果=3=

元表中的行为定义方式基本为:

metatable[event] = function(xxx) xxx end

其实就是将一些下标赋值为function,当发生这些行为的时候会调用这些函数.

当然如果行为没有被定义你就等着error把23333

表的行为与相应事件如下:

[查看全文]