Casting no Ruby
Casting, o que ele é? Como usamos? Quais são os seus tipos? Talvez quando você começou a estudar ruby você já fez alguma dessas perguntas.
Neste post vamos te mostrar como funciona o casting no Ruby.
O que é Casting?
Casting nada mais é do que você transformar um determinado valor de um tipo de dados para outro.
Por exemplo, você pode transformar um número que está no formado texto (string) para o formato correto que desejar.
Como usamos?
Vamos ver agora alguns exemplos de casting.
Casting com números reais
Abaixo vamos transformar uma texto númerico "10.50"
para um número real.
1
2
"10.50".to_f #=> 10.5
Float("10.50") #=> 10.50
Agora se usarmos um texto para transformar em um número real, veja o que acontece:
1
2
"qualquer texto".to_f #=> 0.0
Float("qualquer texto") # ArgumentError: invalid value for Float(): "qualquer texto"
Casting com String
Também podemos fazer o inverso, transformar um número real para um texto (string).
1
2
10.5.to_s #=> "10.5"
String(10.5) #=> "10.5"
Normalmente usamos to_s
para fazer o casting do que usar a class String
. Também podemos fazer casting para string usando o método Kernel#sprintf
e String#%
:
1
2
3
4
sprintf("%s", 10.5) #=> "10.5"
"%s" % 10.5 #=> "10.5"
"%d" % 10.5 #=> "10"
"%.2f" % 10.5 #=> "10.50"
Veja qua a sintaxe é bastante parecido com a linguagem C.
Casting para Inteiro
Assim como conseguimos converter texto (string) para números reais, podemos fazer para números inteiros.
1
2
"12.40".to_i #=> 12
Integer("12.40") #=> 12
Fique atento que no ruby só consegue fazer o casting de texto (string) para inteiro somente se o número estiver no inicio do texto, se ele estiver em qualquer outra posição do texto ele não fará o casting.
1
2
"12-foo".to_i # => 123
"bar-12".to_i # => 0
Agora se usarmos um texto para transformar em um número inteiro, veja o que acontece:
1
2
"qualquer texto".to_i #=> 0.0
Integer("qualquer texto") # ArgumentError: invalid value for Integer(): "qualquer texto"
Curiosidade de Inteiro e Real no Ruby
1
1/2 #=> 0
Como estamos dividindo dois inteiros, o resultado é um inteiro. Para resolver este problema, precisamos fazer o casting pelo menos um dos números para real:
1
2
3
4
1.0 / 2 #=> 0.5
1.to_f / 2 #=> 0.5
1 / Float(2) #=> 0.5
1.fdiv 2 # => 0.5
No último exemplo usamos o fdiv
para poder ter a divisão exata sem precisar fazer o casting de um dos números para realizar a divisão exata.
Será que transformou mesmo?
Mesmo depois de ver todos esses exemplos ainda tem dúvida se realmente transformou, use o método .class
para verificar qual classe o valor transformado ele é depois do casting.
1
2
3
4
5
"12".to_i #=> 12
"abc12".to_i #=> 0
"12".to_i.class #=> Integer
"abc12".to_i.class #=> Integer
12.to_s.class #=> String
Bom, é isso, qualquer dúvida comente abaixo.
Até o próximo post.