Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ruby / Yukihiro Matsumoto_Programming Ruby.doc
Скачиваний:
121
Добавлен:
06.06.2015
Размер:
2.71 Mб
Скачать

Class Variables

A class variable is shared among all objects of a class, and it is also accessible to the class methods that we'll describe later. There is only one copy of a particular class variable for a given class. Class variable names start with two ``at'' signs, such as ``@@count''. Unlike global and instance variables, class variables must be initialized before they are used. Often this initialization is just a simple assignment in the body of the class definition.

For example, our jukebox may want to record how many times each particular song has been played. This count would probably be an instance variable of the Songobject. When a song is played, the value in the instance is incremented. But say we also want to know how many songs have been played in total. We could do this by searching for all theSongobjects and adding up their counts, or we could risk excommunication from the Church of Good Design and use a global variable. Instead, we'll use a class variable.

class Song

  @@plays = 0

  def initialize(name, artist, duration)

    @name     = name

    @artist   = artist

    @duration = duration

    @plays    = 0

  end

  def play

    @plays += 1

    @@plays += 1

    "This  song: #@plays plays. Total #@@plays plays."

  end

end

For debugging purposes, we've arranged for Song#playto return a string containing the number of times this song has been played, along with the total number of plays for all songs. We can test this easily.

s1 = Song.new("Song1", "Artist1", 234)  # test songs..

s2 = Song.new("Song2", "Artist2", 345)

s1.play

»

"This  song: 1 plays. Total 1 plays."

s2.play

»

"This  song: 1 plays. Total 2 plays."

s1.play

»

"This  song: 2 plays. Total 3 plays."

s1.play

»

"This  song: 3 plays. Total 4 plays."

Class variables are private to a class and its instances. If you want to make them accessible to the outside world, you'll need to write an accessor method. This method could be either an instance method or, leading us neatly to the next section, a class method.

Class Methods

Sometimes a class needs to provide methods that work without being tied to any particular object.

We've already come across one such method. The newmethod creates a newSongobject but is not itself associated with a particular song.

aSong = Song.new(....)

You'll find class methods sprinkled throughout the Ruby libraries. For example, objects of class Filerepresent open files in the underlying file system. However, classFilealso provides several class methods for manipulating files that aren't open and therefore don't have aFileobject. If you want to delete a file, you call the class methodFile.delete , passing in the name.

File.delete("doomedFile")

Class methods are distinguished from instance methods by their definition. Class methods are defined by placing the class name and a period in front of the method name.

class Example

  def instMeth              # instance method

  end

  def Example.classMeth     # class method

  end

end

Jukeboxes charge money for each song played, not by the minute. That makes short songs more profitable than long ones. We may want to prevent songs that take too long from being available on the SongList. We could define a class method in SongListthat checked to see if a particular song exceeded the limit. We'll set this limit using a class constant, which is simply a constant (remember constants? they start with an uppercase letter) that is initialized in the class body.

class SongList

  MaxTime = 5*60           #  5 minutes

  def SongList.isTooLong(aSong)

    return aSong.duration > MaxTime

  end

end

song1 = Song.new("Bicylops", "Fleck", 260)

SongList.isTooLong(song1)

»

false

song2 = Song.new("The Calling", "Santana", 468)

SongList.isTooLong(song2)

»

true

Соседние файлы в папке Ruby