Skip to content

Commit a4eef7b

Browse files
committed
feat: add content for slices and integers, update navigation paths
1 parent 6de946b commit a4eef7b

4 files changed

Lines changed: 240 additions & 1 deletion

File tree

content/10.bool-and-float.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ initialCode: |
1616
tests:
1717
- should be contain `.`
1818
- should be contain `true` `false`
19+
- code should be contain `true` `false`
1920
order: 10
2021
---
2122
# Tipos de datos

content/11.characters.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
nextPath: ""
2+
nextPath: "slice-string"
33
previousPath: "bool-and-float"
44
initialCode: |
55
fn main() {

content/12.slice-string.md

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
---
2+
nextPath: ""
3+
previousPath: "characters"
4+
initialCode: |
5+
fn main() {
6+
let texto = "Ejercitando en Rustlings Web";
7+
8+
let slice1 =
9+
let slice2 =
10+
11+
println!("{slice1}");
12+
println!("{slice2}");
13+
}
14+
expectedResponse: "Ejercitando\nRust\n"
15+
order: 12
16+
---
17+
18+
# Tipos de datos: Slices de cadena (`&str`)
19+
20+
En Rust, además de los caracteres (`char`), existe una forma muy común de representar texto: el **slice de cadena** o `&str`.
21+
22+
---
23+
24+
## 🔹 ¿Qué es un `&str`?
25+
26+
Un `&str` es una **vista inmutable sobre una cadena de texto**.
27+
28+
* Se suele usar para literales de cadena (`"hola"`).
29+
* No lo podemos modificar.
30+
* Se guarda como una **referencia** a una secuencia de bytes UTF-8.
31+
32+
👉 Piensa en `&str` como un "texto prestado": está ahí, puedes leerlo, pero no puedes cambiarlo.
33+
34+
---
35+
36+
## Ejemplo básico
37+
38+
```rust
39+
fn main() {
40+
let saludo: &str = "Hola mundo";
41+
42+
println!("Saludo: {saludo}");
43+
}
44+
```
45+
46+
Salida:
47+
48+
```sh [salida]
49+
Saludo: Hola mundo
50+
```
51+
52+
También podemos crear slices a partir de otros `&str`:
53+
54+
```rust
55+
fn main() {
56+
let texto: &str = "Aprendiendo Rust";
57+
let slice1: &str = &texto[0..11]; // "Aprendiendo"
58+
let slice2: &str = &texto[12..16]; // "Rust"
59+
60+
println!("Slice 1: {slice1}");
61+
println!("Slice 2: {slice2}");
62+
}
63+
```
64+
65+
Salida:
66+
67+
```sh [salida]
68+
Slice 1: Aprendiendo
69+
Slice 2: Rust
70+
```
71+
72+
---
73+
74+
## 🔹 Recapitulemos
75+
76+
* `&str` representa una **cadena inmutable**, comúnmente usada para literales (`"hola"`).
77+
* Es el tipo más **ligero y eficiente** para representar cadenas de texto, ya que no necesita asignar memoria dinámica.
78+
* Podemos obtener `&str` a partir de:
79+
80+
* Un literal (`"texto"`).
81+
* Un slice de otro `&str` (`texto[0..4]`).
82+
83+
👉 En capítulos posteriores veremos cómo combinar `&str` y `String` para trabajar con texto mutable y prestado al mismo tiempo.
84+
85+
---
86+
87+
## ✍️ Ejercicio
88+
89+
1. Declara un `&str` con el valor `"Ejercitando en Rustlings Web"`.
90+
2. Crea un slice con la palabra `"Ejercitando"`.
91+
3. Crea otro slice con la palabra `"Rust"`.
92+
4. Imprime ambos slices con `println!`.
93+
5. 👉 No modifiques los `println!` que ya están en el código base.

content/13.integers.md

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
---
2+
nextPath: ""
3+
previousPath: "slice-string"
4+
initialCode: |
5+
fn main() {
6+
let entero_negativo
7+
let entero_positivo
8+
let entero_mil
9+
10+
let suma = entero_negativo + entero_positivo + entero_mil;
11+
let multiplicacion = entero_negativo * entero_positivo * entero_mil;
12+
13+
// No modificar esto 👀
14+
println!("Suma: {suma}");
15+
println!("Multiplicación: {multiplicacion}");
16+
}
17+
tests:
18+
- code should be contain `i8`
19+
- code should be contain `u16`
20+
- code should be contain `i32`
21+
- code should be contain `Suma: `
22+
- code should be contain `Multiplicación: `
23+
order: 13
24+
---
25+
26+
# Tipos de datos: Enteros
27+
28+
En Rust, además de los booleanos, flotantes, caracteres (`char`) y los slices (`&str`), tenemos otros tipos **escalares**.
29+
Los escalares representan un único valor simple, no una colección.
30+
Los más comunes son: **enteros, flotantes, booleanos y caracteres**.
31+
32+
## 🔹 Enteros
33+
34+
Los enteros son números sin parte decimal.
35+
En Rust existen varios tamaños, tanto **con signo** (`i`) como **sin signo** (`u`):
36+
37+
* `i8`, `i16`, `i32`, `i64`, `i128`, `isize` → con signo (pueden ser negativos).
38+
* `u8`, `u16`, `u32`, `u64`, `u128`, `usize` → sin signo (solo positivos).
39+
40+
👉 El número indica la **cantidad de bits** que ocupa en memoria.
41+
Por ejemplo:
42+
43+
* `i8` → son numeros en el rango de -128 a 127.
44+
* `u8` → son numeros en el rango de 0 a 255.
45+
* `i32` → son numeros en el rango de -2,147,483,648 a 2,147,483,647.
46+
47+
---
48+
49+
## Ejemplo básico
50+
51+
```rust
52+
fn main() {
53+
let positivo: u32 = 42;
54+
let negativo: i32 = -42;
55+
56+
println!("Número positivo: {positivo}");
57+
println!("Número negativo: {negativo}");
58+
}
59+
```
60+
61+
Salida:
62+
63+
```sh [salida]
64+
Número positivo: 42
65+
Número negativo: -42
66+
```
67+
68+
---
69+
70+
## 🔹 Operaciones con enteros
71+
72+
Podemos realizar operaciones aritméticas básicas:
73+
74+
```rust
75+
fn main() {
76+
let a: i32 = 10;
77+
let b: i32 = 3;
78+
79+
println!("Suma: {}", a + b);
80+
println!("Resta: {}", a - b);
81+
println!("Multiplicación: {}", a * b);
82+
println!("División: {}", a / b);
83+
println!("Módulo: {}", a % b);
84+
}
85+
```
86+
87+
---
88+
89+
## 🔹 Literales de enteros
90+
91+
Rust permite escribir enteros en distintos formatos:
92+
93+
```rust
94+
fn main() {
95+
let decimal = 98_222; // decimal (los _ son separadores)
96+
let hexadecimal = 0xff; // hexadecimal
97+
let octal = 0o77; // octal
98+
let binario = 0b1111_0000; // binario
99+
let byte = b'A'; // byte (u8 con valor ASCII)
100+
101+
println!("{decimal}, {hexadecimal}, {octal}, {binario}, {byte}");
102+
}
103+
```
104+
105+
Los cuales no suelen ser formatos tipicos pero estan disponibles.
106+
107+
La manera más sencilla de declarar un entero es sin especificar el tipo, en cuyo caso Rust asume que es `i32`:
108+
109+
```rust
110+
fn main() {
111+
let numero = 42; // Asumido como i32 por defecto
112+
println!("Número: {numero}");
113+
}
114+
```
115+
116+
Salida:
117+
118+
```sh [salida]
119+
Número: 42
120+
```
121+
122+
Es la forma más típica.
123+
124+
---
125+
126+
## 🔹 Recapitulemos
127+
128+
* Los **enteros** son valores escalares que representan números sin decimales.
129+
* Existen tipos con signo (`iXX`) y sin signo (`uXX`).
130+
* Podemos hacer operaciones aritméticas básicas (`+`, `-`, `*`, `/`, `%`).
131+
* También existen literales en distintas bases: decimal, hex, octal, binario y byte.
132+
133+
---
134+
135+
## ✍️ Ejercicio
136+
137+
1. Declara tres variables de tipo entero:
138+
139+
* Una de tipo `i8` con un número negativo.
140+
* Una de tipo `u16` con un número positivo.
141+
* Una de tipo `i32` con el valor `1000`.
142+
2. Realiza una suma y una multiplicación usando esas variables.
143+
3. 👉 No cambies los `println!` ya escritos.
144+
4. ¡Ejecuta el código y revisa el resultado!
145+

0 commit comments

Comments
 (0)