what is different "@"?

what is a different? @name and name on ruby? sometime I confuse these..

http://www.ruby-doc.org/core/classes/Module.html#M001701

@name is an "instance variable"

name is a local variable.

In a class, like the one below, @birthdate is used in two places: in getBirthdate and in ageNow. In order to use it inside more than one method it needs to be an instance variable (a var with an @). However, in ageNow, we create a local var called currentDate (it has no @). It is used in the formula to calculate age. We also need the current date in dateToday, but we cannot reuse the 'currentDate' var because it is local to only the ageNow method. So, in dateToday we create another local var dateOfToday.

class Person

   def initialize
     @birthdate = '1950-06-15'
   end

   def getBirthday
     return @birthdate
   end

   def ageNow
     currentDate = Date.now
     ageInYears = Integer.new

     currentDate - @birthdate = ageInYears # fake formula

  return ageInYears
   end

   def dateToday
     dateOfToday = Date.now
     return dateOfToday
   end

end

-- gw

Thank you, gw!. I got it!!

Does that mean that @birthdate will be accessible to other classes
outside this one?

Elle

No, that is an instance variable of that class so it will only be
available to a particular instance (not entirely true because of the
rather rude instance_variable_get method). You can write an accessor
method to allow access to it. That is the whole point of encapsulation,
to provide an interface to the implementation and shield the user of
your class from the gory details. I would suggest reading up on basic
object oriented principals (Ruby specific or otherwise) as since
everything in Ruby is an object, a good understanding of these
principles will be a major help. You should look at the book
“Programming Ruby” aka the “Pickaxe” book. It is very well written and
has all the information you could want on this subject.

-Bill

elle wrote:

Does that mean that @birthdate will be accessible to other classes
outside this one?

Not different classes: the "scope" of a variable determines how
visible it is to other parts of the application. A local variable
(name, with no @ or @@) is visible/accessible/usable only within the
method in which it is defined. An instance variable, one defined with
the @ sign, like @name is visible anywhere within the class, or a
subclass ... but not, directly to any other class.

Now this gets a little confusing in Rails because Rails does some
special magic for you. In specific, when you define a model, for
example Employee, and that model is tied to a database with a table
called employees, all of the columns of that database table, like
"name", "salary", "start_date" and so on become magically defined as
instance variables of the model. You won't see anything in the model
that defines @name as anything, but if the employee table has a column
called name, you have a free instance variable which you can reference
as @name.

Cool, eh?

Tom

In plain Ruby, no. To make it accessible to other classes, you'd have to use

  attr_reader birthdate # read only
  attribute birthdate # read and write (be careful)

or write an explicit method like the getBirthday in the previous message's example code.

However, as tharrison wrote, Rails takes some liberties with this in some of its innards. If you write your own class though (i.e. not a Rails controller or model), then you'll be following the rules of plain Ruby.

-- gw

Thank you guys for explaining that. It's been very helpful and by the
way I have "Programming Ruby" on order.

Just one more question: views can see the instance variable, is that
right? and if so, how do they know which instance variable they can
see?

Elle

Thank you guys for explaining that. It's been very helpful and by the
way I have "Programming Ruby" on order.

Just one more question: views can see the instance variable, is that
right? and if so, how do they know which instance variable they can
see?

ActionController magically copies its instance variables into the
object representing the views. There is a method on
ActionController#Base defining those ivars not to copy accross.

Fred