A diferencias de otros lenguajes de programación, en Ruby no tenemos que decirle que tipo de dato va a guardar la variable. Es decir, a las variables le podemos cambiar el tipo de dato en cualquier momento.
Ruby es un lenguaje dinámico (las variables no necesitan ser declaradas) y fuertemente tipado (aunque no necesiten ser declaradas, las variables conservan el tipo del valor al que son inicializadas).
Dentro de irb podemos hacer las siguientes pruebas:
Creamos la variable edad y le asignamos el valor de 30, y nos devuelve 30.
En el siguiente paso llamamos a la variable edad y nos vuelve a devolver 30.

Hacemos la prueba de cambiar el tipo de edad y vemos que lo admite:

Referencias a Objectos
Las variables contienen referencias a objectos, no los objetos mismos.

person1 = "Tim"
person2 = person1
person1[0] = 'J'
puts "#{person1} id-->,#{person1.__id__}" # --> Jim id-->,47286622078780
puts "#{person2} id-->,#{person2.__id__}" # --> Jim id-->,47286622078780
Para evitar el «aliasing» se usa dup:
person1 = "Tim"
person2 = person1.dup
person1[0] = 'J'
puts "#{person1} id-->,#{person1.__id__}" # --> Jim id-->,47444571720960
puts "#{person2} id-->,#{person2.__id__}" # --> Tim id-->,47444571720860
Para impedir que alguien cambie un objecto, se puede utilizar también el freezing.
person1 = "Tim" person2 = person1 person1.freeze person2[0] = "J" # can't modify frozen String (FrozenError)
