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。