Reputation: 6602
Why are @variables
needed in classes? What value do they add? I couldn't find anything online for this but maybe I'm searching for the wrong terms. Is there a resource online I can look this up? Thanks!
car.rb
class Car
attr_accessor :make, :model
def initialize(make = '')
@make = ''
@model = ''
end
end
Upvotes: 1
Views: 158
Reputation: 2223
Objects are said to have behaviours and properties, much like real world object. The properties of objects are defined by instance variables. And @ prefix is ruby's way of telling particular variable is an instance variable/characteristic.
What value they add ?
They help you to have a variable that is accessible across all your instance methods.
Let us disect your example
class Car
attr_accessor :make, :model #attr_accessor methods creates a getter method. car_instance.make and
#a setter method car_instance.make=(val), which otherwise you would have to do explicitly.
def initialize(make = '') #constructor
@make = '' #initializing your instance variables. I guess you meant @make = make here
@model = ''
end
end
I couldn't find anything online for this but maybe I'm searching for the wrong terms.
Yup you were.
Is there a resource online I can look this up?
Yup, Ruby User Guide By Matz
Bit more details
In ruby, the scope of a variable inside a class is identified by the compiler by first two characters of the varaible name.
@@variable_name -> Two '@' s. Class variables/ Scope across all instances of the class. Eg: If you want to have a count on total number of cars you made.
@variable -> One '@' Instance varaibles/ Scope across an instance.
variable -> No '@' Local variables/ Scope to the block they belong.
Upvotes: 0
Reputation: 118261
Look at the below code,which I changed a bit for understanding:
class Car
attr_accessor :make, :model
def initialize(make = '')
@make = make
@model = ''
end
end
car1 = Car.new("Toyota")
car2 = Car.new("Roxin")
p car1.instance_variables #<~~ A
p car2.instance_variables #<~~ B
p car1 #<~~C
p car2#<~~D
Output:
[:@make, :@model]
[:@make, :@model]
#<Car:0x1bc89e8 @make="Toyota", @model="">
#<Car:0x1bc8940 @make="Roxin", @model="">
Explanation: Here in A and B you might think of that both car1,car2 are using the same copy of instance variables. But Not is the case. See when I am printing car1 and car2, in C and D,outputs shows that car1 and car2 are holding different values for the instance variable @make
. This fact objects has their own unique instance variables.
Hope this helps.
Cheers!!
Upvotes: -1
Reputation: 6491
Instance variables are available in all areas of each instance of a class.
Each time you create an instance of car the variable is specific to that particular one.
e.g.
car1 = Car.new('Ford', 'Falcon')
car2 = Car.new('Toyota', 'Camry')
Now car1 and car2 have different instances of @make and @model.
If you declare the variable as a class variable using @@make
, then every Car has access to it and every time it is changed, it is changed for everyone.
Basically class variables allow you to put some 'walls' around your data.
The attr_accessor
creates two methods in your call
def make=(value)
@make = value
end
def make
@make
end
This allows you to call the instance variable within and from outside your class without the @
e.g.
car1.make
returns
'Ford'
www.codecademy.com has some great free courses in basic Ruby that will teach you this stuff really well.
Upvotes: 1
Reputation: 275
These variables are called instance variables. Every instance of the class has it's own copy of these variables.
In your example, you would like every instance of the class Car to have it's own make and model.
Note the following example
car1 = Car.new("Toyota", "Carola")
car2 = Car.new("Mitsubishi", "Lancer")
Both car1 and car2 each have their own private make
and model
. The way to tell the Ruby interpreter to do this is to use @.
Upvotes: 2
Reputation: 38576
That's the syntax for defining instance variables in ruby.
Upvotes: 1