查看RMXP帮助手册,我们会发现这个类里有如下属性(Attributes):

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

目前共有11篇帖子。
![]() |
我们以RPG Maker XP里自带的RPG::Map类为例。
查看RMXP帮助手册,我们会发现这个类里有如下属性(Attributes): ![]() 这个类共有11个属性。 现在我们嫌一个个地写太麻烦,想用一个循环语句自动遍历这11个属性。 先看这个类的定义: ![]() |
![]() |
【代码】
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)这条语句间接读取这个对象的各个属性。 |
![]() |
执行
p map.width 输出20,正好是一号地图的宽度。 这条语句还可以改写成: p map.instance_variable_get("@width") 同样也是输出20 当然,还有另外两种方法: p map.width() p map.method("width").call 也就是把width属性当做方法来调用,返回的就是这个属性的值。 |
![]() |
如果我们执行
p map.method("width").arity 返回的值为0,也就是说width这个“方法”,参数个数为0 |
![]() |
【补充】
p map.methods() 返回该对象的所有属性名和方法名构成的数组,属性名前不带“@”字符。 输出结果: ![]() |
![]() |
p map.instance_variables()
返回该对象的所有属性名构成的数组,属性名前带有“@”字符。 输出结果: ![]() |
![]() |
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。 |
![]() |
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") 输出结果: ![]() ![]() |
![]() |
map.method("方法名")返回一个Method对象,关于Method类的介绍请参阅Ruby的官方文档:
http://ruby-doc.org/core-2.2.3/Method.html 要查看这个Method对象里有哪些方法,请执行: p map.method("方法名").methods |
![]() |