上一篇文章我们说到了Ruby中的反射(Reflection)-通过类名称构造类对象。
使用过Java反射的同学们都知道,有了对象之后,操作成员变量和私有方法也就不在话下了。
Ruby中也是一样。
先看操作成员变量的例子。我们尝试更改一个成员变量的值。(接着上一片文章的代码)
#manpulate instance variables
first_wood = obj_list.first
first_wood.instance_variables.each do | var |
#get the instance variable
puts "class of var = #{var.class}, value of var = #{var}"
var_value = first_wood.instance_variable_get(var)
puts "class of var_value = #{var_value.class}, value of var_value = #{var_value}"
#set the new value of instance varialbe
first_wood.instance_variable_set(var, var_value + "...and i was changed.")
first_wood.say
end
1、first_wood.instance_variables.each,我们得到一个Wood对象,然后调用其instance_variables方法得到所有成员变量的名称(Symbol对象)。
2、然后,调用对象的first_wood.instance_variable_get方法,传递成员变量名称,得到成员变量对象。
3、最后,我们通过first_wood.instance_variable_set,改变这个成员变量的值。
代码运行结果:
class of var = Symbol, value of var = @desc
class of var_value = String, value of var_value = I am a primal wood
I am a primal wood...and i was changed.
再看调用私有方法:
#call private method
last_wood = obj_list.last
last_wood.method(:say_private).call
很简单,如果你知道方法名称,调用last_wood.method传入方法名,就可以得到一个Method对象,然后调用Method对象的call方法,结果是私有方法输出的内容:
I Want get married with a WoodDesk...
普通场景下用不到修改成员变量和调用私有方法,因为这是违反了面向对象的封装原则的,那么反射在什么场景下有用呢?从我个人经验来说我觉得两个地方有用:
1)单元测试。
2)面向方面编程。
这两种场景都需要调用私有方法或替换成员变量的值。
你觉得呢?
本文链接:http://www.yunweipai.com/750.html
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/53145.html