pointers - Understanding deref -


the following rust deref example http://doc.rust-lang.org/book/deref-coercions.html, except i've added assert.

my question why assert_eq deref equal 'a'? flip side question is: why need * once i've manually called deref?

use std::ops::deref;  struct derefexample<t> {     value: t, }  impl<t> deref derefexample<t> {     type target = t;      fn deref(&self) -> &t {         &self.value     } }  fn main() {     let x = derefexample { value: 'a' };     assert_eq!('a', *x.deref()); // true     // assert_eq!('a', x.deref()); // compile error     assert_eq!('a', *x); // true     println!("ok"); } 

first, let's spell out generic types specific example: 'a' char, have (not valid syntax):

struct derefexample<char> {     value: char, }  impl<char> deref derefexample<char> {     type target = char;      fn deref(&self) -> &char {         &self.value     } } 

notably, return type of deref reference char. shouldn't surprising that, when use x.deref(), result &char rather char (which compiler tell if uncomment assertion). remember, @ point deref normal method — it's implicitly invoked part of language-provided special syntax. *x, example, call deref , dereference result, when applicable. x.char_method() , fn_taking_char(&x) call deref number of times , further result.

why deref returns reference begin with, ask? isn't circular? well, no, isn't circular: reduces library-defined smart pointers built-in type &t, compiler knows how dereference. , returning reference instead of value, avoid copy/move (which may not possible!) , allow &*x (or &x when it's coerced) refer actual char derefexample holds rather temporary copy.


Comments

Popular posts from this blog

angularjs - ADAL JS Angular- WebAPI add a new role claim to the token -

node.js - Using Node without global install -

php - CakePHP HttpSockets send array of paramms -