Python Ruby 中怎么替换 setattr (...)

jyfeather · 2013年06月29日 · 最后由 jyfeather 回复于 2013年06月29日 · 7973 次阅读

我觉得 python 中setattr(object, name, value)这个方法很好用,可以动态地增加或者之后修改对象中的参数。

可是 Ruby 好像没有,不知道 Ruby 中该怎么实现呢??

好像是用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).

对象模型不太一样

class << o
  attr_accessor :aname
end
o.aname = value

或者你可以用 open struct

可是 python 的对象中并不需要事先申明变量,也能用setattr()动态添加,比如这样

1 class test(object): 2 | """test class""" 3 4 t = test() 5 setattr(t, 'a', 100) 6 print t.a

而 Ruby 中的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'也很好用哈,谢谢你~

我一般不这么用,如果要实现一个 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 嗯,有点明白了。😄

需要 登录 后方可回复, 如果你还没有账号请 注册新账号