Bucle sobre las variables locales [cerradas] -- rust camp Relacionados El problema

Looping over local variables [closed]


1
vote

problema

Español
cerrado . Esta pregunta es basada en opinión . Actualmente no está aceptando respuestas.

¿Quieres mejorar esta pregunta? Actualizar la pregunta para que pueda responderse con hechos y citas de Edición de este post .

CERRADO hace 5 meses .

Mejorar esta pregunta

en óxido, ¿hay una manera más limpia para que escriba esto?

  for i in [&mut foo, &mut bar, &mut baz, &mut quux, &mut bob].iter_mut() {     i.handle_event(event) }   

El bucle anterior aparece en tres lugares en mi función. foo , bar ETC son variables locales mutables todo el mismo tipo.

  let mut foo = MyType::new(...); let mut bar = MyType::new(...); ...   

No quiero escribir let mut v = vec![foo, bar, baz, quuz, bob] porque el vector consumiría las variables. También necesito escribir cosas como bar.set_strength(10) o lo que sea, y no quiero escribir v[1].set_strength(10) ; El código es mucho más claro si puedo referirme a cada nombre.

Original en ingles

In Rust, is there a cleaner way for me to write this?

for i in [&mut foo, &mut bar, &mut baz, &mut quux, &mut bob].iter_mut() {     i.handle_event(event) } 

The above loop appears in three places in my function. foo, bar etc are mutable local variables all of the same type.

let mut foo = MyType::new(...); let mut bar = MyType::new(...); ... 

I don't want to write let mut v = vec![foo, bar, baz, quuz, bob] because the vector would consume the variables. I also need to write things like bar.set_strength(10) or whatever, and I don't want to write v[1].set_strength(10); the code is much clearer if I can refer to each by name.

  
 
 

Lista de respuestas

1
 
vote

No estoy seguro de si esto es más limpio, pero aquí hay una forma de hacerlo con una macro:

macro_rules! mut_loop { ($i:pat in [$($var:ident),*] $block:block) => { for _mut_loop_var in [$(&mut $var),*].iter_mut() { let $i = &mut **_mut_loop_var; $block; } } } fn main() { let mut foo = 0u32; let mut bar = 0; let mut baz = 0; let mut quux = 0; let mut bob = 0; mut_loop!(i in [foo, bar, baz, quux, bob] { *i += 5; // i.handle_event(event) }); }

 

I'm not sure if this is any cleaner but here is one way to do this with a macro:

Playground

macro_rules! mut_loop {     ($i:pat in [$($var:ident),*] $block:block) => {         for _mut_loop_var in [$(&mut $var),*].iter_mut() {             let $i = &mut **_mut_loop_var;             $block;         }     } }  fn main() {     let mut foo = 0u32;     let mut bar = 0;     let mut baz = 0;     let mut quux = 0;     let mut bob = 0;     mut_loop!(i in [foo, bar, baz, quux, bob] {         *i += 5;         // i.handle_event(event)     }); } 
 
 

Relacionados problema

0  ¡Cómo pasar un token de visibilidad a los Bitflags! ¿macro?  ( How to pass a visibility token to the bitflags macro ) 
Estoy usando el bitflags caja. Quiero generar automáticamente algunas otras implementaciones para mis tipos, así que intenté llamar a la macro 9988776662 ...

4  ¿Es cierto que para todos los tipos `t`,` u` si 't` está coaccionado a `u` entonces` & t` es coaccionado para `& u`?  ( Is it true that for all types t u if t is coerced to u then t is coe ) 
es bien documentado que [T; n] puede coaccionar a [T] . El siguiente código también es Si 99887776611111 está obligado a import re dset = [] text = ...

4  Anexar la cadena, no puede salir de la distensión de '&' Pointer  ( String append cannot move out of dereference of pointer ) 
Estoy teniendo problemas para combinar dos cuerdas, soy muy nuevo en óxido, así que si hay una manera más fácil de hacer esto, no dude en mostrarme. My Func...

8  Tratar con las relaciones problemáticas de padres e hijos aplicadas por C FFI  ( Dealing with problematic parent child relationships enforced by c ffi ) 
Tengo una biblioteca C con una interfaz similar a esta: (He representado a la API C dentro de la óxida, de modo que todo el código en esta pregunta se pueda c...

6  ¿Cómo actualizar o insertar en un VEC?  ( How to update or insert on a vec ) 
Estoy escribiendo una estructura de datos en óxido. Contiene un Vec de pares de valor clave. Cuando se inserta en la estructura, necesito encontrar una clav...

5  Implementar FMT :: PANTALLA PARA VEC <T>  ( Implement fmtdisplay for vect ) 
Quiero implementar el fmt::Display para una estructura anidada comúnmente utilizada en mi código. // The root structure pub struct WhisperFile<'a> { ...

0  ¿Cómo puedo eliminar la variable mutable en esta función de MandelBrot sin recursión?  ( How can i remove the mutable variable in this mandelbrot function without recurs ) 
La siguiente función calcula el número de órbitas que lleva a una Monelbrot Fractal Valor inicial para " Escape ": extern crate num; fn mandel_escape(x:...

3  ¿Cómo coincidir para una opción con campos múltiples?  ( How to match for an option with multiple fields ) 
¿Cómo igualo a una opción con múltiples campos? Tengo el siguiente código: let opt_windowrecv = glfw_context.create_window(1280, 720, "Hello World!", glfw:...

1  Moviéndose y devolviendo un puntero mutable  ( Moving and returning a mutable pointer ) 
Estoy trabajando a través de este tutorial de óxido , y estoy tratando de Resuelve este problema: Implementar una función, incrementMut que toma como in...

8  ¿Por qué todos los índices están en óxido de tipo de uso?  ( Why are all indexes in rust of type usize ) 
óxico std::ops::Index<T> solo Admite T siendo un usize . ¿Cuál es la razón detrás de esto? Además, no hay consejos para "intentar usar usando" cuando...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos