目前共有11篇帖子。
【讲解】遍历一个对象(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

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
 
 
©2010-2024 Arslanbar [手機版] [桌面版]
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。