Ruby语言的主要特色
编程语言总有相同之处,因为它们的目标是一致的,但每一种语言都有自己特有的部分。从开发者角度看,Ruby语言至少有以下几个与众不同的特色:
。。。。。
ruby.lang 之魔幻语法
0、 变量无需申明即可使用,当 变量 首次被赋值时 它 便存在了。
特殊类型的变量有特殊符号作为前缀,Ruby使用一种命名惯例来区分变量的类型:
具体示例如下表所示:
1、列表(Array)和映射(hashes)
像Python一样变化有区间 、元组 等 衍生用法。
2、 控制语句,if/unless、case...when、 while/until、for...in...。
控制语句有魔幻用法——语句修饰符 ,即可以把控制语句(if、while等)使用在目标语句后面,例如:
puts “Danger, While Robinson" if radiation > 3000 #等效于 if radiation > 3000 puts “Danger, While Robinson" end
3、类与继承语法
#超类定义 class Car #构建器(与java不同,构建器方法名称必须是initilalize) def initialize() puts 'Car initialize....'; end end #子类,继承自 Car class MyMinCar < Car #构建器 def initialize(x,y) super();#子类不会自动调用父类的构建器,需要super()明确调用; #YOUR CODE puts 'MyMiniCar ~~~' end; #YOUR Other code end; #using class... mycar = MyMinCar.new(1,2);
继承符号 —— < (小于号),可以理解为:子类 (抽象程度更窄化) 小于父类,或者像流操作符一样 把父类的内容都‘流’入子类。另外,默认(即未使用继承符号) 时,父类是 Object对象, 和Java一样是单根继承体系;
super关键字是从子类直接调用父类(同名) 方法的 。
4、实例变量、属性、方法 ,实例变量依靠命名惯例中的@前导符号来声明,通常在构建器(initialize方法)中依次为它们符初值,所有的实例变量都是私有的,不能在外部被访问,除非申明属性。属性是特殊的方法、是把实例变量暴露给外部的途径, 就像Java中geter/seter, 但Ruby有方法命名上的特殊要求——geter方法名通常与成员变量的名称一致,而seter方法是成员变量名称后跟=(等号)~似乎是说该属性名称后跟随=等号运算符时调用该方法。另外还有attr_reader、atrr_writer、 attr_accessor 三个助手方法可更方便的声明只读、只写或可读可写的属性——这三个方法的参数是 :(冒号)+成员变量名称。另外,你还可以申明虚拟属性(即未对应成员变量)。除了代表属性的方法申明之外,其余的方法都代表了对象的动作。
当设计一个类的时候,需要要考虑两个方面:1.内部状态、2.外部形态,内部状态保存到实例变量中,而通过方法(或者申明属性)来表现外部形态,我们把一个对象的外部形态称为属性。
5、类变量 和类方法 , 类变量使用@@做前导字符进行声明, 类方法使用ClassName.method_name 来申明。类方法的使用非常常见,例如:.new() 方法,或者一些为方便使用而创建的伪构造器。
一个技巧:在Ruby中私有化默认构造器的方法是:
class MyLogger #类变量的声明方式 @@logger = nil #将默认构建器隐藏 private_class_method :new #申明新的伪构建器,注意这就是类方法的声明方式 def MyLogger.create #新的构建器 end end
6、访问控制:public、protected、private ,Ruby共有3个保护级别:公有、保护和私有,未指定时默认是public。指定访问控制的方式有两种:
A、将方法名称作为参数传入 public、protected 或 private:
class MyClass def method1 #method1. end; public :method1,:method4; protected :method2; private :method3; end
B、 public、protected 或 private 关键字之后申明的方法都是对应控制级别的,例如:
class MyClass def method1 #default is 'public' #method1. end; protected #subsequent methods will be 'protected' def method2 #will be 'protected' #... end private #subsequent methods will be 'private' def method3 # end public #subsequent methods will be 'public' def method4 #and this will be 'pulbic' #... end end
7、代码块block、闭包closure、lambda表达式:
block , 有两种形式:A、包括在{}(花括号中)——适用于单行语句;B、包含在do .... end语句块中——适用于多行语句;block总是出现在方法调用时传入参数的末尾——如果传入参数使用括号()的话,则在右括号)之后,这使得block和目标方法关联起来——在方法中使用yield关键字调用block,可以向block传入参数、也可以从block获得返回值,例如:
def my_fun1(x) y = yield(x); puts "yield(#{x})-->#{y}"; x += yield(x); end var = my_fun1(x){|param| param * 2}; puts "my_fun1(3)--->#{var}";
closure , 闭包是把block作为参数传递给一个调用(参数名称以&作为首字符),Ruby运行时会把该block创建成 Proc对象,还使它持有了定义block时的上下文(如:其中的局部变量),即时此刻上下文已不存在,但closure仍然可以使用其中的变量。
lambda表达式,使得block成为Proc对象,并作为方法调用的返回值,返回给调用者。
数组Array
创建 :Array有两种创建方式:A.字面量——[1,2,3,4],即把数组元素放在中括号里;B.使用Array.new 构建一个数字变量;
元素引用 :数组元素以数字索引进行引用,例如:my_array[0]、my_array[1],索引可以是负数;
元素选取 :可以使用my_array[start_index,length]生成一个新的子数组;还可以用区间的方式来指定:my_array[1..3] 或者 my_array[1...3],两个点的形式包含结束位置的元素,而三个点时不包含结束位置;。
修改元素 :修改数字元素有以下几种形式:
A、my_array[index] = 'A',修改索引位置的元素值为A,如果index大于当前的length,则造成的间隙元素以nil填充;
B、my_array[start_index,length] = 'A';将从start_index位置开始的length个元素替换成'A',如果length=0,则在start_index位置之前插入'A',不删除任何元素;
C、my_array[x...y] = 98,99,将区间描述的元素替换成 赋值符号右边的内容;可以使用my_array[0...3]=[](空数组),删除数组前3个元素;
。。。。。。。。。。。。。,未完待续...
参考:
Ruby学习笔记:
http://hi.baidu.com/zhangna_307/blog/item/218f258c98488a00b31bba84.html
http://hi.baidu.com/zhangna_307/blog/item/9d1ca002b17988643812bbf2.html
http://hi.baidu.com/zhangna_307/blog/item/f6b3ee0f414076f437d12229.html
http://hi.baidu.com/zhangna_307/blog/item/7ac78712d3c5a9115aaf53b2.html
http://hi.baidu.com/zhangna_307/blog/item/f951f5cd667ab10300e92820.html