模板:

主题:x

阐述:y

目录

模板:

主题:参考文献

主题:变量

主题:基本类型

主题:表达式

主题:赋值方式

主题:范围

主题:散列表

主题:符号

主题:类型转换


主题:参考文献

阐述:因为最近ruby的热度下降,因而出了RoR之外的其他领域似乎找不到足够的资料。当然根本原因还是市场不够(至少我是如此看待的)。

因此,此处主要参考的是一本出版于好久之前的书籍。

《Ruby on Rails程序设计 深入剖析与范例应用》

2013年五月第一版

主题:常量

阐述:所谓常量就是在程序运行过程中固定不变的量。ruby语言有自己的命名规则,从而可以方便的从名字上来判断哪个变量时常量,哪个是白能量。

创建常量

Ruby是一种弱类型脚本语言,这意味着Ruby常量创建时无需指定特定数据类型。但是常量必须以大写字母开头。

Weekdays = 7

在类似C#等强类型的编程语言中,常量一旦被定义,其值不会被改变。而且只可以对常量进行一次赋值。而在Ruby语言中,若对已定义的常量进行赋值,却不会出现错误,而是出现警告信息。

mkdir ruby-exercise
cd ruby-exercise
vim hello.rb

Words = "hello, world!"
puts "#{Words}"

ruby hello.rb

测试hello.rb,成功

注意:在Ruby中常量只能定义在类、模块和主程序中,而不能定义在方法中。

常量作用域

也可以在Ruby源文件中定义顶层常量,常量的作用域就是定义常量所在的类或者模块的 的内部。还可以在该类的子类中访问该常量。也可以在Ruby源文件中定义顶层常量,顶层常量可以在任意的地方引用它,这是因为定义的任何类、模块和方法都位于顶层对象的内部。

class Parent    # create parent class
        NAME = "somebody"    # define constant
        puts NAME    # visit constant inner parent class
        def info    # create method
                puts NAME    # visit  constant in parent method
        end
        class TestParent    # create inner class
                puts NAME    #visit constant in inner class
        end
end
class Child < Parent    # create child class
        puts NAME    # visit constant in parent class
end

如果超出上面的范围指定常量,则可使用“::”操作符来访问。若想要准确地访问任何顶层对象类中的变量,也需要使用“::”操作符。但是操作符左边的限定类为空。

如果一个内部类还有一个父类,且父类和外部类中包含了一个同名的常量,则内部类将优先使用外部类中的常量。只有在外部类中找不到该常量时,才会使用父类中的常量。

主题:变量

阐述:无论在何种应用程序中,数据都必须以某种方式表示。除了常量,最常用的就是变量。按照作用域可以将Ruby中的变量分为局部变量和全局变量。

局部变量

变量是指用于容纳一个值在内存中一块专属的存储位置。用户必须为每一个变量指定一个唯一的名称,使用这个唯一的名称访问这个变量中存储的值。

在Ruby语言中,为了与常量区分开来,局部变量必须以小写的字母或者下划线开头。

局部变量可以定义在类内部、模块内部或者方法内部,当对一个小写字母开头的变量进行赋值时,就创建了一个局部变量。该局部变量的作用域仅限于该类、该模块或者该方法,一旦离开了局部变量的作用域,则该局部变量会自然消失。

Ruby中局部变量不可以在内部类和子类中访问,深圳不可以在当前类的方法中被访问。

class Parent
  str = "Ruby";
  def showstr
    puts str;           #在方法中访问类的局部变量,出错
  end
  class InnerClass
    puts str;           #访问外部类中的局部变量,出错
  end
end
class  Child < Parent
  puts str;              #访问父类中的局部变量,出错
end

每个类和方法都可以认为是顶层对象的内部类和方法。所以即使定义了一个顶部局部变量。该变量的作用于是整个程序,但是在类、方法和模块中,依然无法访问该局部变量。

注意:在Ruby语言中的方法命名也是以小写字母或下划线开头,如果方法没有参数,还可以省略方法后面的括号。因此在程序中,必须仔细分辨到底调用的是方法还是局部变量。

全局变量

如果需要在方法中使用外部变量,则可以创建全局变量。Ruby语言中的全局变量时以“$”开头的变量。

其实在Ruby任何地方都可以定义全局变量,如类、方法和模块中。但是应该注意,虽然全局变量的定义域是全局,但实际上是从定义全局变量的语句开始,直到程序结束。如果引用尚未初始化的 全局变量,其值为nil。

Ruby语言还提供了一系列的全局变量,这些全局变量都具有特殊的含义。

ruby语言自带的全局变量
$!    最近一次的错误信息
$@    错误产生的位置
$_    gets最近读的行数
$.    解释器最近读的行数
$&    最近一次与正则表达式匹配的字符串
$~    作为子表达式组的最近一次匹配
$n    最近匹配的第n个子表达式
$=    是否区分大小写标志
$/    输入记录分隔符
$\    输出记录分隔符
$0    Ruby脚本文件名
$*    命令行参数
$$    解释器进程ID
$?    最近一次执行的子进程退出状态

主题:基本类型

阐述:数据类型时编程语言中对数据进行描述的定义,因为对于计算机不能识别数据,而不同数据间的相互运算在计算机内部的执行方式并不一样,需要用户显定义数据的特性再进行其他操作,这里的特性就是数据类型。虽然Ruby是一门弱类型的语言,但是依然提供了丰富的基本数据类型。

数值类型

Ruby语言中的数值类型包括整数和浮点数。整数包括Fixnum和Bignum两种类型,其中Fixnum类型可以容纳比一个物理字长少一位的整数。当一个整数超过Fixnum范围时,它会自动转换成Bignum类型,而Bignum类型的取值范围只能被物理内存所限制。

如果对一个Bignum类的数整数进行算术计算,最后的结果使得它可以用Fixnum类型保存,那么结果就会返回一个Fixnum对象。

调用使用class方法,可以查看当前变量的数据类型。

一个带有小数点或指数的数字被认为是Float类型,数值中的下划线将会被忽略。

字符串

在Ruby中字符串是任意顺序的字节。通常,它们是一个字符序列。在Ruby中最简单的就是使用单引号或者双引号来指定一个字符串。

使用单引号的字符串会原样输出,而双引号的字符串可以使用表达式。

除了使用单引号和双引号之外,还可以使用%q来代替双引号定义字符串。

运算符和表达式

运算符是一个特殊符号,可以接受一个或者多个变量(即操作数)作为输入并返回值。运算符指定了要执行的操作类型。

Ruby提供了大量的运算符,根据运算符的作用,大致可以分为:赋值运算符、算术运算符、比较运算符、逻辑运算符、位运算符和三目运算符等。

赋值运算符

赋值运算符用于为变量指定变量值,Uzi常见的是“=”。

算术运算符

算术运算符是最简单的,最常用的运算符,可以进行通用的数学计算。

+  -  *  /  %  **

比较运算符

比较运算符用于确定一个操作数与另一个操作数之间的关系,即进行比较运算。比较运算符的结果为布尔类型。取值为true或false。通常作为判断或循环的条件。

>=大于等于

==等于

!=不等于

<=> 比较两个对象,根据大于、等于或小于的情况,分别返回1,0和-1

=== 当左边的对象是一个普通对象时,其与==作用相当,而当左边的对象是一个Range对象时,右边对象在Range内时,返回true,否则返回false

=~ 正则表达式配对

!~ 正则表达式不配对

逻辑运算符

逻辑运算符把多个操作数连接起来组成一个逻辑表达式,判断某个表达式是否成立,结果是逻辑值。(true或false)

对于逻辑运算符,操作数必须是布尔类型,逻辑运算的结果也必须是布尔类型。

位运算符

位运算符主要用来读操作数的二进制位进行运算,运算结果为一个整数。

& 按位进行与运算

| 按位进行或运算

^ 按位进行异或运算

~ 补码运算

>> 右移位运算

<< 左移位运算

三目运算符

三目运算符又称为条件运算符,之所以称为三目运算符是因为该运算符需要3隔操作数。在编程过程中,使用该运算符可以计算一个条件,如果条件为真,就返回一个值;如果条件为假,就返回另一个值。

运算符优先级

级别

1  逻辑运算符

2  惩罚运算符

3  加法运算符

4  位运算符

5  比较运算符

6  位运算符

7  逻辑运算符

8  三目运算符

9  赋值运算符

当表达式包含多个运算符时,运算符的优先级控制各运算符的计算顺序。

主题:表达式

阐述:表达式是指一个或多个运算符合操作数共通作用以完成某项计算的组合。计算后的值通常是一个数,但也可以不是,参与运算的操作数可以是文本、常量、变量或者其他数据资源。

表达式的计算与使用方式是编写程序的基础。

一个表达式通常有两部分组成,一部分是操作数,一部分是运算符。

当在一个表达式中同时存在多个运算符时,运算符的优先级决定了表达式的决定顺序。,运算符的组合性决定了表达式的执行方向。

主题:赋值方式

阐述:

Ruby语言中为比变量或表达式赋值的方式更为灵活。

  并行赋值:可以同时为几个变量赋值,另外,并行赋值还可以分解可扩展数组。

嵌套赋值:对于嵌套赋值方式,可以认为是并行赋值中又嵌套了并行赋值。

使用嵌套赋值时,可以将左边变量中的一些变量使用括号括起来,形成一个子并行赋值的变量列表。

主题:范围

阐述:在其他编程语言中要表示一个范围(Range)可能需要采用枚举的方法来定义。

而Ruby提供了一种简单的方式来定义。即只需定义两个边界。有如下两种方式:

值1..值2:包括值1和值2 的方式以及中间的一系列值。

值1...值2:包括值1,但是不包括值2。

下面列出Range类的一些常用方法:

to_a:将该范围转换成一个数组;

include?(targetValue)/===(targetValue):判断该范围是否包含了targetValue;

min()/begin()/first():求该范围的最小值;

max()/end()/last():求该范围的最大值

除了使用方法之外,范围对象还可以使用如下3个常用的迭代器方法:

reject:将该范围转换成一个数组,并剔除掉满足条件的元素;

select:将该范围转换成一个数组,只选择满足条件的元素;

each:地带范围中的每个元素。

在范围对象中,还可以定义字符范围

a="a" .. "z"
a.each do |i|
  print "当前元素为:" +i
end

主题:散列表

阐述:  散列表是Ruby中的一种容器(Hash)对象,它包含的key可以是任意的元素,而不像数组必须是连续的整数。因此,通常情况下称Hash对象为关联数组对象或者字典对象。

定义散列表

每个Hash 对象由两部分组成:key和value。key和value之间通过=>隔开,多个key-value之间通过,分隔开。

student={
  "name"=>"haoxy",
  "age"=>22,
  "sex"=>"male"
}

即,所谓的Hash对象就是把任意对象当做索引来构造数组。

注:在Hash对象中,如果同一key指定了两个值,那么后面指定 的值将会覆盖前面的值。

每一个hash对象都是hash类的实例。因此可以通过创建hash类实例的方式来创建hash对象,创建hash对象后,动态添加元素。

student=Hash.new

操作散列表

创建了散列表之后,通过Hash类的方法可以查看散列表的长度、删除指定元素、获取所有key 和获取所有value等操作。如下为常用的方法:

size()    返回Hash对象的大小

length()    返回Hash对象的长度

include?(key)    判断指定的Hash对象是否包含指定的key

has_key?(key)    判断指定的Hash对象是否包含指定key

delete(key)    删除Hash对象中指定key的对应元素

keys()    返回由Hash对象中全部key组成的数组

values()    返回由对象中全部values组成的数组

遍历散列表

在遍历Hash对象元素时,使可以使用Hash对象的迭代器方法。Hash对象支持常用的四个迭代器:

each:迭代输出Hash对象里全部元素(包括key和value)

each_key:迭代输出Hash对象里的所有key

each_pair:迭代输出Hash对象里的所有key-value对

each_value:迭代输出Hash对象里所有value

注:在each迭代器中如果只使用一个参数,则该参数依次遍历素有的key和value

主题:符号

阐述Ruby中符号更像一个字符串,因为其内部表现形式是一个字符序列,所以字符串与符号对象一一对应。但是与字符串不同,每个符号的实例只有一个,一个特定的对象名总是产生相同的符号对象,不论对象名在程序中如何被使用(不论对象的值如何变化,不论对象时方法还是一个标志符)。

符号对象时一个字符串、一个方法、一个类或一个标志服的内部表示形式。类似与对象的id,可以在对象名前加上一个:来创建符号对象。

:标志符

:变量名

:操作符

#下面代码演示创建符号的方法
a=10
b=:a
a="Ruby"
c=:a
puts b==c
puts b==:"a"
def show
  puts "Hello World"
end
d=:show
put d=:"show"

而上述代码运行的结果如下:

true

true

true

从上述结果中可以得到一个结论:只要对象名相同,该对象总是产生相同的符号对象。因为字符串和符号对象之间一一对应,因此字符串和符号对象之间可以通过to_s和to_sym方法回想转化。除此之外,每个符号对象都有唯一与之对应的整数值,这个整数值可以使用to_i方法获得。

Ruby把系统中所有symbol对象都放在运行时维护的一个符号列表里,而这个符号列表是一个原子数据结构,其中存储着当前所有的全局标识符,并且保证相同的标识符不会出现多个对象。几乎每一种语言和系统都会有这样一个符号表,只不过在C和Java等语言中,这个符号表只是在编译时存在,运行时消失。而Ruby在运行时也保留这张符号表。

符号对象最常用的地方是用来代表变量名或者方法名。

如下为定义存储器的代码:

class Person
  attr_accessor  :name
end

除此之外,还有另外一种创建符号对象的方式,称为“%表示法”

book = "Ruby"
a= :book
b= %s{book}
puts a==b

结果为true

主题:类型转换

阐述:所谓类型转换就是指将一种数据类型转换为另一种数据类型。Ruby提供了很多内置的方法用于数据的类型转换,其中最常见的有以下方法:

to_s方法:转换成字符串;

to_i方法:转换成整数;

to_f方法:转换成浮点数;

to_a方法:转换成数组;

to_time方法:转换成时间;

to_date方法:转换成日期。

上述转换方法不是所有对象都有,但是原理上都一样,并且使用方法也基本相同。

在转换过程中注意,Ruby不会自动将字符串转换成整数。如果要转换的整数没有对应整数的情况会将数据转换成0。