目前共有11篇帖子。 內容轉換:不轉換▼
 
點擊 回復
307 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)
 

本帖信息

點擊數:307 回複數:10
評論數: ?
作者: 巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2015-12-7 16:44
 
©2010-2024 Arslanbar Ver2.0
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。