元编程实现类属性自定义

  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]

猜你喜欢

转载自schooltop.iteye.com/blog/2344942