Ruby变量和常量

变量是程序设计不可缺少的东西。所谓变量,可以想象是贴在“东西”上的铭牌。给对象贴上铭牌,可以写成:

变量名 = 对象

这个动作被称为“将对象赋值给变量”。如:

	num = 10
	age = 18
	name = 'TAKAHASHI'


和JAVA的变量一样,Ruby的变量标识的也是对象的引用。当然基本类型指向的还是实际对象,赋值后会新建对象。这点和JAVA也是一样的。

变量的意义

我们为什么要设置变量呢?个人认为有以下的原因:

  1. 可以在多个地方复用,在修改时仅需要修改一处即可
  2. 让数值的意义更加明确

变量的种类:

Ruby有4种变量:局部变量、全局变量、实例变量、类变量、虚拟变量。在Ruby中变量是哪一种变量是由变量的名称决定的。

1)局部变量

变量名以小写字母或是“_”起始的变量。

2)全局变量

变量名以“$”起始的变量

3)实例变量

变量名以“@”起始的变量

4)类变量

变量名以“@@”起始的变量

5)虚拟变量

虚拟变量无法自己定义,但是能像变量一样被使用的特殊名称。如:“true”、“false”、“self”就属于虚拟变量。

局部变量的“局部”是指变量的有效范围是局部性的,也就是说在某个地方使用的变量在其他地方是无法使用的。

全局变量同局部变量是相反的。全局变量可以在程序的任何地方使用,只要名称相同就一定是同一个变量。

实例变量不同于局部变量,它在离开方法后依然存在,但是不同的实例下的值是不同的。

对于类变量来说,类变量是该类所有实例共用的变量,虽然类似于常量,但是变量值是可以修改的。有点类似于JAVA中类static变量。

这里我们要说一种特殊的实例变量,类实例变量。我们知道类也是一种对象,它是Class的实例,所以也会拥有自己的实例变量,这种特殊的实例变量被称为类实例变量。类实例变量只可以被类访问,不可以被它的实例或是子类访问。

class MyClass
  @my_val = 1
  def self.read
    @my_val
  end

  def write
    @my_val = 2
  end

  def read
    @my_val
  end
end

obj = MyClass.new
obj.write
p obj.read #=> 2
p MyClass.read #=>1
p MyClass.singleton_methods #=>[“read”]


类变量同类实例变量的不同

类变量可以被子类或类的实例所使用,但是类实例变量不可以。对于类变量来说,有一个不好特性:


@@v= 1
class MyClass
  @@v = 2
end
p @vv #=> 2

从以前程序的理解上来说,这个结果有些不可思议,但是仔细分析一下这个结果还是正常的。

类变量不是真正的属于类--它们属于类体系结构。由于@@v属于main上下文,也属于Object,所以也属于Object的所有子类,那么MyClass中的@@v同main中是同一个变量。

在实际程序中要多注意吧,有可能还是用类实例变量。

变量的作用域

Ruby中没有嵌套作用域的概念。它的作用域是相互隔离的:一旦进入一个新的作用域,原先的绑定就会被替换为一组新的绑定(局部变量、实例变量、self……)。

class、def和module被称为作用域门,因为每当遇到它们,就一定会进行作用于切换。

按照JAVA的经验,作用域讲到这里就差不多了,但是Ruby提供了一个非常神奇的方案可以让绑定穿过作用域门,从而达到让多个作用域间可以共享各自的变量——扁平作用域。

我们使用Class.new代替class,使用Module.new代替module,Module#define_method()代替def。利用闭包的特性,形成了扁平作用域。可以在一个扁平作用域中定义多个方法,则这些方法都受到同一个作用域门的保护,并共享绑定,这种技术称为共享作用域。

常量

常量类似于变量,也是对象的铭牌,但是与变量不同的地方是,值只能赋值一次,之后就不能再赋值了,否则会抛出“already initialized constant”。

常量的名称必须以大写字母开头。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值