Tipos de Variáveis em Ruby

2018, Jul 12    

Apesar de ser uma linguagem dinâmica o Ruby é uma linguagem fortemente tipada, diferente de outras linguagems como Java ou C++, quando declaramos uma variável precisamos definir também seu tipo, por exemplo:

String nome = "Willian"

Neste post vamos ver:

  • Declarando uma variável
  • Tipos de variáveis
  • Problemas de conversão

Declarando uma variável

Para declarar uma variável é bem simples basta dar um nome e atribuir seu valor assim o tipo da variável é definido implicitamente. Veja o exemplo abaixo:

> nome = "Willian" => "Willian"
> idade = 28 => 28

Tipos de variáveis

Como falamos anteriormente o Ruby possui alguns tipos, são eles:

  • Fixnum: números inteiros
  • Float: números decimais
  • Bignum: números inteiros muito grandes
  • String: valores alfanumérico
  • FalseClass/TrueClass: valores booleanos

Você deve estar se perguntando “Então podemos alterar o valor de uma variável sem precisar fazer conversões… mas isso não dá problema não?” Como podemos ver no exemplo abaixo apenas trocando os valores não tem problema

> nome = "Willian" => "Willian"
> nome = 5000 => 5000

Problemas de conversão

Mas em nosso código do dia a dia provavelmente vamos usar uma variável em outros lugares é ai que mora o perigo… Vamos analisar a seguinte situação digamos que temos uma a variável com o nome “idade” do tipo inteiro(Fixnum), por algum motivo durante o desenvolvimento achamos melhor trocar o seu valor para String mas esquecemos que somamos algum outro valor inteiro ao longo do código, o que acontece? Segue código abaixo:

> idade = 30 => 30 
> idade = 'WIL' => "WIL" 
> idade + 10
TypeError: no implicit conversion of Fixnum into String
	from (irb):16:in `+'
	from (irb):16
	from /home/wt/.rvm/rubies/ruby-2.3.1/bin/irb:11:in `<main>'

Se fizermos a operação inversa e tentar somar uma String em um inteiro(Fixnum) também temos o mesmo problema de conversão:

> idade = 30 => 30 
> idade + "WIL"
TypeError: String can't be coerced into Fixnum
	from (irb):36:in `+'
	from (irb):36
	from /home/wt/.rvm/rubies/ruby-2.3.1/bin/irb:11:in `<main>'

Em Ruby tudo é classe inclusive os tipos são classes então se alterarmos o tipo da variável e nessa variável usamos um método exclusivo da classe também vamos ter problemas, veja o exemplo abaixo:

> def caixa_alta(nome)
>  nome.upcase
> end
> nome = 30
> caixa_alta nome =>
NoMethodError: undefined method `upcase' for 30:Fixnum
        from (irb):41:in `caixa_alta'
        from (irb):43
        from /home/wt/.rvm/rubies/ruby-2.3.1/bin/irb:11:in `<main>'

Por enquanto é só isso, nos vemos na próxima.