Welcome to the Treehouse Community
Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.
Looking to learn something new?
Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.
Start your free trialHossam Khalifa
17,200 PointsAttr_writer vs attr_reader
When setting an attr_reader it can be used within methods without the '@' symobl to get the value.
But when I try to set the value if something is set as an attr_writer the '@' must be used to set the value or it will not work. Example
Class SomeThing
attr_accessor :name
def initialize(name)
@name = name
end
def getName?
name # This will return the name
end
#but this will not set the name
def setName!(new_name)
name = new_name
end
end
Can someone explain why Or tell me if I am mistaking Thank you Jason Seifer please answer
2 Answers
Brandon Barrette
20,485 PointsInside the initialize, from what I understand, you must use the @ since it's an instance variable (initializing an instance of the class). In other methods you write, you wouldn't need the @ if it's an attr_reader, attr_writer, or attr_accessor.
Hossam Khalifa
17,200 PointsI don't think you get me! It works with attr_reader But not with attr_writer My question is why??
Hossam Khalifa
17,200 PointsI don't think you get me! It works with attr_reader But not with attr_writer My question is why??
Jason Seifer
Treehouse Guest TeacherHi Hossam Khalifa, great question!
When you do the attr_writer
method, it is the equivalent of writing the following method:
def name=(new_name)
@name = new_name
end
You would the refer to this elsewhere in your code as the following:
def some_method
self.name = "Hossam"
end
This is necessary or, as Jessica Hori said, Ruby will attempt to access a local variable rather than a global one. Hope that helps!
Jessica H
16,612 PointsJessica H
16,612 PointsBy making @ variable, you are thus making name available throughout the class by other methods..
If you don't have an @ sign, the variable will only "local" and can only be used by the method in which you are defining it.