class A def method_missing(name, *args) if name.to_s =~ /^*=/ if self.methods.include? name.to_s.delete("=").to_sym instance_variable_set("@#{name}".delete("="),args.first) else instance_variable_set("@#{name}".delete("="),args.first) self.class.send(:define_method,"#{name}".delete("=") ) do instance_variable_get("@#{name}".delete("=")) end end else super end end end
改进一下:
class A def method_missing(name, *args) if name.to_s =~ /^*=/ self.class.send(:define_method,"#{name}".delete("=") ) do args.first end else super end end end
测试:
测试:
a = A.new
a.jamst = 123
a.jamst #=>123
实现一个二维表单的查询和修改:
class Excell def method_missing(name, *args) p name if name.to_s =~ /^change.*=/ split_str = name.to_s.delete("=").split("_") eval %Q(self.row_#{split_str[1].to_i-1}[#{split_str[2].to_i-1}] = args.first) eval %Q(self.cols_#{split_str[2].to_i-1}[#{split_str[1].to_i-1}] = args.first) self.class.send(:define_method,"#{name}".delete("=")) do args.first end elsif name.to_s =~ /^equal*/ split_str = name.to_s.split("_") self.class.send(:define_method,"#{name}") do eval %Q( self.row_#{split_str[1].to_i-1}[#{split_str[2].to_i-1}] ) end return eval %Q( self.row_#{split_str[1].to_i-1}[#{split_str[2].to_i-1}] ) elsif name.to_s =~ /^*=/ self.class.send(:define_method,"#{name}".delete("=") ) do args.first end else super end end end # 初始化一个类 a = Excell.new a.row_size = 4 a.cols_size = 100 a.row_0 = *(1..100) a.row_1 = *(1..100) a.row_2 = *(1..100) a.row_3 = *(1..100) a.cols_size.times.each do |_| cos = [] a.row_size.times.each do |s| eval "cos << a.row_#{s}[#{_}]" end eval "a.cols_#{_} = cos" end #查询数值 a.equal_x_y #修改数值 a.change_x_y # a.equal_2_50 == a.row_1[49] # a.equal_2_50 == a.cols_49[1] #测试: a.equal_2_50 a.change_2_50 = 111 a.row_1[49]