1.数据类型

Ruby支持的数据类型包括基本的Number、String、Ranges、Symbols,以及true(注意 0为真)、false和nil这几个特殊值,同时还有两种重要的数据结构——Array和Hash。

范围类型 (1..5) 意味着它包含值 1, 2, 3, 4, 5,范围类型 (1...5) 意味着它包含值1, 2, 3, 4 。

 

2.变量

局部变量:局部变量是在方法中定义的变量。局部变量在方法外是不可用的。局部变量以小写字母或 _ 开始。

实例变量:实例变量可以跨任何特定的实例或对象中的方法使用。这意味着,实例变量可以从对象到对象的改变。实例变量在变量名之前放置符号(@)。

类变量:类变量可以跨不同的对象使用。类变量属于类,且是类的一个属性。类变量在变量名之前放置符号(@@)。

全局变量:类变量不能跨类使用。如果您想要有一个可以跨类使用的变量,您需要定义全局变量。全局变量总是以美元符号($)开始。

 

3.常量

常量以大写字母开头。定义在类或模块内的常量可以从类或模块的内部访问,定义在类或模块外的常量可以被全局访问。

常量不能定义在方法内。引用一个未初始化的常量会产生错误。对已经初始化的常量赋值会产生警告。

4. 条件判断

if conditional [then]

          code...

[elsif conditional [then]

          code...]...

[else

          code...]

end

If 表达式用于条件执行。值 false 和 nil 为假,其他值都为真。请注意,Ruby 使用 elsif,不是使用 else if 和 elif。

如果 conditional 为真,则执行 code。如果 conditional 不为真,则执行 else 子句中指定的 code

通常我们省略保留字 then 。若想在一行内写出完整的 if 式,则必须以 then 隔开条件式和程式区块.

5. 循环

each:

[1, 1, 2, 3, 5].each { | val | print val, “ ”}

#结果 1 1 2 3 5

 

upto:

0.upto (9 ) do | x |

 xxx

end

6.

块由大量的代码组成。

需要给块取个名称。

块中的代码总是包含在大括号 {} 内。

块总是从与其具有相同名称的函数调用。这意味着如果您的块名称为 test,那么您要使用函数 test 来调用这个块。

您可以使用 yield 语句来调用块。

 

def   test

     yield 5

     puts "在 test 方法内" yield 100

end

test {|i| puts "你在块 #{i} 内"}

 

7. Ruby关键字

Ruby 把分号和换行符解释为语句的结尾。

# 我是注释,请忽略我。

{code},大括号内可以放程序块

转义字符:

\ 表示转义;\n 表示换行符;

’  ’ 中除了\ 和‘外其他字符无需转义直接原样输出;

“ ”里面的转义字符会进行转义;

 

输出:

print  输出“”内的内容会识别转义符,但 不会 自动化换行

puts   跟print一样输出“”内的内容会识别转义符,但是puts会自动化换行

p  输出的不仅仅是“”内的内容,而且是会把“”也输出,而且 不会 识别转义符,但是会自动化换行

 

8.ruby数组:

Ruby 数组是任何对象的有序整数索引集合。数组中的每个元素都与一个索引相关,并可通过索引进行获取。

数组的索引从 0 开始,这与 C 或 Java 中一样。一个负数的索相当于数组的末尾计数的,也就是说,索引为 -1 表示数组的最后一个元素,-2 表示数组中的倒数第二个元素,依此类推。

Ruby 数组可存储诸如 String、 Integer、 Hash、 Symbol 等对象。

Ruby 数组不需要指定大小,当向数组添加元素时,Ruby 数组会自动增长。

 

arr=arry.new(5) =>[nil,nil,nil,nil,nil,]

arr=arry.new(5,0) =>[0,0,0,0,0,]

arr[i]进行取值

arr.slice(i,j)的取值方法,从i开始取j个,arr.slice!(i,j),提取的子数组,arr为提取后剩余部分

a = [1,2,3,4,5]

p a.slice!(0,2) #=> [1,2]

p a #=> [3,4,5]

 

 

Ruby字符串

Ruby 中的 String 对象用于存储或操作一个或多个字节的序列。

Ruby 字符串分为单引号字符串(')和双引号字符串("),区别在于双引号字符串能够支持更多的转义字符。

 

str.capitalize
把字符串首字母转换为大写字母显示。

str.downcase
返回 str 的副本,所有的大写字母会被替换为小写字母。

str.split(pattern=$;, [limit])
基于分隔符,把 str 分成子字符串,并返回这些子字符串的数组。

str.sub(pattern, replacement)

       返回 str 的副本,pattern 的第一次出现会被替换为 replacement 或 block 的值。pattern 通常是一个正则表达式 Regexp;如果是一个字符串 String,则没有正则表达式元字符被解释。

str.gsub(pattern, replacement)
返回 str 的副本,pattern 的所有出现都替换为 replacement 或 block 的值。

 

哈希(Hash)

是类似 "key" => "value" 这样的键值对集合。哈希类似于一个数组,只不过它的索引不局限于使用数字。

Hash 的索引(或者叫"键")几乎可以是任何对象。

Hash 虽然和数组类似,但却有一个很重要的区别:Hash 的元素没有特定的顺序。 如果顺序很重要的话就要使用数组了。

 

h=hash.new

h=hash[key],使用键,从哈希引用值。如果未找到键,则返回nil。
hash[key]=value,把 value 给定的值与 key 给定的键进行关联。

 

hash.keys创建一个新的数组,带有 hash 中的键。

hash.values返回一个新的数组,包含 hash 的所有值。

 

hash.merge(other_hash) 

hash.merge(other_hash) { |key, oldval, newval| block }返回一个新的哈希,包

含 hash 和 other_hash 的内容,重写 hash 中与 other_hash 带有重复键的键值对

 

 

模块(Module)

是一种把方法、类和常量组合在一起的方式。模块(Module)为您提供了两大好处。

模块提供了一个命名空间和避免名字冲突。

模块实现了 mixin 装置。

模块(Module)定义了一个命名空间,相当于一个沙盒,在里边您的方法和常量不会与其他地方的方法常量冲突。

模块类似与类,但有一下不同:

模块不能实例化

模块没有子类

模块只能被另一个模块定义