变量
引用:变量中保存的是指向某个对象的引用,而不是对象或者数值本身,这意味着存在着多个变量指向同一个对象的可能性。
指向对象a的引用被赋值到变量b中,这就产生了两个变量指向同一个对象的情况。如果通过变量b改变了对象的状态,那么通过对象a的引用访问该对象时,也会看到相同的改变。考虑: 在调用方法时,传递给方法的变量和被调用方法的局部变量都指向同一个对象的情况。
def describe(name) puts "this is a #{name}" name[2] = ?p puts "this is a #{name}" end CATTLE = "Baidu" describe(CATTLE) p CATTLE #结果: this is a Baidu this is a Bapdu "Bapdu"
从这个例子可以看出,describe方法的局部变量name和常量CATTLE都指向了同一个对象。因此,在被调用方法的内部,对象的状态所产生的变量也会影响到CATTLE的状态。
如果在不影响使用对象本身的情况下,需要改变作为变量传递给被调用的方法的对象状态,该怎么办呢?
解决方案: 采用对象复制的方法
def describe2(name) name = name.dup puts "this is a #{name}" name[2] = ?p puts "this is a #{name}" end #结果 this is a Baidu this is a Bapdu "Baidu"
变量的种类: 在ruby中并没有变量声明的语法结构。那么ruby是如何来区别特定的变量种类呢? 变量的种类具体包括: 局部变量,类变量,实例变量,全局变量,常量。由变量的名称决定。
局部变量: 小写字母或_ 使用前先赋值 被def表达式、class表达式和文件的执行这三者隔开
实例变量: @ nil 隶属于某个特定对象的变量
类变量 : @@ 使用前先赋值
全局变量: $ nil 主要用来保持ruby处理系统自身状态或动作控制的标志位
常量 : 大写字母 使用前先赋值
约束: 除了上面的约定(约束)以外,还存在一些习惯上的制约要求。如: 不应像studentName这样的驼峰式命名,应该使用下划线来分割单词:student_name
运算符
运算符较为简单,在这里提醒几个不一样的地方。
1、<=>: 比较两个值的大小 如果前者更大返回-1 一样大返回0 后者大返回1
2、=~:匹配 !~: 不匹配
3、在ruby中没有自增、自减运算符,只能通过a +=1 或 a= a.next来进行代替
4、并行赋值: 这个很有趣,如: a,b,c = 1,2,3值跟变量会一一对应。其中一个很有趣的应用就是两个值的互换。在java或是c中要定一个临时变量作为中间值完成,而并行赋值则不需要,a,b = b,a即可。当等式左右两边个数不同,多余的值会被省略,不足则会用nil代替。
5、多值与数组展开: 利用*来解决,如: a, *b = 1, 2,3,4。这里b=[2,3,4]
另外一种情况是*出现在等号右边 arr = [1,2,3] ; a,b,c = *arr; p a; p b; p c;