Ruby Programming | 连载 09 - Ruby 变量

1,435 阅读3分钟

一、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 也是一个关键字,用来书写条件判断语句。

与局部变量一样,方法调用也可以使用纯单词的形式,比如使用 putsprint 进行输出的时候,并没有使用 ()

在其他情况下可能会产生歧义,Ruby 需要对他们进行判断。

当出现一个普通的标识符时,Ruby 会进行如下处理:

  • 假如标识符是一个关键字,Ruby 会把它当做关键字执行。
  • 加入标识符右边有一个等号,这是变量的赋值过程。
  • 其他情况,标识符被假定为一次方法调用。

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情