Variáveis
Não é necessário declarar variáveis da forma comum (como em C, Smalltalk, etc.), mas é necessário que a variável exista para que possa ser usada. Por exemplo:
puts a # >> NameError: undefined local variable ... a = nil puts a # >> nil
Ou seja, pode-se considerar que a atribuição faz a declaração
automaticamente. Porém, variáveis globais têm valor nil mesmo antes
de serem inicializadas.
puts $global # >> nil $global = "oi" puts $global # >> oi
Em Ruby as variáveis têm seu escopo determinado pelo nome. De certa forma, isso "oficializa" o hábito de nomear os diferentes tipos de variáveis usando diferentes regras de nomenclatura, encontrado em outras linguagens (por ex.: iniciar nomes de classes com letras maiúsculas, terminar variáveis de instância com sublinhado, etc.).
Variáveis globais são iniciadas por $:
$variavel_global = "abc"
Constantes são iniciadas por letra maiúscula (classes são constantes). Atribuição a uma constante já inicializada gera um aviso, mas seu valor é alterado:
CONST = 3.1415 # >> 3.1415 CONST = 6.02e+23 # >> warning: already initialized constant Constante puts CONST # >> 6.02e+23
Note que o objeto a que a constante se refere pode ser alterado.
Quando for desejável manter um objeto imutável, usa-se o método
freeze (de Object).
Atributos de objetos (variáveis de instância) são iniciados por
@, e não são acessíveis externamente diretamente. Estas variáveis
devem ser inicializadas e usadas nos métodos de instância. Quando definidas no
corpo da classe, ficam no contexto da classe (são atributos do objeto da
classe):
class A
@contexto = "classe"
def initialize
@contexto = "instância"
end
def contexto
@contexto
end
def A.contexto
@contexto
end
end
a = A.new
a.contexto # >> "instância"
A.contexto # >> "classe"
Atributos de classe são iniciados por @@ e não são
acessíveis externamente diretamente. Estas variáveis são compartilhadas por
todas as subclasses também. São como variáveis globais em relação à uma
hierarquia de classes/módulos.
class Carro @@marcas = [ "Ford", "GM", "Fiat", "VW" ] end
E finalmente, variáveis locais, visíveis apenas no contexto do método/bloco/classe/módulo onde forem criadas, são iniciadas por letras minúsculas ou sublinhado:
variavel = 123 _variavel = "abc"
Algumas variáveis são especiais: true sempre se refere ao objeto
booleano verdadeiro; false sempre se refere ao objeto booleano
falso; nil sempre se refere ao objeto nulo; self
sempre se refere ao objeto do método atual; __LINE__ é um
Fixnum indicando a linha atual do código fonte;
__FILE__ é uma String com o nome do arquivo fonte
atual. Estes objetos são únicos, não podem ser clonados, e as variáveis não
podem ser alteradas.
É importante dizer que, diferente de muitas linguagens, o valor
0 não é igual a false. Em expressões booleanas,
os únicos valores falsos são false e nil, todos os
outros são considerados verdadeiros.