Class & Instance & Global Variable
In a nutshell,
-
$<variable>
: global variable, which can be accessed by anywhere in the program -
@@<variable>
: class variable, which can be accessed by all instances of that class -
@<variable>
: instance variable, which are only accessed by the object currently having it
example
#!/usr/bin/env ruby
$song = "Hello"
class Audio
def initialize
@@song = nil
@song = nil
end
def set_class_variable=(song)
@@song = song
end
def set_instance_variable=(song)
@song = song
end
def print_song
puts "$song == #{$song}"
puts "@song == #{@song}"
puts "@@song == #{@@song}"
end
end
song1 = Audio.new
song2 = Audio.new
song3 = Audio.new
puts "song1" # song1 song2 song3
puts song1.print_song # $song = Hello Hello Hello
puts "song2" # @song = nil nil nil
puts song2.print_song # @@song = nil nil nil
puts "song3"
puts song3.print_song
puts ''
# instance variable only belongs to current instance
song1.set_instance_variable = "Skin"
puts "song1" # song1 song2 song3
puts song1.print_song # $song = Hello Hello Hello
puts "song2" # @song = Skin nil nil
puts song2.print_song # @@song = nil nil nil
puts "song3"
puts song3.print_song
puts ''
# class variable only is shared with all its instances
song3.set_class_variable = 'Soldier'
puts "song1" # song1 song2 song3
puts song1.print_song # $song = Hello Hello Hello
puts "song2" # @song = Skin nil nil
puts song2.print_song # @@song = Soldier Soldier Soldier
puts "song3"
puts song3.print_song
puts ''