由于平时主要使用Java语言进行开发,对Java比较熟悉,因此我决定学习Ruby就从Ruby对象相关的知识入手,以便能尽快上手。今天首先了解一下Ruby的类中都有哪些类型的变量和常量,以及他们与Java的不同。
 
  Ruby中共有5种变量:local variable, instance variable, class variable, global variable以及constant。这几种变量的写法都有规定的格式,local variable以小写字母或者下划线开头,intance variable以@开头,class variable以两个@开头,global variable以$开头,constant以大写字母开头。Ruby中的变量都无需提前声明,直接赋值使用即可,而Java中需要首先声明变量的类型,不过这里需要注意,不声明变量了,有时就容易忘记给它赋一个初始值,如果我们没有给变量赋值,那么Ruby会附给他一个nil(Java中是null),当我们调用一个nil对象的方法时(nill对象没有方法,我们以为它不是nill)的时候,Ruby解释器会报错,类似Java中的NPE,在Java中这种情况通常在编译的时候就会被发现(local variable没有赋值的话)。最后比起Java,在类型上Ruby多了一种global variable,其他几种变量与Java中的使用方法也略有不同,下面详细说。

  在ruby的类中,所有成员变量都是private的,instance variable以及class variable全都是private的,要想使用这些变量必须通过accessor方法,这点与Java完全不同,不过这样的限制其实也可以帮助避免像在Java程序中的直接暴露对象内部数据的情况。

  Ruby中的local variable和Java中的相比,除了命名上的要求外,行为都是一样的,定义在方法或循环中的local variable只在定义的方法或循环中可见。

  instance variable与Java中的也基本相同,只有当前的实例可以访问。

  class variable也与Java中(static)基本相同。

  global variable在Java中没有对应的概念,声明后对整个程序可见,不过还是尽量避免global variable吧。

  在实验的过程中碰到了这样一个问题,代码如下:

class Test
  @count=0

  def index
    @count+=1
  end
end

test = Test.new
test.index


  执行以上代码后,解析器会报"undefined method '+' fornil:NilClass",很明显,解析器认为count变量仍然为nil。可是在类的一开始count不是就被初始化了吗,怎么还是nil呢?后来在论坛上[link]提问后得到指点。原来在Ruby类中,方法外执行的语句(当然包括给变量赋值这样的语句)只是在这个类被加载的时候被执行一次,以后这个类就再也看不到这些语句了(上面的代码中,加载类后,count不是0,仍然是nil就是这个原因)。如何处理?应该就是放在initialize方法中去初始化变量或者在使用变量前判断一下变量是否为nil吧(论坛里还有一位大侠建议可以这样,@count.to_i一下,因为nil也可以to_i,值为0。to_i的作用是将变量变成整型值,如果变量是字符串什么的,可能这个办法就不管用了)。
09-04 17:48