我觉得 python 中setattr(object, name, value)这个方法很好用,可以动态地增加或者之后修改对象中的参数。
setattr(object, name, value)
可是 Ruby 好像没有,不知道 Ruby 中该怎么实现呢??
好像是用object.send(symbol, arg)吗,对吗?
object.send(symbol, arg)
http://stackoverflow.com/questions/2136380/ruby-equivalent-of-python-setattr
Either obj.instance_variable_set("@instance_variable", value) or obj.send("instance_variable=", value).
obj.instance_variable_set("@instance_variable", value)
obj.send("instance_variable=", value)
对象模型不太一样
class << o attr_accessor :aname end o.aname = value
或者你可以用 open struct
可是 python 的对象中并不需要事先申明变量,也能用setattr()动态添加,比如这样
setattr()
1 class test(object): 2 | """test class""" 3 4 t = test() 5 setattr(t, 'a', 100) 6 print t.a
而 Ruby 中的send方法,好像只能对已经定义的方法进行修改。
send
不知道小弟说的正确不?
不过,obj.instance_variable_set("@instance_variable", value)的确可以诶,@blacktulip ,就是代码量略多。
1 class Test 2 | # test class 3 end 4 5 t = Test.new 6 t.instance_variable_set("@a", 100) 7 puts t.instance_variable_get("@a")
非常感谢帮助哟。
#3 楼 @luikore require 'ostruct'也很好用哈,谢谢你~
require 'ostruct'
我一般不这么用,如果要实现一个 setattr:
def setattr(object, name, value) unless object.respond_to?(name) || object.respond_to?("#{name}=") object.singleton_class.class_eval do attr_accessor name end end object.send "#{name}=", value end
#7 楼 @Rei 嗯,有点明白了。