2015-05-26 12 views
34

Borçlanma ve sahiplikle karıştırıldım. Rust documentation about reference and borrowingBaskı yapıyor! değişkeni ödünç aldınız mı?

let mut x = 5; 
{ 
    let y = &mut x; 
    *y += 1; 
} 
println!("{}", x); 

yılında Bunlar

println!x ödünç alabilir söylüyorlar.

Bu karıştı. println!x ödünç, niçin geçemez '& x' 'x' gelir?

yukarıda println! için '& X' I geçmesi dışında

fn main() { 
    let mut x = 5; 
    { 
     let y = &mut x; 
     *y += 1; 
    } 
    println!("{}", &x); 
} 

Bu kod kodu ile aynıdır altında bu kodu çalıştırmayı. Konsola doğru '6' yazıyor ve bu da ilk kodla aynı sonucu veriyor.

cevap

34

makro print!, println!, eprint!, eprintln!, write!, writeln! ve format!, özel bir durum vardır, normal şeyler kolaylık nedenlerle gibi davranmıyor. Referansları sessizce aldıkları gerçeği bu farklılığın bir parçası. Gece derleyici üzerinde rustc -Z unstable-options --pretty expanded aracılığıyla

fn main() { 
    let x = 5; 
    println!("{}", x); 
} 

Run it ve biz println! genişler görebilirsiniz:

#![feature(prelude_import)] 
#![no_std] 
#[prelude_import] 
use std::prelude::v1::*; 
#[macro_use] 
extern crate std as std; 
fn main() { 
    let x = 5; 
    ::io::_print(::std::fmt::Arguments::new_v1(
     { 
      static __STATIC_FMTSTR: &'static [&'static str] = &["", "\n"]; 
      __STATIC_FMTSTR 
     }, 
     &match (&x,) { 
      (__arg0,) => { 
       [ 
        ::std::fmt::ArgumentV1::new(__arg0, ::std::fmt::Display::fmt), 
       ] 
      } 
     }, 
    )); 
} 

çok derli toplu, o da şu:

use std::fmt; 
use std::io; 

fn main() { 
    let x = 5; 
    io::_print(fmt::Arguments::new_v1(
     &["", "\n"]; 
     &[fmt::ArgumentV1::new(&x, fmt::Display::fmt)], 
    )); 
} 

Not &x. Eğer println!("{}", &x) yazarsanız

, daha sonra referanslardan iki seviyeleri ile ilgileniyor; T (impl<'a, T> Display for &'a T where T: Display + ?Sized olarak gösterilmektedir) Display uyguladığında &T için std::fmt::Display bir uygulama sadece geçtiği yoktur, çünkü bu aynı sonucu verir. &&&&&&&&&&&&&&&&&&&&&&&x'u da yazabilirsiniz. O makroları "özel durum" derim neden

+0

anlamıyorum. Bu tür bir örtük referans geçirme, herhangi bir makro için uygulanabilir. –

+4

@MarkusUnterwaditzer: Tabii, ama şey normal görünüyor ama olmadığıdır. Ve elbette, diğer makrolar da kendilerini özel durumlara dönüştürebilir. Gerçek şu ki, genel olarak şiddetle tavsiye edilir. –

İlgili konular