Para declarar uma variável, usa o operador de atribuição =.
No Crystal, as variáveis devem usar o formato snake_case.
number = 1
puts number # => 1
number = 2
puts number # => 2
As constantes são declaradas com o mesmo operador de atribuição =, mas usam apenas letras maiúsculas, o que é conhecido como SCREAMING_SNAKE_CASE.
NUMBER = 1
puts NUMBER # => 1
Atribuir um valor a uma constante já definida resulta num erro de compilação.
NUMBER = 1
NUMBER = 2
# Error: already initialized constant NUMBER
O Crystal é uma linguagem compilada, o que significa que a cada variável ou argumento de método é atribuído um tipo em tempo de compilação. O compilador é capaz de inferir o tipo de uma variável ou de um argumento de método. No entanto, em alguns casos é necessário especificar o tipo. Os casos que exigem que o tipo seja especificado serão explicados em conceitos posteriores.
Os métodos são uma forma de agrupar um conjunto de instruções que podem ser reutilizadas.
No Crystal, os métodos são muitas vezes definidos numa classe, num módulo ou num struct.
No entanto, também é possível definir métodos fora de uma classe, de um módulo ou de um struct.
Os métodos são declarados com a palavra-chave def, seguida do nome do método.
No Crystal, os métodos devem ser escritos em snake_case.
Podes omitir os parênteses quando um método não tem argumentos.
Para marcar o fim de um método, tens de usar a palavra-chave end.
def hello
puts "Hello World!"
end
Usar um método que não existe para o tipo da variável ou do argumento de método resulta num erro de compilação.
number = 1
number + "1"
# Error: no overload matches 'Int32#+' with type String
Os métodos podem ter argumentos. Os argumentos são dados que são passados a um método. Para poderes dar argumentos a um método, tens de especificar o nome do argumento. No Crystal, os argumentos devem ser escritos em snake_case. Um método pode ter vários argumentos, mas os argumentos têm de ser separados por uma vírgula.
def hello(name)
puts "Hello #{name}!"
end
Os métodos também podem ter vários argumentos. Neste caso, os argumentos têm de ser separados por uma vírgula.
def hello(name, language)
puts "Hello #{name}! You are learning #{language}."
end
Quando chamas um método que pertence a uma classe, a um módulo ou a um struct, tens de usar o operador ponto (.).
O formato deve ser: <ClassName>.<method_name>.
Quando um método não pertence a uma classe, a um módulo ou a um struct, basta chamá-lo escrevendo o seu nome.
Os métodos devolvem sempre implicitamente o valor da última expressão.
Quando um método tem argumentos, podes usar parênteses ao especificar os argumentos na chamada e na definição do método, assim: <method_name>(<argument_1>, <argument_2>, ...).
Quando um método não tem argumentos, os parênteses devem ser omitidos.
def hello(name)
"Hello #{name}!"
end
hello("Crystal")
# => Hello Crystal!
Ao chamar um método com vários argumentos, estes devem ser separados por uma vírgula. Os argumentos têm de ser indicados pela mesma ordem dos argumentos do método.
def hello_language(name, language)
"Hello #{name}! You are learning #{language}."
end
hello_language("World", "Crystal")
# => Hello World! You are learning Crystal.
Chamar um método com o número errado de argumentos resulta num erro de compilação.
hello_language("Crystal")
# wrong number of arguments for 'hello_language' (given 1, expected 2)
No Crystal, podes usar o operador + para somar dois números.
Também podes usar o operador - para subtrair dois números.
E podes usar o operador * para multiplicar dois números.
1 + 1
# => 2
2 - 1
# => 1
2 * 2
# => 4
No Crystal, os comentários escrevem-se com o caráter #, seguido de um espaço e depois o comentário.
Os comentários servem para documentar o código.
O compilador não executa os comentários.
# This is a comment
Neste exercício, vais escrever código para te ajudar a cozinhar uma lasanha fantástica do teu livro de receitas favorito.
Tens quatro tarefas, todas relacionadas com o tempo gasto a cozinhar a lasanha.
Define a constante EXPECTED_MINUTES_IN_OVEN na classe Lasagna, que guarda quantos minutos a lasanha deve estar no forno.
De acordo com o livro de receitas, o tempo esperado no forno é de 40 minutos:
Lasagna::EXPECTED_MINUTES_IN_OVEN
# => 40
Define o método Lasagna#remaining_minutes_in_oven, que recebe como parâmetro os minutos reais que a lasanha já esteve no forno e devolve quantos minutos a lasanha ainda tem de permanecer no forno, com base no tempo esperado no forno da tarefa anterior.
Lasagna.new.remaining_minutes_in_oven(30)
# => 10
Define o método Lasagna#preparation_time_in_minutes, que recebe como parâmetro o número de camadas que adicionaste à lasanha e devolve o número de minutos que gastaste a prepará-la, assumindo que cada camada demora 2 minutos a preparar.
Lasagna.new.preparation_time_in_minutes(2)
# => 4
Define o método Lasagna#total_time_in_minutes, que recebe dois parâmetros nomeados: o parâmetro number_of_layers é o número de camadas que adicionaste à lasanha, e o parâmetro actual_minutes_in_oven é o número de minutos que a lasanha esteve no forno.
O método deve devolver o número total de minutos que trabalhaste a cozinhar a lasanha, que é a soma do tempo de preparação, em minutos, com o tempo que a lasanha passou no forno até ao momento.
number_of_layers = 3
actual_minutes_in_oven = 20
Lasagna.new.total_time_in_minutes(number_of_layers, actual_minutes_in_oven)
# => 26
Inscreve-te no Exercism para aprenderes e dominares Crystal com 26 conceitos142 exercícios, e mentoria humana real, tudo grátis.