作者共发了11篇帖子。 内容转换:不转换▼
 
点击 回复
344 10
【讲解】遍历一个对象(Object)里的所有属性(Attributes)
一派护法 十九级
1楼 发表于:2015-12-6 09:48
我们以RPG Maker XP里自带的RPG::Map类为例。
查看RMXP帮助手册,我们会发现这个类里有如下属性(Attributes):

这个类共有11个属性。
现在我们嫌一个个地写太麻烦,想用一个循环语句自动遍历这11个属性。
先看这个类的定义:

一派护法 十九级
2楼 发表于:2015-12-6 09:53
【代码】
map = load_data("Data/Map001.rxdata")
for varName in map.instance_variables
  p map.instance_variable_get(varName)
end

【讲解】
首先,第一行是从文件Data/Map001.rxdata中载入对象,并保存到map变量中,这个对象是RPG::Map类的一个实例。
现在,如果执行p map.width(1号地图的宽度),就能把这个对象的width属性的值输出出来。
但是如果这11个属性都一一这么写会比较麻烦,于是通过map.instance_variables获取所有的这11个类属性的名称,并作循环。在循环体里通过map.instance_variable_get(varName)这条语句间接读取这个对象的各个属性。
一派护法 十九级
3楼 发表于:2015-12-6 09:57
执行
p map.width
输出20,正好是一号地图的宽度。
这条语句还可以改写成:
p map.instance_variable_get("@width")
同样也是输出20

当然,还有另外两种方法:
p map.width()
p map.method("width").call
也就是把width属性当做方法来调用,返回的就是这个属性的值。
一派护法 十九级
4楼 发表于:2015-12-6 09:58
如果我们执行
p map.method("width").arity
返回的值为0,也就是说width这个“方法”,参数个数为0
一派护法 十九级
5楼 发表于:2015-12-6 10:00
【补充】
p map.methods()
返回该对象的所有属性名和方法名构成的数组,属性名前不带“@”字符。
输出结果:
一派护法 十九级
6楼 发表于:2015-12-6 10:02
p map.instance_variables()
返回该对象的所有属性名构成的数组,属性名前带有“@”字符。
输出结果:
一派护法 十九级
7楼 发表于:2015-12-6 10:07
def map.hello()
  p "Hello World"
end
p map.singleton_methods()
返回用户对该对象变量单独定义的方法。
输出结果:


参考资料:
A method given only to a single object is called a singleton method.
http://www.rubyist.net/~slagell/ruby/singletonmethods.html
这篇文章详细的介绍了什么是Singleton Method。
一派护法 十九级
8楼 发表于:2015-12-6 10:12
map.method("方法名").arity
获取这个对象中的一个方法接受的参数个数
map.method("方法名").call(...)
调用这个方法

例如:
def map.hello(firstname, lastname)
  print "Hello World, " + firstname + " " + lastname
end
print "参数个数为:" + map.method("hello").arity.to_s
map.method("hello").call("Zig", "Zag")
输出结果:


一派护法 十九级
9楼 发表于:2015-12-6 10:14
map.method("方法名")返回一个Method对象,关于Method类的介绍请参阅Ruby的官方文档:
http://ruby-doc.org/core-2.2.3/Method.html
要查看这个Method对象里有哪些方法,请执行:
p map.method("方法名").methods
一派护法 十九级
10楼 发表于:2015-12-6 10:44
一派护法 十九级
11楼 发表于:2015-12-7 16:44
这些内容在rmxp的帮助手册里都没有提到。

回复帖子

内容:
用户名: 您目前是匿名发表
验证码:
(快捷键:Ctrl+Enter)
 

本帖信息

点击数:344 回复数:10
评论数: ?
作者:巨大八爪鱼
最后回复:巨大八爪鱼
最后回复时间:2015-12-7 16:44
 
©2010-2024 Arslanbar Ver2.0
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。