Em Rust, uma linguagem de programação moderna e de alto desempenho, as estruturas de dados, chamadas de “structs”, são usadas para organizar e armazenar dados relacionados de forma estruturada. As structs em Rust são semelhantes às estruturas em outras linguagens de programação, como C e C++, mas com algumas diferenças importantes, especialmente em relação ao sistema de propriedade exclusiva (ownership) e ao sistema de tipos.
Uma struct em Rust é definida usando a palavra-chave struct
, seguida pelo nome da struct e, opcionalmente, uma lista de campos entre chaves. Cada campo na struct tem um nome e um tipo. Por exemplo, considere uma struct que represente as informações de um ponto em um plano cartesiano:

ruststruct Ponto {
x: i32,
y: i32,
}
Neste exemplo, definimos uma struct chamada Ponto
com dois campos: x
e y
, ambos do tipo i32
(um tipo de número inteiro de 32 bits). Podemos então criar instâncias dessa struct atribuindo valores aos seus campos:
rustlet ponto = Ponto { x: 10, y: 20 };
Agora, ponto
é uma instância da struct Ponto
com os valores x
e y
definidos como 10 e 20, respectivamente.
Uma vez que as structs em Rust são tipos de dados, podemos definir funções associadas a elas usando a palavra-chave impl
. Por exemplo, podemos definir uma função que calcula a distância entre dois pontos:
rustimpl Ponto {
fn distancia(&self, outro: &Ponto) -> f64 {
(((outro.x - self.x).pow(2) + (outro.y - self.y).pow(2)) as f64).sqrt()
}
}
Nesta função distancia
, o parâmetro &self
refere-se à instância atual da struct Ponto
, enquanto outro
é uma referência a outra instância de Ponto
. A função calcula a distância euclidiana entre os dois pontos usando a fórmula matemática sqrt((x2 - x1)^2 + (y2 - y1)^2)
.
As structs em Rust também podem ter métodos associados a elas que modificam o estado interno da instância. Por exemplo, podemos definir um método para mover um ponto para uma nova posição:
rustimpl Ponto {
fn mover(&mut self, novo_x: i32, novo_y: i32) {
self.x = novo_x;
self.y = novo_y;
}
}
Neste método mover
, &mut self
indica que a função está modificando o estado interno da instância de Ponto
. Os novos valores de x
e y
são passados como parâmetros para a função.
É importante notar que em Rust, por padrão, os campos de uma struct são privados, o que significa que eles não podem ser acessados diretamente de fora da struct. Para acessar ou modificar os campos de uma struct, geralmente usamos métodos públicos definidos na própria struct.
Outra característica poderosa das structs em Rust é a capacidade de implementar o comportamento de um tipo de dado específico usando o conceito de “traits” (traços). Os traits em Rust são semelhantes às interfaces em outras linguagens de programação e permitem definir um conjunto de comportamentos que os tipos podem implementar. Por exemplo, podemos definir um trait chamado Desenho
que descreve objetos que podem ser desenhados em um plano cartesiano:
rusttrait Desenho {
fn desenhar(&self);
}
Agora podemos implementar este trait para a nossa struct Ponto
:
rustimpl Desenho for Ponto {
fn desenhar(&self) {
println!("Ponto ({}, {})", self.x, self.y);
}
}
Com esta implementação, podemos chamar o método desenhar
em qualquer instância de Ponto
para exibir suas coordenadas.
Em resumo, as structs em Rust são uma maneira poderosa e flexível de organizar e manipular dados de forma estruturada. Elas permitem definir tipos de dados personalizados com campos e métodos associados, e podem implementar comportamentos específicos usando traits. Essas características tornam as structs uma parte fundamental da programação em Rust, especialmente em projetos que exigem um alto nível de segurança, concorrência e desempenho.
“Mais Informações”
Claro, vou fornecer informações detalhadas sobre o uso de estruturas (structs) para organizar dados na linguagem Rust.
Em Rust, as structs são uma forma fundamental de organizar dados. Elas permitem que você defina tipos de dados personalizados, combinando vários campos em uma única estrutura. Isso é útil para representar entidades complexas ou dados relacionados de forma coesa.
Vamos explorar os aspectos mais importantes das structs em Rust:
Declaração de Structs:
Para declarar uma struct em Rust, você utiliza a palavra-chave struct
, seguida pelo nome da struct e a lista de campos dentro de chaves. Por exemplo:
ruststruct Pessoa {
nome: String,
idade: u32,
altura: f64,
}
Neste exemplo, definimos uma struct chamada Pessoa
com três campos: nome
(do tipo String
), idade
(do tipo u32
) e altura
(do tipo f64
).
Instanciando Structs:
Depois de definir uma struct, você pode criar instâncias dela atribuindo valores aos seus campos. Por exemplo:
rustlet pessoa1 = Pessoa {
nome: String::from("João"),
idade: 30,
altura: 1.75,
};
Acessando Campos:
Você pode acessar os campos de uma struct usando a notação de ponto (.
). Por exemplo:
rustprintln!("Nome: {}", pessoa1.nome);
println!("Idade: {}", pessoa1.idade);
println!("Altura: {}", pessoa1.altura);
Atualizando Campos:
Em Rust, os campos de uma struct podem ser mutáveis, permitindo que você os atualize conforme necessário. Por exemplo:
rustlet mut pessoa2 = Pessoa {
nome: String::from("Maria"),
idade: 25,
altura: 1.65,
};
pessoa2.idade = 26;
Métodos Associados:
Você também pode definir métodos associados a uma struct. Estes são métodos que operam na própria struct, sem a necessidade de uma instância dela. Por exemplo:
rustimpl Pessoa {
// Método associado para criar uma nova instância com idade incrementada
fn envelhecer(&self) -> Pessoa {
Pessoa {
idade: self.idade + 1,
..*self // mantém os outros campos inalterados
}
}
}
Exemplo Completo:
ruststruct Pessoa {
nome: String,
idade: u32,
altura: f64,
}
impl Pessoa {
fn envelhecer(&self) -> Pessoa {
Pessoa {
idade: self.idade + 1,
..*self
}
}
}
fn main() {
let pessoa1 = Pessoa {
nome: String::from("João"),
idade: 30,
altura: 1.75,
};
println!("Nome: {}", pessoa1.nome);
println!("Idade: {}", pessoa1.idade);
println!("Altura: {}", pessoa1.altura);
let mut pessoa2 = Pessoa {
nome: String::from("Maria"),
idade: 25,
altura: 1.65,
};
pessoa2.idade = 26;
println!("Nome: {}", pessoa2.nome);
println!("Idade: {}", pessoa2.idade);
println!("Altura: {}", pessoa2.altura);
let pessoa3 = pessoa2.envelhecer();
println!("Idade após envelhecer: {}", pessoa3.idade);
}
Este exemplo demonstra a declaração, instanciação, acesso e atualização de campos de uma struct em Rust, bem como a definição e uso de métodos associados.
Em resumo, as structs são uma ferramenta poderosa para organizar dados em Rust, permitindo a criação de tipos personalizados que encapsulam múltiplos valores relacionados. Elas desempenham um papel fundamental no desenvolvimento de programas robustos e eficientes em Rust.