2015-01-24 4 views
-1

Есть ли способ, чтобы выполнить доступ указательный к экземпляру структуры, как это:доступа Указатель экземпляра структуры

struct MyStruct { 
    //.... 

} 

impl MyStruct { 
    //.... 

} 

let s = MyStruct::new(); 
s["something"] = 533; //that's what I need 
+0

может быть отвечающими в состоянии дать более конкретные примеры, если вы объясните, что вы хотите 's [ "что-то"] = 533' до * до *. В противном случае мы просто сможем показать вам синтаксис и черты, которые вам нужно реализовать. – Shepmaster

+0

@Shepmaster, вы не понимаете, что '' что-то '' = 533' делает? –

+0

Недостаточно контекста, чтобы убедиться, что вы хотите. Он имеет возможность делать * все, что может сделать Rust * (запись файла, отправка данных по сети, 'panic'ing и т. Д.) До тех пор, пока в конце он возвращает изменчивую ссылку на интегральную переменную (и это не так ясно, если вы хотите 16-, 32- или 64-битное значение, но это просто педантично). – Shepmaster

ответ

6

Вы можете использовать признаки Index и IndexMut.

use std::ops::{Index, IndexMut}; 

struct Foo { x: i32, y: i32 } 

impl<'a> Index<&'a str> for Foo { 
    type Output = i32; 
    fn index(&self, s: &&'a str) -> &i32 { // ' 
     match *s { 
      "x" => &self.x, 
      "y" => &self.y, 
      _ => panic!("unknown field: {}", s) 
     } 
    } 
} 
impl<'a> IndexMut<&'a str> for Foo { 
    type Output = i32; 
    fn index_mut(&mut self, s: &&'a str) -> &mut i32 { // ' 
     match *s { 
      "x" => &mut self.x, 
      "y" => &mut self.y, 
      _ => panic!("unknown field: {}", s) 
     } 
    } 
} 
fn main() { 
    let mut foo = Foo { 
     x: 0, 
     y: 0, 
    }; 

    foo["y"] += 2; 
    println!("x: {}", foo["x"]); 
    println!("y: {}", foo["y"]); 
} 

Он печатает:

x: 0 
y: 2 
+0

Должен ли я использовать их обоих? –

+2

Если вы хотите обе операции, да. – huon

+0

Так как же 'foo ['y']' полезно от 'f.y'? У нас есть 'f.y', так или иначе? Но я хочу иметь только 'foo ['y']' ** ** и вообще не делать 'f.y'. –

-1

Вы хотите использовать Index trait (и его пары IndexMut):

use std::ops::Index; 

#[derive(Copy, Clone)] 
struct Foo; 
struct Bar; 

impl Index<Bar> for Foo { 
    type Output = Foo; 

    fn index<'a>(&'a self, _index: Bar) -> &'a Foo { 
     println!("Indexing!"); 
     self 
    } 
} 

fn main() { 
    Foo[Bar]; 
} 
+1

Это копия из документации, как она связана с моим вопросом? Я имею в виду, как я могу принять его для моего случая, когда тип индекса является строкой? –

+4

Это действительно копия; зачем мне переписывать совершенно искупительный пример, когда уже готова документация Rust? Я скопировал его здесь, если связь сломается с течением времени. Если вы не можете перевести примеры из документации в конкретный случай, вам следует связать документы с исходным вопросом и задать конкретный вопрос о той части, с которой вы столкнулись. – Shepmaster

+0

Что вы пытаетесь меня убедить? –

Смежные вопросы