第三章:Ruby 编程基础:变量及变量作用域
局部变量;
1. 命名规则:以小写字母或者下划线开头;
2. Ruby中的方法调用也是以小写字母或下划线开头,而且调用的方法如果没有参数,则可以省略方法后的括号;
3. 局部变量的定义:类、模块、方法的内部,当我们对一个以小写字母开头的变量进行赋值时,就声明了一个局部变量;离开范围局部变量消失;
4. 允许定义顶层局部变量,但在类、方法、模块定义内仍无法访问该变量;
5. 局部变量不可以在内部类、子类中访问;类中的方法不可以访问该类中定义的局部变量(平级);;
6. 在声明局部变量的类、模块、方法内,局部变量从声明该变量处开始生效,随类、方法、模块的定义结束而结束;
全局变量;
1. 命名规则:以“$”开头;可以在任何地方访问;
2. 通常应避免使用全局变量,因为它的使用会引起各模块间的高耦合。
3. 全局变量无需声明,引用尚未初始化的全局变量,其值为nil;
4. 定义:可以在类、模块、方法的定义中进行全局变量的定义;
5. 全局变量的作用范围是从全局变量的定义语句开始,直到程序结束;
6. 动态语言的特征:当定义一个方法时,该方法根本不会被解释,只有真正调用该方法时,该方法才会被解释。
7. Ruby提供了一系列常用的全局变量;如;错误为止,解释器进程ID;
实例变量;
1. 命名规则:以“@”开头;每个实例变量都是在第一次出现时动态加入对象;
2. 实例变量通常在方法中定义;
当在方法中声明实例变量时,该实例变量事实上属于该方法所在的类,而不是该方法;
虽然实例变量是属于类的,但大部分时候我们都是在该类的方法里定义实例变量;
3. Java在创建对象时一次为该对象的所有实例变量都分配了相应的内存空间;
Ruby语言里的对象完全是动态的,创建对象时该对象没有任何实例变量,直到执行到为实例变量定义时,该对象才动态增加该实例变量;
4. 生存范围:与该类对象的生存范围相同,只要该类对象存在,则该对象里的实例变量将一直存在;
但局部变量则会随着方法的消亡而消亡(除非使用闭包);
5. 实例变量的访问范围总是:private,即在类定义内对实例变量的赋值和读取没有限制;在类外访问实例变量时,则可以通过方法来访问;
6. 属性定义:1.用实例变量;2.用Module的方法(四个方法:attr,attr_reader,attr_writer,attr_accessor;示例:attr:color,true;);
7. 在模块中定义实例变量,目的是将该实例变量混入其他类中;(模块是无法创建实例的);
8. 类范围内定义的实例变量是Class对象的实例变量;
9. 实例变量永远都不能暴露为public,只能通过类方法(类名.方法名)暴露;
类变量;
1. 命名规则:以“@@”开头;从第一次开始赋值的地方开始生效;
2. 定义:可以在类、模块、方法的定义中定义类变量;(在方法中定义的变量只有在该方法被调用后,该类变量才会生效)
3. 访问:可以在类中的特殊方法、实例方法等处对类变量进行引用和赋值;
4. 类变量必须先定义,然后才可以使用,否则异常;
5. 类变量的特殊性:一个类、其子类、它们的实例:的同名类变量共享了同一块内存区域(都引用了同一个变量);
6. 可以在模块中定义类变量,所有混入该模块的类,共享该模块中定义的类变量;仍然共享内存区域;
7. 类变量与常量:
*类变量可以重复赋值;常量重复赋值时发出警告(不是错误);
*类变量默认是protected的,不能在类外部直接引用;(可在继承类中以用或赋值);
类变量与实例变量:
*在类范围内定义的类变量,可以在该类的方法中访问;而实例变量则不行;
*类变量可在子类中引用或赋值,但实例变量可在类范围内直接引用或赋值;
伪变量;
1. 伪变量可以方便的访问Ruby环境信息;
2. 包含伪变量:self、nil、true、false、__FILE__、__LINE__;
3. 伪变量是只读的;
基本数据类型;
1. Ruby是弱类型的语言,但依然有丰富的基本数据类型;基本数据类型也是一个变量,系统有与之对应的类;
2. 基本数据类型变量也可以调用该类里定义的实例方法;
3. 弱类型语言:
*使用变量无需声明类型;(使用一个变量,无需事先定义);
*当为一个变量赋值时,就定义了该变量,该变量的数据类型就是被赋值的数据类型;
*同一个名称的变量的数据类型可以变化;
4. 数值型:包含整数(Fixnum,Bignum)、浮点数(Float);
*基本数据类型也是对象,系统有类与之对应,如5是Fixnum类的实例(对象),可执行对应类的方法,如一些迭代器;
*Bignum:大于等于2的30次方的整数。Fixnum小于改值;
*整数前可带的:可选符号标记符(正数,负数)、可选进制标记符(0八进制、0x十六进制、0b二进制);
*puts ?A #输出大写字母A对应的ASC||码值;
*注:键盘上的某个键和Ctrl或Alt组合时,有固定的算法;和Ctrl组合:ch&0x9f;和alt组合:ch|0x80;
*Float:带有小数点的字符串;带有指数的字符串;
5. 字符串:
*字符串是String类的实例;String是很强大的内建类,重要;
*可用单引号、双引号创建字符串;
*对单引号括起来的字符串,执行较少替换;对双引号括起来的字符串,执行更多替换;
*多行字符串:%Q/stuff/ (类似于双括号,进行较多替换)、%q/stuff/ (类似于单括号,进行较少替换);
6. 多行字符串的字面值:使用Here Documnet;(P91,用的时候再说)
范围:
范围(Range):是多个枚举值的一种简单表示形式;创建作为序列的枚举有两种语法;
*语法一:1..10 #=>1,2,3,4,5,6,7,8,9,10
*语法二:1...10 #=>1,2,3,4,5,6,7,8,9
*范围是一个对象,是Range类的实例;可调用多个常用方法和三个常用的迭代器;
*允许使用自定义的类对象来创建Range对象;(要求该自定义对象的类必须实现一个succ方法,以返回一个值;而且该对象必须支持<=>来与其他对象进行比较);
正则表达式;
1. 是一种常用的模式匹配技术;匹配满足一定规则的文本内容;
2. 正则表达式是Regexp类的实例,
3. 创建;Regexp.new("abc");
%r{pattern};
4. P97,用到的时候再说;
数组;(P101,用时细看)
1. 弱类型语言,数组里的数据元素类型可以互不相同;而且数组的长度也是可变的;
2. 定义(创建):
*可以使用一系列在方括号中用逗号分隔的对象引用来定义,方括号中的最后一个逗号会被忽略;
*可使用范围:my_array[4] = 3..5;
*数组时Array类的实例,通过创建Array类的实例来创建数组;
3. 数组的%表示法:将包含多个空格的字符串转换为数组;
*%W{...} 会进行更多额外的替换;
*%w{...} 少的替换;
4. 数组的常用方法:P102;
Hash对象;
1. RUby提供两种容器对象;数组、Hash;----两者是统一的,数组时Hash的特殊形式;Hash中包含的元素的Key是任意的;而数组中包含的元素的Key是连续的整数;
2. Hash对象可被称为:关联数组对象、字典对象;
3. 定义(创建):
*方法一:key=>value;
*方法二:Hash.new,然后动态添加元素;
4. 操作Hash对象:(P105)
符号对象;(P109,应用?)
1. 符号(Symbol)对象:是一个字符串、一个方法、一个类、或者一个标识符的内部表示;
2. 定义:
*可以在对象名前加一个冒号来产生符号对象;
*%r{...}
3. 只要对象名相同,该对象总是产生相同的符号对象;
4. 有的语言称之为:内部化、或者驻留;
运算符;
1. 算术运算符:
*+、-、*、/、%、**;
2. 赋值运算符:
*=;
*可连续赋值:a=b=c=d=4;
3. 位运算符:
*&:按位与;
*|:按位或;
*~:按位非;
*^:按位异或;
*<<:左位移;
*>>:右位移;
4. 比较运算符:
5. 逻辑运算符:
6. 三目运算符:
7. Ruby中运算符的含义:运算符实际上是方法;例如:p 5.+(5);
比较运算符;
1.
局部变量;
1.
局部变量;
1.
局部变量;
1.
局部变量;
1.
局部变量;
1.
局部变量;
1.