2021.4.26
Ruby语言基础
一、常量:首字母大写,尽量全部大写。作用范围:定义常量所在类或模块内部,父类存在与顶层常量重名的常量,在子类中优先引用父类。
二、变量:小写字母或_开头。局部变量作用域在所属的类、模块或者方法内部。全局变量是以$开头的变量,作用域在全局。
三、基本类型:1.数值类型:整数和浮点数。.class可查看当前变量的数据类型。
2.字符串:单引号原样输出,双引号可以输出表达式。
四、运算符和表达式:**为乘方运算, 条件表达式?结果1:结果2 三目运算符。并行赋值: a,b=c,d------a=c,b=d
五、范围:值1..值2:包括值1和值2及中间的值,值1...值2:值1到值2,但不包括值2。 to_a:将范围转换为数组。===可判断前者是包含后者。min()/begin()、first():求范围最小。max()/end()/last():求范围最大
.reject{条件}:将范围转化为数组,删除满足条件的元素。.select{}:只选择满足条件的元素组成数组 .each do |i|:循环迭代范围所有元素。
六、散列表:每个hash由key和value组成。符号:a=10 b=:a创建了符号对象。to_s:转换为字符串 to_i:转为整数 to_f:转为浮点数 to_a:转为数组 to_time:转为时间 to_date:转为日期
七、if语句 if elsif else 语句 if修饰句 (unless条件then 语句1;else 语句2; end):条件为假执行1,为真执行2 case语句:case表达式 when值1 then 语句1;.......else 语句n+1;end
while表达式do 语句块;end until语句:until条件表达式do 语句 end (for in语句):for 变量名 in 集合 do 执行语句;end loop语句:loop{循环体} break跳出
next语句与redo语句:结束本次循环开始下次循环。next先检查条件是否成立开始下次循环 redo语句不检查直接开始下次循环。
八、数组:(1).unshift方法:向数组的头部添加数组元素;(2).push方法:向数组的尾部添加数组元素;(3)<<方法:向数组的尾部添加一个数组元素。shift方法删除头部元素,pop方法删除尾部元素。 截取数组:(1)array[n,m]:截取从索引n开始,长度为m的元素列表,组成新数组;(2)array[n..m]:截取从索引n开始,到索引m的元素列表(包括索引为m的数组元素),组成新数组;(3)array[n…m]:截取从索引n开始,到索引m的元素列表(不包括索引为m的数组元素),组成新数组。 合并数组: 数组1.concat(数组2)。字符串单引号会输出转义字符,双引号不会输出专业字符。.replace("替换内容");
.dup 和 .clone 复制字符串 .equal?("")比较字符串是否相等
九、正则表达式。1定界符: / 模式 / 修饰符i、m、s、x、u一般放在正则表达式的后面比如 /模式/i表示不区分大小写进行匹配。 预定义字符以\开始后跟一个字母。使用=~运算符配正则表达式返回模式位置。使用/模式/.match(数组)返回实例。
十、类 声明一个类,定义一个方法,关系表达式,实例化一个类,调用定义的方法。 定义类的名称首字母必须大写,#{self}:self关键字可以输出类的名称。类的实例化:对象名=类名.new;调用new关键字实例化一个对象。 使用点(.)操作符调用类中定义好的方法、属性和变量等类成员 Ruby中在调用方法时可以使用方法名后紧跟“()”的形式调用方法如:zhu=Student.new(); 构造函数名称必须是initialize 如 def initialize name,age initialize后跟参数。实例化嵌套类时,需要使用“外部类::内部类.new”的格式实例化内部类,还可以使用“class外部类名::内部类名”的格式。 Ruby支持使用类名称直接访问的方法,即类方法。类方法的定义和实例方法的定义不同,定义类方法时,要在方法名前增加类名称。在Ruby中还可以通过“self.类方法名”形式声明类方法 定义类变量的地方和定义实例变量的地方相同,类变量的变量名需要以“@@”开头,并且类变量属于某个类。所以在类的某个实例改变类变量时,所有实例调用的类变量都发生改变。 (1)attr_reader方法:创建只读属性;(2)attr_write方法:创建只写属性;(3)attr_accessor方法:创建读写属性;(4)attr方法:产生读属性和可选写属性。其中,attr方法第二参数值为true将定义读写属性,如果没有设置或者设置为false,将创建只读属性。 继承的语法非常简单,在定义派生类时,只需要在派生类的后面添加“<”和基类名称。 在派生类构造函数中,可以使用super关键字显式调用基类的构造函数,即调用基类的initialize方法。当在派生类方法里使用super关键字时,Ruby会自动把它转换成调用基类中的同名方法。也可以说,在派生类定义与基类同名方法时,使用super关键字保留基类方法的原有代码。
十一、程序会先执行BEGIN块,然后是输出语句,接下来是END块, 多个BEGIN块按照文件加载的顺序执行,而END块以它们出现的相反顺序执行。 模块的定义语法与类相似,只是使用的关键字不同,定义模块时需要使用module关键字,模块中可以像类一样定义实例变量、实例方法、类变量、类方法和属性等,并且在模块中还可以定义类和模块,同样在类中也可以定义模块。 模块被包含在类中,这样类就可以访问模块的实例成员,包含操作由include方法实现。 命名空间 使用“模块名::类名”的形式实例化模块内部的类,然后调用类的实例方法。 创建线程:thread=Thread.new do 块 End实例化,t=Thread.new do 线程体; End 在Ruby中通过调用Thread类的current方法可以返回当前运行的线程, 在Ruby中通过调用Thread类的join方法可以挂起当前线程,从而执行指定的线程,直至执行完指定线程,然后再执行挂起的线程。使用Thread类的pass方法可以暂停线程,并执行其他线程。与前面介绍的Thread类方法不同,pass方法是Tread类的类方法,所以需要使用Thread.pass形式调用。要停止一个线程可以调用Thread类的exit方法或者kill方法,这两个方法在停止线程时会将线程完全退出。使用sleep方法可以休眠当前线程一段时间。一旦时间结束,线程会自动从休眠状态变为可执行状态。Ruby语言还可以使用stop方法将一个线程设置成休眠状态,使用wakeup方法唤醒指定线程。 在Ruby中使用rescue语句和ensure语句来捕获异常。rescue语句用于将程序从异常中跳出,前提是程序需要包含在begin和end块中;ensure语句用于处理产生异常之后的清理工作,像系统资源的回收,还可以使用raise语句手动抛出异常。raise语句语法格式如下: raise异常类的名称, 异常消息字符串