Chinaunix

标题: Ruby on My Way -- Java程序员的Ruby学习笔记(Ruby变量一) [打印本页]

作者: sparks    时间: 2008-03-16 16:36
标题: Ruby on My Way -- Java程序员的Ruby学习笔记(Ruby变量一)

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

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/1449/showart_497641.html




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2