
Inglés |中文
Practicar óxido con ejemplos, ejercicios y proyectos desafiantes
Este libro fue diseñado para sumergirse fácilmente y ser experto con óxido, es muy fácil de usar. ¡Todo lo que necesita hacer es hacer que cada ejercicio compile sin errores y pánico!
Parte de nuestros ejemplos y ejercicios se toman prestado de Rust con el ejemplo, ¡gracias por sus excelentes obras!
Aunque son tan increíbles, tenemos nuestras propias armas secretas :)
Hay tres partes en cada capítulo: ejemplos, ejercicios y prácticas
Además de ejemplos, tenemos a lot of exercises , puede leerlos, editarlos y ejecutarlos en línea
Cubriendo casi todos los aspectos de la óxido, como async/esperanza, hilos, primitivas de sincronización, optimización, bibliotecas estándar, cadena de herramientas, estructuras de datos y algoritmos, etc.
Cada ejercicio tiene sus propias soluciones
Las dificultades generales son un poco más altas y de fácil a súper difícil: ¿fácil? medio ?? duro ??? super duro ????
Lo que queremos hacer es llenar el vacío entre el aprendizaje y comenzar con proyectos reales.
¡Gracias a todos nuestros contribuyentes!
? Un agradecimiento especial a nuestro editor de inglés:
Águila bronceada |
Usamos Mdbook construyendo nuestros ejercicios. Puede ejecutar localmente con los pasos a continuación:
$ git clone [email protected]:sunface/rust-by-practice.git$ cargo install mdbook$ cd rust-by-practice && mdbook serve en/$ cd rust-by-practice && mdbook serve zh-CN/???? Tuple Struct se parece similar a las tuplas, ha agregado, lo que significa que el nombre de estructura proporciona pero no tiene campos nombrados. Es útil cuando quieres darle un nombre a toda la tupla, pero no me importan los nombres de los campos.
// fix the error and fill the blanks
struct Color ( i32 , i32 , i32 ) ;
struct Point ( i32 , i32 , i32 ) ;
fn main ( ) {
let v = Point ( ___ , ___ , ___ ) ;
check_color ( v ) ;
}
fn check_color ( p : Color ) {
let ( x , _ , _ ) = p ;
assert_eq ! ( x , 0 ) ;
assert_eq ! ( p . 1 , 127 ) ;
assert_eq ! ( ___ , 255 ) ;
}? Dentro de la destrucción de una sola variable, los enlaces de patrones de transferencia y de referencia se pueden usar al mismo tiempo. Hacer esto dará como resultado un movimiento parcial de la variable, lo que significa que las partes de la variable se moverán mientras se quedan otras partes. En tal caso, la variable principal no se puede usar después en su conjunto, sin embargo, las partes a las que solo se hace referencia (y no se mueven) aún se pueden usar.
// fix errors to make it work
# [ derive ( Debug ) ]
struct File {
name : String ,
data : String ,
}
fn main ( ) {
let f = File {
name : String :: from ( "readme.md" ) ,
data : "Rust By Practice" . to_string ( )
} ;
let _name = f . name ;
// ONLY modify this line
println ! ( "{}, {}, {:?}" , f . name , f . data , f ) ;
}? Un guardia de coincidencia es una condición adicional si se especifica después del patrón en un brazo de coincidencia que también debe coincidir, junto con la coincidencia del patrón, para que se elija ese brazo.
// fill in the blank to make the code work, `split` MUST be used
fn main ( ) {
let num = Some ( 4 ) ;
let split = 5 ;
match num {
Some ( x ) __ => assert ! ( x < split ) ,
Some ( x ) => assert ! ( x >= split ) ,
None => ( ) ,
}
}