`

元编程实现类属性自定义

 
阅读更多
  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]
0
0
分享到:
评论

相关推荐

    sharepoint 2010 扩展webpart自定义属性边栏字段

    下面,我们将详细探讨如何在SharePoint 2010中扩展Web Part自定义属性,以实现边栏字段的定制。 1. **理解Web Part属性** - Web Part属性是定义Web Part行为的关键元素,它们可以是任何类型的数据,如字符串、布尔...

    C#2017实现自定义属性实现标签特性简单例子可执行

    在C#编程中,自定义属性(Custom Attributes)是一种元数据,可以附加到代码的不同元素(如类、方法、字段等)上,用于提供额外的信息。这些信息可以在运行时通过反射来访问,使得代码更加灵活且易于扩展。本篇文章...

    vb自定义属性实例...

    在VB(Visual Basic)编程中,自定义属性是扩展对象功能的一种重要方式。自定义属性允许程序员根据项目需求创建特定的访问器,控制属性的读取、写入甚至执行更复杂的逻辑。本实例将深入探讨如何在VB中实现自定义属性...

    使用自定义属性源代码

    在编程领域,自定义属性是扩展已有类或控件功能的一种常见方式,它允许开发者根据项目需求定义自己的特性。在本文中,我们将深入探讨如何在代码中实现自定义属性,并以一个具体的例子——"RainAnimation"来阐述这个...

    实现生成自定义注解的实体类

    在Java编程语言中,自定义注解是一种强大的工具,它允许开发者创建自己的元数据,以提供额外的信息或规范代码的特定行为。自定义注解可以应用于类、接口、方法、变量等不同层级,使得代码更加模块化,易于理解和维护...

    自定义属性分组

    在IT领域,自定义属性分组是一种常见的数据管理和组织方式,尤其在软件开发中,它允许用户根据特定需求对对象的属性进行分类和管理。在本案例中,"自定义属性分组"指的是用户可以创建自己的属性类别,以便更有效地...

    (九)delphi自定义控件属性编辑

    在Delphi编程环境中,自定义控件的属性编辑是一项重要的任务,它允许开发者扩展标准控件的功能并提供更丰富的用户界面。本节将深入探讨如何在Delphi中创建自定义控件并定制其属性编辑器。 首先,创建自定义控件通常...

    一个关于C# PropertyGrid增加自定义属性的范例。

    例如,如果我们有一个`CustomCollection`类,我们可以这样实现自定义属性: ```csharp [TypeConverter(typeof(MyCustomConverter))] public class CustomCollection : List { // 其他代码... } public class ...

    关于VC++中属性对话框的编程

    属性对话框控件是在Windows系统中是常见的控件,那么在VC++中实现自定义的属性对话框控件后,会给我们的Windows应用的用户操作带在非常大的方便。学习综合使用属性对话框、弹出菜单等功能会给我们的VC++应用的功能...

    CATIA二次开发:C#方式获取产品属性:一般属性及自定义属性

    CATIA的宏录制功能可以将操作过程转换成VBA或VBScript脚本,通过分析和修改这些脚本,可以快速掌握API的使用方法,进而使用C#等语言实现更加复杂的自定义功能。 总之,CATIA二次开发是一个系统工程,涉及到的对象和...

    C# 自定义属性在propertyGrid控件中显示 演示demo

    首先,自定义属性是C#中一个强大的特性,允许我们在类中添加元数据,这些元数据可以用来提供额外的信息,如描述、默认值或验证规则。我们通过继承`Attribute`类来创建自定义属性。例如,我们可以创建一个名为`...

    C#GDI+实现自定义带属性控件

    在本文中,我们将深入探讨如何使用C#编程语言和GDI+库在Visual Studio 2005环境下创建一个自定义的带属性控件。这个控件能够展示多行文字,支持不同颜色、字体以及排列方式,用户可以通过控件的属性窗口方便地调整...

    Ruby元编程第二版中文

    在Ruby中,元编程的强大之处在于其语法简洁且易于理解,使得程序员可以轻松地实现动态行为。Ruby提供了多种元编程工具,包括: 1. **方法定义与调用**:Ruby允许在运行时定义和修改方法,如`define_method`函数可以...

    flash自定义类案例

    自定义类允许开发者根据项目需求创建新的对象类型,这些对象具有特定的属性和方法。通过编写.as文件,我们可以定义一个类并赋予它特定的功能。 在这个"flash自定义类案例"中,我们可能有一个名为`MyCustomClass.as`...

    C#2017实现自定义属性实现多个标签叠加特性简单例子可执行

    而自定义属性则更进一步,它们允许我们为类、方法、字段等添加自定义元数据,这些元数据可以用于代码分析、文档生成、运行时检查等多种用途。 创建自定义属性涉及到定义一个属性类型(通常是派生自`System....

    JSP自定义标签动态属性支持

    TLD文件定义了标签的名称、属性、行为等元数据,而标签处理类则实现了这些行为,处理由JSP页面传递过来的参数和指令。 在描述中提到的"动态属性支持"是指,标签的属性不是静态固定的,而是可以在运行时根据需要动态...

    MVC 自定义属性 demo

    自定义属性是.NET Framework的一部分,它们是元数据的容器,可以附加到类、方法、属性等编程元素上,提供额外的信息或行为。在MVC中,我们通常使用它们来装饰控制器或动作方法,以实现如授权、缓存、模型验证等功能...

    反射自定义属性拼接SQL

    自定义属性是扩展元数据的一种方式,它们可以附加到类、方法、属性等各种程序元素上,用于存储额外的信息。在这个“反射自定义属性拼接SQL”的例子中,我们将探讨如何利用反射来读取对象的自定义属性,并根据这些...

    java自定义集合类

    自定义集合类的一个例子是,你可能想要创建一个支持优先级排序的队列,这时可以实现一个`PriorityQueue`类,基于最小堆数据结构实现,允许用户通过优先级插入和删除元素。 在实际应用中,自定义集合类可以提高代码...

    自定义控件与类模块+Event

    在VB(Visual Basic)编程中,自定义控件与类模块是实现复杂功能和扩展标准控件的关键。本文将深入探讨这两个概念以及与其相关的`RaiseEvent`和`WithEvents`关键字,它们在创建事件驱动的程序中发挥着至关重要的作用...

Global site tag (gtag.js) - Google Analytics