论坛首页 编程语言技术论坛

玩转Ruby系列:玩转ruby中的变量

浏览 5128 次
精华帖 (0) :: 良好帖 (10) :: 新手帖 (10) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-01-09   最后修改:2009-07-08

   在学校的时候就听说动态语言,python啦,ruby,lua啦都是。只是了解对象运行时可以改变状态,比如添加属性,增加方法啦。但是一直不知道动态语言到底怎么动来着,还能比动感超人更厉害,很好奇,但一直没去学习一门动态语言。现在开始学习Ruby,慢慢的就开始了解什么是动态语言了。
   看了几天的Ruby,觉的还是有很多不一样的东西,让我很是兴奋。觉得Ruby的一些新特性很神奇,也很实用。
我觉得Ruby中的变量就和Java中不一样。下面就说一说基本的东西:

 

  • Ruby中的变量使用前不需要声明和初始化,没有初始化最多返回个nil呗。这也可能是Ruby不用编译,管你这个变量有没有声明,反正都可以动态添加的。
  • Ruby中的变量不需要类型,只是一个记号一样的东西,指向运行时的一个对象,一切皆对象嘛。
  • Ruby中的变量可以随便改变类型,指向一个对象后,可以随便指向其他类型的对象,所以说Ruby中的对象是强类型的,变量是无类型的。我没爹没娘,谁要我我跟谁-:(

   说Ruby是完全面向对象的语言,我还不能判断它是不是完全,人们这样说我就先这样听吧。面向对象的话就要研究类的实现,下面谈谈Ruby中的类有什么不正常的,和老大Java比较比较。
   首先,Ruby的类中可以定义四种变量:

  • 带个钱包的全局变量$global
  • 带个帽子的实例变量@instance
  • 嘿,带俩帽的类变量@@class
  • 光头的局部变量local

下面一个一个说说这四种变量:
全局变量$global
   全局变量可以在任何地方定义,不光是类的定义中,这都知道:)。全局变量一般不大用,可能用来在程序运行期中保存状态的吧。有几个内置的全局变量,也就是系统变量,比如$$ Ruby解释器的进程ID,$* 命令行参数,具体的可以查看Ruby的参考手册。


实例变量@instance
   这个应该是类中最重要的变量了,保存对象的属性状态,也就是Java中的属性啦,只是用起来很不一样啊。
实例变量可以直接定义在方法中,方法里出现的带帽子的就是实例变量。只是在读取得时候哦必须要先对它赋值,不然就返回nil了,所以在get前一定要先set啊。
   Ruby也可以写自己的访问器,相当于Java的setter和getter。只是Ruby中的方法名可以更牛逼一点,直接叫instance和instance=。

class Test
  def instance
    @instance
  end

  def instance=(param)
    @instance = param
  end
end

test = Test.new
test.instance="samsam is cool"
puts test.instance
 

   这样看起来还以为是直接访问实例变量呢(这是不可能的,因为...呵呵...ruby中的实例变量只可能是私有的)。这样其实和Java的setter和getter一样,就方法名更好看。别急,Ruby会让你兴奋的,Ruby里有现成的访问器attr_accessor,是用symbol定义的实例变量,不用写读写方法了(听说Java7也要加入这一特性哦)。

class Test
  attr_accessor :instance

end

test = Test.new
test.instance="samsam is cool"
puts test.instance
 

  还有只针对读和写的访问器,attr_reader和attr_writer,用来只读和只写。


类变量@@class
   类变量啊,怎么说呢,我觉的就是Java中的静态变量,在类个没个对象中共享的。

class Test
  @@class = "Ruby is cool"

  def self.get_class
    @@class
  end
end

puts Test.get_class

 

但是,经过我的实验,还是有很不一样的地方。

Java中的静态变量只能由静态方法来访问,但Ruby中的类变量可以由普通方法访问。

class Test
  @@class = "Ruby is cool"

  def get_class
    @@class
  end

  def instance
    @instance
  end

  def instance=(param)
    @instance=param
  end
end

a = Test.new
a.instance="samsam is cool"
puts a.get_class
 

更甚的是,在静态方法中都能访问实例变量。

class Test
  @@class = "Ruby is cool"

  def self.get_class
    puts @instance
    @@class
  end

  def instance
    @instance
  end

  def instance=(param)
     @instance=param
  end
end

puts Test.get_class
 

   @instance是nil,因为get_class时是通过Test.get_class调用的,没有对象,也就没有对@instance赋值,所以等于nil。虽然这样没有意义,但好像没有错啊。Ruby很灵活,呵呵!:)
最后说一下,类变量需要初始化,不然就不对。


局部变量local
局部变量很好理解啊,就是在方法中定义的变量。局部变量也要初始化。

class Test
  def method
    local=1
  end
end

test = Test.new
puts test.method

=>hello.rb:3:in `method': undefined local variable or method `local' for #<Test:0x284
0718> (NameError) from hello.rb:8
 


累了,先写到这,明天想到什么再加上去吧。

   发表时间:2009-01-09  
ruby 中不存在静态方法与类方法


所有的方法都是对象方法,方法都是message,调用都是send
0 请登录后投票
   发表时间:2009-01-10  
很久前看过一帖子,

建议是:不要使用类变量,应该用类的实例变量
0 请登录后投票
   发表时间:2009-01-10  
sina2009 写道
ruby 中不存在静态方法与类方法


所有的方法都是对象方法,方法都是message,调用都是send

这些我还没有研究过,只是先这样理解吧
0 请登录后投票
   发表时间:2009-01-11  
学习了,希望能得到帮助.谢谢.
0 请登录后投票
   发表时间:2009-01-11  
night stalker 写道
很久前看过一帖子,

建议是:不要使用类变量,应该用类的实例变量


不用那麼死板。每種工具都有其用處,看人想象而已。
0 请登录后投票
   发表时间:2009-01-11  
Omnibus 写道
night stalker 写道
很久前看过一帖子,

建议是:不要使用类变量,应该用类的实例变量


不用那麼死板。每種工具都有其用處,看人想象而已。


不是死板,是类变量有bug...
0 请登录后投票
   发表时间:2009-01-12  
night stalker 写道
Omnibus 写道
night stalker 写道
很久前看过一帖子,

建议是:不要使用类变量,应该用类的实例变量


不用那麼死板。每種工具都有其用處,看人想象而已。


不是死板,是类变量有bug...


可以说说具体是什么吗?或者给个发现Bug的思路也好。
0 请登录后投票
   发表时间:2009-01-12  
night stalker 写道
Omnibus 写道
night stalker 写道
很久前看过一帖子,

建议是:不要使用类变量,应该用类的实例变量


不用那麼死板。每種工具都有其用處,看人想象而已。


不是死板,是类变量有bug...


你說namescope的問題嗎?實際影響不大。
而且,1.9就修正過來吧。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics