#!/usr/bin/ruby
@data = { :student => { :id => '123477'} }
class Student
end
s = Student.new
def s.id
@data[:student][:id]
#how can I access the @data variable here I tried @data[:student][:id] doesnt work
#I realize that data is outside of the scope of this method. However, is there any way!
end
puts s.id
views:
24answers:
4Should you be defining an instance variable (prefixed by "@") outside of a class definition?
Also, you can't define a method with a period in the name
First off, your id
method actually has to go into the class.
You could try something like this:
@data = { :student => { :id => '123477'} }
class Student
attr_accessor :id
def initialize(student)
self.id = student[:id]
end
end
s = Student.new(@data[:student])
puts s.id
#!/usr/bin/ruby @data = { :student => { :id => '123477', :first_name => 'Lazlo', :last_name =>'Fortunatus', :email=>'[email protected]' }, :contact_info => { :telephone=>'1 415 222-2222', :address => '123 Main St', :city =>'Beverly Hills', :state=>'California', :zip_code=>90210, :social_security_number =>'111-11-1111' } } class Student def initialize( data ) @data = data end def get_id_override @data[:student][:id] end def get_first_name_override @data[:student][:first_name] end def get_last_name_override @data[:student][:last_name] end def get_email_override @data[:student][:email] end def get_telephone_override @data[:contact_info][:telephone] end def get_city_override @data[:contact_info][:city] end def get_state_override @data[:contact_info][:state] end def get_zip_code_override @data[:contact_info][:zip_code] end def get_social_security_number_override @data[:contact_info][:social_security_number] end end s = Student.new(@data) def s.id get_id_override end def s.first_name get_first_name_override end def s.last_name get_last_name_override end def s.email get_email_override end def s.contact_info get_telephone_override end def s.city get_city_override end def s.state get_state_override end def s.zipcode get_zip_code_override end def s.ssn get_social_security_number_override end puts s.id puts s.first_name puts s.last_name puts s.email puts s.contact_info puts s.city puts s.state puts s.zipcode puts s.ssn
Here is the answer after some work. Anyone has a better answer than mine let me know.
It can be done!
It didn't at first work because @data
is an instance attribute of the top level object, so even though Student
is derived from Object
the attribute isn't in the new instance.
But you can pass self
into s.id
, and so then the only thing you need to add is an accessor for the data attribute.
However, that's slightly tricky because attr_reader
et al are private class methods so you can't use them directly, and you can't (because it's private) just say self.class.attr_reader
, you have to open up Object
and do it...with these changes your program works...
@data = { :student => { :id => '123477'} }
class Student
end
s = Student.new
def s.id o
o.data[:student][:id]
#how can I access the @data variable here I tried @data[:student][:id] doesnt work
#I realize that data is outside of the scope of this method. However, is there any way!
end
class Object
attr_reader :data
end
puts s.id self