`
cnetwei
  • 浏览: 173433 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Ruby之旅_2.特色语法

    博客分类:
  • Ruby
 
阅读更多

Ruby语言的主要特色

编程语言总有相同之处,因为它们的目标是一致的,但每一种语言都有自己特有的部分。从开发者角度看,Ruby语言至少有以下几个与众不同的特色:

  • Continuation:
  • 绿色线程 (green thread):
  • 协同例程(coroutine):
  • 迭代器、生成器、闭包和元编程:

。。。。。

 

ruby.lang 之魔幻语法

0、 变量无需申明即可使用,当 变量 首次被赋值时 便存在了。
特殊类型的变量有特殊符号作为前缀,Ruby使用一种命名惯例来区分变量的类型:

 

  • 全局变量$(美元符号) 为前缀;
  • 实例变量@(at) 符号开始;
  • 类变量@@(两个at) 符号开始;
  • 局部变量、方法参数和名称 ,没有特殊前缀,但要以小写字母或下划线 开始;
  • 常量、 类名称、模块名称都必须以一个大写字母开始;

具体示例如下表所示:

 

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

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics