RUBY元编程怎么样

Python013

RUBY元编程怎么样,第1张

在java的时代,因为不满面向类/对象的复杂机制,自己借鉴研究了对象装备模式,后来发现就是spring的原理。当时不知spring的情况下,还自己实现了利用运行时反射机制来动态的给对象设置空类,拼装方法共享实例对象属性,做出来虽然很欣慰,但是很难看,很慢,不可能到生产环境。 后来了解了js的函数原型prototype,可以动态的定义方法和传递闭包,简直口水直流,直接转成了web前台开发,只做ajax,直到ruby的出现。大概是06年,那时候资料贼少,全是日文,英文的都不多,学了皮毛就搁置了。 今年,因为自己回归开发,想实现一些想法,尝试了php之后,毅然决定打死不用php,与其深入研究php不如决心搞ruby,打眼一看,发现中文资料太多了,太幸福了,当看到这本元编程的时候,马上想起java时候的辛酸啊。 Ruby让人快乐,元编程更是快乐的魔法,创造出令人兴奋激动的东西。 计算机不再是仆人,而是朋友,我能理解你,你也能理解我。 如果说写java就像写论文,那么用js就像写英文诗,而ruby像五言绝句。 所以不学元编程,不如用java

你的问题是不是“ruby 语言的特点”吧??哈哈~~还是我自做多情啦~~~~

Ruby特点

一般认为,他有如下特点:

简单

解释型语言,所以不必事先编译,直接运行,开发周期短,调试方便。

变量没有类型的区分,变量不需要定义,而且是弱类型,即可以改变类型。

irb(main):004:0>a=1

=>1

irb(main):005:0>a.class

=>Fixnum

irb(main):006:0>a*3

=>3

irb(main):007:0>a="str"

=>"str"

irb(main):008:0>a.class

=>String

irb(main):009:0>a*3

=>"strstrstr"

irb(main):010:0>

简单的语法,多从Eiffel继承而来,容易学习。

不需要内存管理,系统提供GC处理机制。其实自从学习JAVA之后,几乎就很少想起指针和内存分配了。

它是纯的面向对象的语言

一切都是对象,像整数等类型从开始就被设计为对象来处理。

有类,实例,模块,继承,方法重载等。

module和Mixin ,实现多重继承。

比Python,Java,C++等更OO。

脚本语言

解释执行

很强的文字处理能力和正则表达式

直接访问OS,用ruby编写系统程序也是可能的。

其他

支持多种长整数,如果内存允许,可以进行很大数的计算操作。

具备异常处理能力,类似java的异常处理功能。

动态载入。可以在运行时候重定义自己,类也可以在运行时继承/取消继承。

线程支持。

反射(Reflection)。Ruby可以看到程序的内部,比如一个模块是否含一个特定方法,一个对象是哪个class等等。类似java的反射功能。

扩展性。使用C API可以轻松的建立国更多的应用库,比如Ruby Mysql模块就是用C语言编写以供Ruby调用Mysql数据库用的。

迭代器和闭包。一个在闭包开始时定义的资源在闭包结束后会被释放,适合于socket,数据库连接,文件句柄等。而迭代器则是非常方便的工具。

跨平台,支持Linux,Unix,Windows,Mac等更重操作系统。

发行许可证。基于Ruby Artistic License (BSD样式的)和GPL。

像其它开源软件一样,有活跃的社区,大量面向Ruby的软件越来越多。

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。

有时候我们说某个语言具有很强的动态性,有时候我们会区分动态和静态的不同技术与作法。我们朗朗上口动态绑定(dynamic binding)、动态链接(dynamic linking)、动态加载(dynamic loading)等。然而“动态”一词其实没有绝对而普遍适用的严格定义,有时候甚至像面向对象当初被导入编程领域一样,一人一把号,各吹各的调。

一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。

尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。这种“看透class”的能力(the ability of the program to examine itself)被称为introspection(内省、内观、反省)。Reflection和introspection是常被并提的两个术语。

Java如何能够做出上述的动态特性呢?这是一个深远话题,本文对此只简单介绍一些概念。整个篇幅最主要还是介绍Reflection APIs,也就是让读者知道如何探索class的结构、如何对某个“运行时才获知名称的class”生成一份实体、为其fields设值、调用其methods。本文将谈到java.lang.Class,以及java.lang.reflect中的Method、Field、Constructor等等classes。