一、Ruby 的变量
Ruby 中的变量分为全局变量和局部变量,局部变量是以小写祖母或者下划线开头,有字母和下划线组成的。
比如以下变量的命名都是合格的:a,_a, name, last_name 等。
局部变量表示变量的作用域是有限的,一个局部变量仅仅在程序中的有限部分是可见的,如在一个方法的定义中,局部变量的名称可以在不同的作用域中复用,也就是说可以在多个位置使用相同变量名的变量。
只要这些位置有不同的作用域,即使变量名相同也会被认为是两个不同的变量。
# Ruby 的变量 def say_hi info = "Elixir" puts info end def start_here info = "Scala" puts info say_hi puts info end start_here 复制代码
当调用 start_here 方法时,info 变量被赋值为 Scala,接着 start_here 方法内调用 say_hi 方法,say_hi 方法内将另一个同名的 info 变量赋值为 Elixir,所以最终输出结果为:
Scala Elixir Scala 复制代码
变量、对象和引用
变量的赋值,简单看起来是左边的变量被设置了与右边的对象相等,如 info="Elixir"
,当调用 put 方法输出 info 变量时,打印出的内容为 Elixir
,当然右边的对象也可以是一个变量。
def say_goodbye str = "Hello" abc = str str.replace("Goodbye") puts str puts abc end say_goodbye 复制代码
执行上述代码,输出结果如下:
Goodbye Goodbye 复制代码
上述代码中只对 str 变量进行了替换,为什么 abc 变量的内容也发生了改变?
在 Ruby 中,变量保存的并不是对象的值,而是包含了对象的引用。
在一个以左边变量名称和右边对象构成的赋值表达式中,变量接收的是一个指向对象的引用。在一个从变量到另一个变量赋值中,左边变量会接收到存在有变量的一个引用,最终使得两个变量包含了同一个对象的引用。
Ruby 中的每一个对象,一定有一个或者多个引用,如果没有引用,则可以认为对象是非存活的,它所在的内存空间将会被释放掉。
变量的重新赋值
当给变量赋值时,当把变量放置在左边用等号与右边的对象关联的时候,就开始了这样的一个过程:变量被清理,重新赋值。
info = "Ruby" message = info info = "Elixir" puts info puts message 复制代码
执行上述代码,输出结果如下:
Elixir Ruby 复制代码
上述代码中第二次给 info 变量赋值时,info 变量被指向了另一个字符串对象,而 message 还是指向 “Ruby” 字符串对象。
Ruby 对象通常描述为对象的标签或者名称。
Ruby 中的关键字
关键字是一组不能用于变量命名的保留词。比如 def 就是一个关键字,它的作用是定义一个方法;if 也是一个关键字,用来书写条件判断语句。
与局部变量一样,方法调用也可以使用纯单词的形式,比如使用 puts 和 print 进行输出的时候,并没有使用 ()
。
在其他情况下可能会产生歧义,Ruby 需要对他们进行判断。
当出现一个普通的标识符时,Ruby 会进行如下处理:
- 假如标识符是一个关键字,Ruby 会把它当做关键字执行。
- 加入标识符右边有一个等号,这是变量的赋值过程。
- 其他情况,标识符被假定为一次方法调用。