una referencia puede propiedad programacion por pase pasar pasaje parámetro parametros objeto metodos metodo indizador funciones con como rust

rust - referencia - ¿Qué tipos son válidos para el parámetro `self` de un método?



pase de parametros por referencia c# (1)

Por el momento, estos son los válidos:

struct Foo; impl Foo { fn by_val(self: Foo) {} // aka by_val(self) fn by_ref(self: &Foo) {} // aka by_ref(&self) fn by_mut_ref(self: &mut Foo) {} // aka by_mut_ref(&mut self) fn by_box(self: Box<Foo>) {} // no short form } fn main() {}

Hasta hace poco , Rust no tenía esta forma self explícita, solo self , &self , &mut self y ~self (el antiguo nombre de Box ). Esto cambió de modo que solo las referencias by-value y by-tienen la sintaxis incorporada de short-hand, ya que son los casos comunes y tienen propiedades de lenguaje muy clave, mientras que todos los punteros inteligentes (incluido Box ) requieren la forma explícita.

Sin embargo, el manejo de impl no se ha generalizado para que coincida con la sintaxis, lo que significa que los punteros que no son Box todavía no funcionan. Creo que requiere la llamada '''' reforma de rasgos '''' que aún no se ha implementado.

(¡Algo que espero con impaciencia!)

Quería crear un método que solo funcionara en el caso de que self parámetro self fuera un Rc . Vi que podía usar Box , así que pensé que podría tratar de imitar cómo funciona eso:

use std::rc::Rc; use std::sync::Arc; struct Bar; impl Bar { fn consuming(self) {} fn reference(&self) {} fn owned(self: Box<Bar>) {} fn ref_count(self: Rc<Bar>) {} fn atomic_ref_count(self: Arc<Bar>) {} } fn main() {}

Produce estos errores:

error[E0308]: mismatched method receiver --> src/main.rs:10:18 | 10 | fn ref_count(self: Rc<Bar>) {} | ^^^^ expected struct `Bar`, found struct `std::rc::Rc` | = note: expected type `Bar` = note: found type `std::rc::Rc<Bar>` error[E0308]: mismatched method receiver --> src/main.rs:11:25 | 11 | fn atomic_ref_count(self: Arc<Bar>) {} | ^^^^ expected struct `Bar`, found struct `std::sync::Arc` | = note: expected type `Bar` = note: found type `std::sync::Arc<Bar>`

Esto es con Rust 1.13, y también puedes verlo en el corralito