码迷,mamicode.com
首页 > 其他好文 > 详细

Ruby之类变量和类方法

时间:2014-11-13 00:22:58      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   ar   使用   sp   for   文件   

类变量被类的所有对象所共享,它与类方法相关联。对一个给定的类来说,类变量只存在一份拷贝。类变量由两个@符号开头,例如@@count。与全局变量和实例变量不同,类变量在使用之前必须被初始化。通常,初始化就算在类定义中的简单赋值。
例如,我们的点唱机可能希望记录每首歌被播放的次数。这个书目肯呢改是Song对象的一个实例变量。当一首歌被播放时,实例中的值增加。但是,加入我们还想要交接下共播放了多少首歌,通过搜索所有Song对象并累加它们的播放次数,或者冒天下之大不韪使用全局变量来完成统计;或者,让我们使用类变量。

class Song
    @@plays = 0
    def initialize(name, artist, duration)
        @name = name
        @artist = artist
        @duration = duration
        @plays = 0
    end

    def play
        @plays+=1
        @@plays+=1
        puts "the song plays for #@plays time.  and Total plays #@@plays time."
    end
end

出于调试的目的,我们还让Song#play 返回一个字符串,其中包括该歌曲被播放的次数,以及所有歌曲播放的总次数。我们可以很容易测试它。

s = Song.new(vista, ultimate, 123)
p = Song.new(vitas, thestars, 325)
s.play           -> the song plays for 1 time.  and Total plays 1 time.
p.play           -> the song plays for 1 time.  and Total plays 2 time.
p.play           -> the song plays for 2 time.  and Total plays 3 time.
p.play           -> the song plays for 3 time.  and Total plays 4 time.
s.play           -> the song plays for 2 time.  and Total plays 5 time.

类变量对类及其实例都是私有的。如果你想让它们能够被外部世界访问,你需要编写访问方法。这个方法要么是一个实例方法,或者是类方法。

有时,类需要提供不束缚于任何特定对象的方法。我们已经见过一个这样的方法。new方法创建一个新的Song对象,但是new方法本身并不与一个特定的歌曲对象相关联。

song = Song.new(...)

我们会发现类方法遍布于Ruby库中。例如,File类的对象用来表示在底层文件系统中打开的一个文件。不过,File类还提供了几个类方法来操作文件, 而它们并未打开文件,因此也没有相应的File对象。如果你想要删除一个文件,你可以调用类方法File.delete,传入文件名作为参数。

File.delete("doc.txt")

类方法和实例方法是通过它们的定义区别开来的;通过在方法名之前放置类名以及一个句点,来定义类方法

class Example
    def instance_method            #instance method
    end

    def Example.class_method       #class method
    end
end

 

Ruby之类变量和类方法

标签:style   blog   io   color   ar   使用   sp   for   文件   

原文地址:http://www.cnblogs.com/calpar/p/4093773.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!