Skip to content

Instantly share code, notes, and snippets.

@aristotelesbr
Created June 21, 2023 21:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aristotelesbr/6308ea9df59428ea00d62b6f3c0ad3f2 to your computer and use it in GitHub Desktop.
Save aristotelesbr/6308ea9df59428ea00d62b6f3c0ad3f2 to your computer and use it in GitHub Desktop.
Uma explicação sobre checagem e conversão de tipos em tempo de execução no crystal.
require "json"
puts "Checando tipos no Crystal"
# Checando tipos em tempo de execução
json_text = JSON.parse("[1, 2, 3]")
# Você pode usar o `.class` para checar o tipo de uma variável
puts "Usando .class"
puts "json_text.class => #{json_text.class}"
puts "========"
# Você pode usar o `typeof` para checar o tipo de uma variável
puts "Usando typeof"
puts "typeof(json_text) => #{typeof(json_text)}"
puts "========"
# Você pode usar o `.is_a?` para checar se uma variável é de um determinado.
puts "Usando .is_a?"
puts "json_text.is_a?(Array(Int32)) => #{json_text.is_a?(Array(Int32))}"
puts "Union Types"
# Você pode usar o `.is_a?` para verificar se uma variável é uma coisa ou outra usando o operado "|".
# https://crystal-lang.org/reference/1.8/syntax_and_semantics/union_types.html
# Você pode usar o `.is_a?` para verificar se uma variável é uma coisa ou outra usando o
puts "json_text.is_a?(Array(Int32) | JSON::Any) => #{json_text.is_a?(Array(Int32) | JSON::Any)}"
# O pseudo-método as executa uma verificação de tempo de execução: Ex. se `json_text` não for um Array(Int32), uma exceção é gerada.
puts "Usando .as"
# O código abaixo gera uma exceção
puts "json_text.as(Array(Int32)) => 💣"
puts <<-STRING
pp json_text.as(Array(Int32))
^
"Error: can't cast JSON::Any to Array(Int32)
STRING
# Perceba que o compilador exibe informações sobre o erro, incluindo a linha e coluna onde o erro ocorreu.
# `"Error: can't cast JSON::Any to Array(Int32)`
# O erro acima ocorre porque o `json_text` não é um `Array(Int32)`, mas sim um `JSON::Any`.
puts "========"
# Você pode usar o `.as_a` para mapear um `JSON::Any` para um `Array`
puts "Usando .as_a"
puts "json_text.as_a.class => #{json_text.as_a.class}"
# Perceba que o `json_text.as_a` retorna um `Array(JSON::Any)`, ou seja, um Array de `JSON::Any`.
json_text.as_a.each do |i|
puts "i => #{i.class}"
end
puts "========"
# Convertendo um `JSON::Any` para um `Array(Int32)`
puts "Convertendo um `JSON::Any` para um `Array(Int32)`"
puts "json_text.as_a.map(&.as_i) => #{json_text.as_a.map(&.as_i).class}"
## Gist criado para ajudar o pessoal do grupo Crystal Lang Brasil(https://t.me/crystallangbr)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment