Professional Documents
Culture Documents
*QMi2Mib
R AMi`Q/m+iBQM
RR
RXR
*QMi`B#miBM; X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
Rk
RXk
Rk
k :2iiBM; ai`i2/
R8
kXR
AMbiHHBM; _mbi X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
R8
kXk
>2HHQ- rQ`H/5
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
Rd
kXj
>2HHQ- *`;Q5 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
RN
j G2`M _mbi
jXR
kj
:m2bbBM; :K2 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
kj
jXRXR
a2i mT X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
kj
jXRXk
S`Q+2bbBM; :m2bb X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
k9
jXRXj
k3
jXRX9
*QKT`BM; ;m2bb2b X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
jR
jXRX8
GQQTBM; X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
j8
jXRXe
*QKTH2i25 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
9y
jXk
.BMBM; S?BHQbQT?2`b X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
9y
jXj
8R
jXjXR
h?2 T`Q#H2K X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
8k
jXjXk
_mbi HB#``v X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
8j
jXjXj
_m#v X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
88
jXjX9
Svi?QM X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
8e
jXjX8
LQ/2XDb X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
8d
jXjXe
*QM+HmbBQM X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
8d
*PLh1Lha
9 1z2+iBp2 _mbi
9XR
8N
8N
9XRXR
J2KQ`v KM;2K2Mi X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
8N
9XRXk
h?2 ai+F X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
ey
9XRXj
h?2 >2T X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
ej
9XRX9
e9
9XRX8
+QKTH2t 2tKTH2
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
e8
9XRXe
eN
9XRXd
q?B+? iQ mb2\ X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
eN
h2biBM; X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
dy
9XkXR
h?2
test
ii`B#mi2 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
dy
9XkXk
h?2
tests
KQ/mH2 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
d9
9XkXj
h?2
tests
/B`2+iQ`v X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
d8
9XkX9
.Q+mK2MiiBQM i2bib X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
de
*QM/BiBQMH *QKTBHiBQM X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
d3
9XjXR
+7;nii` X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
dN
9XjXk
+7;5 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
dN
9X9
.Q+mK2MiiBQM X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
dN
9X8
Ai2`iQ`b X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
3N
9Xe
*QM+m``2M+v X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
N9
9Xd
9Xk
9Xj
9X3
9XdXR
9XdXk
9XdXj
9XdX9
9XdX8
lbBM;
try!
Option
M/
Result
panic!
X X X X X X X X X X X X X X X X X X X Ryk
X X X X X X X X X X X X X X X X X X X X X X Ry9
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Ry9
66A
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Rye
9X3XR
AMi`Q/m+iBQM X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Rye
9X3Xk
9X3Xj
.2bi`m+iQ`b X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X RyN
9X3X9
9X3X8
GBMFBM; X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X RRk
9X3Xe
*PLh1Lha
9X3Xd
9X3X3
9X3XN
"Q``Qr X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X RRe
9XNXk
b_27 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X RRd
9XNXj
RRN
8XR
8Xk
6mM+iBQMb X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Rkk
8Xj
"QQH2Mb
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Rke
8XjXk
char
8XjXj
8XjX9
``vb X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Rk3
8XjX8
aHB+2b X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Rk3
8XjXe
str
8XjXd
hmTH2b X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X RkN
8XjX3
6mM+iBQMb X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Rjy
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Rke
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X RkN
8X9
*QKK2Mib X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X RjR
8X8
B7 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X RjR
8Xe
8Xd
8X3
PrM2`b?BT X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Rj8
8X3XR
J2i X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Rj8
8X3Xk
PrM2`b?BT
8X3Xj
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Rje
*PLh1Lha
8X3X9
8XN
J2i X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X RjN
8XNXk
"Q``QrBM; X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X RjN
8XNXj
8XNX9
8XRy GB72iBK2b
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X R98
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Rey
*PLh1Lha
const
8XkdXR
M/
static
static
use
X X X X X X X X X X X X X X X X X X X X X X X X X X ky9
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X kyd
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X kyd
8XkdXk AMBiBHBxBM;
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X ky3
type
HBb2b X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X kyN
as
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X kRR
8XjyXk
transmute
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X kRk
*PLh1Lha
8XjR bbQ+Bi2/ hvT2b X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X kRk
8Xjk lMbBx2/ hvT2b X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X kR8
8XjkXR \aBx2/ X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X kRe
8Xjj PT2`iQ`b M/ Pp2`HQ/BM; X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X kRe
8Xj9 .2`27 +Q2`+BQMb X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X kR3
8Xj8 J+`Qb X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X kky
8Xj8XR .2}MBM; K+`Q X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X kky
8Xj8Xk >v;B2M2 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X kk9
8Xj8Xj _2+m`bBp2 K+`Qb X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X kke
8Xj8X9 .2#m;;BM; K+`Q +Q/2 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X kkd
8Xj8X8 avMi+iB+ `2[mB`2K2Mib X X X X X X X X X X X X X X X X X X X X X X X X X X X X X kkd
8Xj8Xe a+QTBM; M/ K+`Q BKTQ`if2tTQ`i X X X X X X X X X X X X X X X X X X X X X X kk3
8Xj8Xd h?2 p`B#H2
$crate
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X kjy
unsafe
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X kj8
kjN
AMi`Q/m+iBQM X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X k9R
eXRXk
eXRXj
eXk
eXj
LQ bi/HB# X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X k93
eX9
AMi`BMbB+b X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X k8R
eX8
eXe
*PLh1Lha
eXd
eX3
eXN
keR
3 +/2KB+ _2b2`+?
kej
Ry
*PLh1Lha
AMi`Q/m+iBQM
q2H+QK25 h?Bb #QQF rBHH i2+? vQm #Qmi i?2 _mbi S`Q;`KKBM; GM;m;2R X _mbi Bb bvbi2Kb
T`Q;`KKBM; HM;m;2 7Q+mb2/ QM i?`22 ;QHb, b72iv- bT22/- M/ +QM+m``2M+vX Ai KBMiBMb i?2b2
;QHb rBi?Qmi ?pBM; ;`#;2 +QHH2+iQ`- KFBM; Bi mb27mH HM;m;2 7Q` MmK#2` Q7 mb2 +b2b
Qi?2` HM;m;2b `2Mi ;QQ/ i, 2K#2//BM; BM Qi?2` HM;m;2b- T`Q;`Kb rBi? bT2+B}+ bT+2
M/ iBK2 `2[mB`2K2Mib- M/ r`BiBM; HQr@H2p2H +Q/2- HBF2 /2pB+2 /`Bp2`b M/ QT2`iBM; bvbi2KbX Ai
BKT`Qp2b QM +m``2Mi HM;m;2b i`;2iBM; i?Bb bT+2 #v ?pBM; MmK#2` Q7 +QKTBH2@iBK2 b72iv
+?2+Fb i?i T`Q/m+2 MQ `mMiBK2 Qp2`?2/- r?BH2 2HBKBMiBM; HH /i `+2bX _mbi HbQ BKb iQ
+?B2p2 x2`Q@+Qbi #bi`+iBQMb 2p2M i?Qm;? bQK2 Q7 i?2b2 #bi`+iBQMb 722H HBF2 i?Qb2 Q7 ?B;?@
H2p2H HM;m;2X 1p2M i?2M- _mbi biBHH HHQrb T`2+Bb2 +QMi`QH HBF2 HQr@H2p2H HM;m;2 rQmH/X
h?2 _mbi S`Q;`KKBM; GM;m;2 Bb bTHBi BMiQ b2p2M b2+iBQMbX h?Bb BMi`Q/m+iBQM Bb i?2 }`biX
7i2` i?Bb,
:2iiBM; bi`i2/ U+?Ti2` k- T;2 R8V @ a2i mT vQm` +QKTmi2` 7Q` _mbi /2p2HQTK2MiX
G2`M _mbi U+?Ti2` j- T;2 kjV @ G2`M _mbi T`Q;`KKBM; i?`Qm;? bKHH T`QD2+ibX
1z2+iBp2 _mbi U+?Ti2` 9- T;2 8NV @ >B;?2`@H2p2H +QM+2Tib 7Q` r`BiBM; 2t+2HH2Mi _mbi +Q/2X
avMit M/ a2KMiB+b U+?Ti2` 8- T;2 RRNV @ 1+? #Bi Q7 _mbi- #`QF2M /QrM BMiQ bKHH
+?mMFbX
LB;?iHv _mbi U+?Ti2` e- T;2 kjNV @ *miiBM;@2/;2 72im`2b i?i `2Mi BM bi#H2 #mBH/b v2iX
:HQbb`v U+?Ti2` d- T;2 keRV @ `272`2M+2 Q7 i2`Kb mb2/ BM i?2 #QQFX
+/2KB+ _2b2`+? U+?Ti2` 3- T;2 kejV @ GBi2`im`2 i?i BM~m2M+2/ _mbiX
7i2` `2/BM; i?Bb BMi`Q/m+iBQM- vQmHH rMi iQ /Bp2 BMiQ 2Bi?2` G2`M _mbi Q` avMit M/
a2KMiB+b- /2T2M/BM; QM vQm` T`272`2M+2, G2`M _mbi B7 vQm rMi iQ /Bp2 BM rBi? T`QD2+i- Q`
avMit M/ a2KMiB+b B7 vQm T`272` iQ bi`i bKHH- M/ H2`M bBM;H2 +QM+2Ti i?Q`Qm;?Hv #27Q`2
KQpBM; QMiQ i?2 M2tiX *QTBQmb +`Qbb@HBMFBM; +QMM2+ib i?2b2 T`ib iQ;2i?2`X
R ?iiT,ff`mbi@HM;XQ`;
Rk
*>Sh1_ RX ALh_P.l*hAPL
RXR
*QMi`B#miBM;
h?2 bQm`+2 }H2b 7`QK r?B+? i?Bb #QQF Bb ;2M2`i2/ +M #2 7QmM/ QM :Bi?m#, ;Bi?m#X+QKf`mbi@
HM;f`mbifi`22fKbi2`fb`+f/Q+fi`THk
RXk
Ab _mbi HM;m;2 vQm KB;?i #2 BMi2`2bi2/ BM\ G2ib 2tKBM2 72r bKHH +Q/2 bKTH2b iQ b?Qr
Qz 72r Q7 Bib bi`2M;i?bX
h?2 KBM +QM+2Ti i?i KF2b _mbi mMB[m2 Bb +HH2/ QrM2`b?BTX *QMbB/2` i?Bb bKHH 2tKTH2,
fn main() {
let mut x = vec!["Hello", "world"];
}
h?Bb T`Q;`K KF2b p`B#H2 #BM/BM; Ub2+iBQM 8XR- T;2 RRNV MK2/ xX h?2 pHm2 Q7 i?Bb #BM/BM;
Bb Vec<T>- p2+iQ`- i?i r2 +`2i2 i?`Qm;? K+`Q Ub2+iBQM 8Xj8- T;2 kkyV /2}M2/ BM i?2
biM/`/ HB#``vX h?Bb K+`Q Bb +HH2/ vec- M/ r2 BMpQF2 K+`Qb rBi? !X h?Bb 7QHHQrb ;2M2`H
T`BM+BTH2 Q7 _mbi, KF2 i?BM;b 2tTHB+BiX J+`Qb +M /Q bB;MB}+MiHv KQ`2 +QKTHB+i2/ i?BM;b
i?M 7mM+iBQM +HHb- M/ bQ i?2v`2 pBbmHHv /BbiBM+iX h?2 ! HbQ ?2HTb rBi? T`bBM;- KFBM;
iQQHBM; 2bB2` iQ r`Bi2- r?B+? Bb HbQ BKTQ`iMiX
q2 mb2/ mut iQ KF2 x Kmi#H2, #BM/BM;b `2 BKKmi#H2 #v /27mHi BM _mbiX q2HH #2 KmiiBM;
i?Bb p2+iQ` Hi2` BM i?2 2tKTH2X
Aib HbQ rQ`i? MQiBM; i?i r2 /B/Mi M22/ ivT2 MMQiiBQM ?2`2, r?BH2 _mbi Bb biiB+HHv ivT2/r2 /B/Mi M22/ iQ 2tTHB+BiHv MMQii2 i?2 ivT2X _mbi ?b ivT2 BM72`2M+2 iQ #HM+2 Qmi i?2 TQr2`
Q7 biiB+ ivTBM; rBi? i?2 p2`#QbBiv Q7 MMQiiBM; ivT2bX
_mbi T`272`b bi+F HHQ+iBQM iQ ?2T HHQ+iBQM, x Bb TH+2/ /B`2+iHv QM i?2 bi+FX >Qr2p2`- i?2
ivT2 HHQ+i2b bT+2 7Q` i?2 2H2K2Mib Q7 i?2 p2+iQ` QM i?2 ?2TX A7 vQm`2 MQi 7KBHB` rBi?
i?Bb /BbiBM+iBQM- vQm +M B;MQ`2 Bi 7Q` MQr- Q` +?2+F Qmi h?2 ai+F M/ i?2 >2T Ub2+iBQM 9XRT;2 8NVX b bvbi2Kb T`Q;`KKBM; HM;m;2- _mbi ;Bp2b vQm i?2 #BHBiv iQ +QMi`QH ?Qr vQm`
K2KQ`v Bb HHQ+i2/- #mi r?2M r2`2 ;2iiBM; bi`i2/- Bib H2bb Q7 #B; /2HX
Vec<T>
1`HB2`- r2 K2MiBQM2/ i?i QrM2`b?BT Bb i?2 F2v M2r +QM+2Ti BM _mbiX AM _mbi T`HM+2- x Bb bB/
iQ QrM i?2 p2+iQ`X h?Bb K2Mb i?i r?2M x ;Q2b Qmi Q7 b+QT2- i?2 p2+iQ`b K2KQ`v rBHH #2 /2@
HHQ+i2/X h?Bb Bb /QM2 /2i2`KBMBbiB+HHv #v i?2 _mbi +QKTBH2`- `i?2` i?M i?`Qm;? K2+?MBbK
bm+? b ;`#;2 +QHH2+iQ`X AM Qi?2` rQ`/b- BM _mbi- vQm /QMi +HH 7mM+iBQMb HBF2 malloc M/ free
vQm`b2H7, i?2 +QKTBH2` biiB+HHv /2i2`KBM2b r?2M vQm M22/ iQ HHQ+i2 Q` /2HHQ+i2 K2KQ`v- M/
BMb2`ib i?Qb2 +HHb Bib2H7X hQ 2`` Bb iQ #2 ?mKM- #mi +QKTBH2`b M2p2` 7Q`;2iX
G2ib // MQi?2` HBM2 iQ Qm` 2tKTH2,
fn main() {
let mut x = vec!["Hello", "world"];
k ?iiTb,ff;Bi?m#X+QKf`mbi@HM;f`mbifi`22fKbi2`fb`+f/Q+fi`TH
Rj
let y = &x[0];
}
q2p2 BMi`Q/m+2/ MQi?2` #BM/BM;- yX AM i?Bb +b2- y Bb `272`2M+2 iQ i?2 }`bi 2H2K2Mi Q7 i?2
p2+iQ`X _mbib `272`2M+2b `2 bBKBH` iQ TQBMi2`b BM Qi?2` HM;m;2b- #mi rBi? //BiBQMH +QKTBH2@
iBK2 b72iv +?2+FbX _272`2M+2b BMi2`+i rBi? i?2 QrM2`b?BT bvbi2K #v #Q``QrBM; Ub2+iBQM 8XNT;2 Rj3V r?i i?2v TQBMi iQ- `i?2` i?M QrMBM; BiX h?2 /Bz2`2M+2 Bb- r?2M i?2 `272`2M+2 ;Q2b
Qmi Q7 b+QT2- Bi rBHH MQi /2HHQ+i2 i?2 mM/2`HvBM; K2KQ`vX A7 Bi /B/- r2/ /2@HHQ+i2 irB+2- r?B+?
Bb #/5
G2ib // i?B`/ HBM2X Ai HQQFb BMMQ+2Mi 2MQm;?- #mi +mb2b +QKTBH2` 2``Q`,
fn main() {
let mut x = vec!["Hello", "world"];
let y = &x[0];
x.push("foo");
}
Bb K2i?Q/ QM p2+iQ`b i?i TT2M/b MQi?2` 2H2K2Mi iQ i?2 2M/ Q7 i?2 p2+iQ`X q?2M r2
i`v iQ +QKTBH2 i?Bb T`Q;`K- r2 ;2i M 2``Q`,
push
q?2r5 h?2 _mbi +QKTBH2` ;Bp2b [mBi2 /2iBH2/ 2``Q`b i iBK2b- M/ i?Bb Bb QM2 Q7 i?Qb2 iBK2bX
b i?2 2``Q` 2tTHBMb- r?BH2 r2 K/2 Qm` #BM/BM; Kmi#H2- r2 biBHH +MMQi +HH pushX h?Bb Bb
#2+mb2 r2 H`2/v ?p2 `272`2M+2 iQ M 2H2K2Mi Q7 i?2 p2+iQ`- yX JmiiBM; bQK2i?BM; r?BH2
MQi?2` `272`2M+2 2tBbib Bb /M;2`Qmb- #2+mb2 r2 Kv BMpHB/i2 i?2 `272`2M+2X AM i?Bb bT2+B}+
+b2- r?2M r2 +`2i2 i?2 p2+iQ`- r2 Kv ?p2 QMHv HHQ+i2/ bT+2 7Q` i?`22 2H2K2MibX //BM;
7Qm`i? rQmH/ K2M HHQ+iBM; M2r +?mMF Q7 K2KQ`v 7Q` HH i?Qb2 2H2K2Mib- +QTvBM; i?2 QH/
pHm2b Qp2`- M/ mT/iBM; i?2 BMi2`MH TQBMi2` iQ i?i K2KQ`vX h?i HH rQ`Fb Dmbi }M2X h?2
T`Q#H2K Bb i?i y rQmH/Mi ;2i mT/i2/- M/ bQ r2/ ?p2 /M;HBM; TQBMi2`X h?ib #/X Mv
mb2 Q7 y rQmH/ #2 M 2``Q` BM i?Bb +b2- M/ bQ i?2 +QKTBH2` ?b +m;?i i?Bb 7Q` mbX
aQ ?Qr /Q r2 bQHp2 i?Bb T`Q#H2K\ h?2`2 `2 irQ TT`Q+?2b r2 +M iF2X h?2 }`bi Bb KFBM;
+QTv `i?2` i?M mbBM; `272`2M+2,
R9
*>Sh1_ RX ALh_P.l*hAPL
fn main() {
let mut x = vec!["Hello", "world"];
let y = x[0].clone();
x.push("foo");
}
_mbi ?b KQp2 b2KMiB+b Ubm#b2+iBQM 8X3Xj- T;2 RjeV #v /27mHi- bQ B7 r2 rMi iQ KF2 +QTv Q7
bQK2 /i- r2 +HH i?2 clone() K2i?Q/X AM i?Bb 2tKTH2- y Bb MQ HQM;2` `272`2M+2 iQ i?2 p2+iQ`
biQ`2/ BM x- #mi +QTv Q7 Bib }`bi 2H2K2Mi- "Hello"X LQr i?i r2 /QMi ?p2 `272`2M+2- Qm`
push() rQ`Fb Dmbi }M2X
A7 r2 i`mHv rMi `272`2M+2- r2 M22/ i?2 Qi?2` QTiBQM, 2Mbm`2 i?i Qm` `272`2M+2 ;Q2b Qmi Q7
b+QT2 #27Q`2 r2 i`v iQ /Q i?2 KmiiBQMX h?i HQQFb HBF2 i?Bb,
fn main() {
let mut x = vec!["Hello", "world"];
{
let y = &x[0];
}
x.push("foo");
}
h?Bb +QM+2Ti Q7 QrM2`b?BT BbMi Dmbi ;QQ/ 7Q` T`2p2MiBM; /M;HBM; TQBMi2`b- #mi M 2MiB`2 b2i Q7
`2Hi2/ T`Q#H2Kb- HBF2 Bi2`iQ` BMpHB/iBQM- +QM+m``2M+v- M/ KQ`2X
:2iiBM; ai`i2/
h?Bb }`bi b2+iBQM Q7 i?2 #QQF rBHH ;2i vQm ;QBM; rBi? _mbi M/ Bib iQQHBM;X 6B`bi- r2HH BMbiHH
_mbiX h?2M- i?2 +HbbB+ >2HHQ qQ`H/ T`Q;`KX 6BMHHv- r2HH iHF #Qmi *`;Q- _mbib #mBH/
bvbi2K M/ T+F;2 KM;2`X
kXR
AMbiHHBM; _mbi
h?2 }`bi bi2T iQ mbBM; _mbi Bb iQ BMbiHH Bi5 h?2`2 `2 MmK#2` Q7 rvb iQ BMbiHH _mbi- #mi i?2
2bB2bi Bb iQ mb2 i?2 rustup b+`BTiX A7 vQm`2 QM GBMmt Q` J+- HH vQm M22/ iQ /Q Bb i?Bb UMQi2
i?i vQm /QMi M22/ iQ ivT2 BM i?2 $b- i?2v Dmbi BM/B+i2 i?2 bi`i Q7 2+? +QKKM/V,
$ curl -sf -L https://static.rust-lang.org/rustup.sh | sh
A7 vQm`2 +QM+2`M2/ #Qmi i?2 TQi2MiBH BMb2+m`BivR Q7 mbBM; curl | sh- TH2b2 F22T `2/BM; M/
b22 Qm` /Bb+HBK2` #2HQrX M/ 722H 7`22 iQ mb2 irQ@bi2T p2`bBQM Q7 i?2 BMbiHHiBQM M/ 2tKBM2
Qm` BMbiHHiBQM b+`BTi,
$ curl -f -L https://static.rust-lang.org/rustup.sh -O
$ sh rustup.sh
A7 vQm`2 QM qBM/Qrb- TH2b2 /QrMHQ/ 2Bi?2` i?2 jk@#Bi BMbiHH2`k Q` i?2 e9@#Bi BMbiHH2`j M/
`mM BiX
R ?iiT,ff+m`HTBT2b?XimK#H`X+QK
k ?iiTb,ffbiiB+X`mbi@HM;XQ`;f/Bbif`mbi@RXyXy@#2i@Be3e@T+@rBM/Qrb@;MmXKbB
j ?iiTb,ffbiiB+X`mbi@HM;XQ`;f/Bbif`mbi@RXyXy@#2i@t3ene9@T+@rBM/Qrb@;MmXKbB
Re
lMBMbiHHBM;
A7 vQm /2+B/2 vQm /QMi rMi _mbi MvKQ`2- r2HH #2 #Bi b/- #mi i?ib QFvX LQi 2p2`v
T`Q;`KKBM; HM;m;2 Bb ;`2i 7Q` 2p2`vQM2X Cmbi `mM i?2 mMBMbiHH b+`BTi,
$ sudo /usr/local/lib/rustlib/uninstall.sh
.msi
aQK2 T2QTH2- M/ bQK2r?i `B;?i7mHHv bQ- ;2i p2`v mTb2i r?2M r2 i2HH vQm iQ curl | shX "bB+HHvr?2M vQm /Q i?Bb- vQm `2 i`mbiBM; i?i i?2 ;QQ/ T2QTH2 r?Q KBMiBM _mbi `2Mi ;QBM; iQ ?+F
vQm` +QKTmi2` M/ /Q #/ i?BM;bX h?ib ;QQ/ BMbiBM+i5 A7 vQm`2 QM2 Q7 i?Qb2 T2QTH2- TH2b2
+?2+F Qmi i?2 /Q+mK2MiiBQM QM #mBH/BM; _mbi 7`QK aQm`+29 - Q` i?2 Q{+BH #BM`v /QrMHQ/b8 X
P?- r2 b?QmH/ HbQ K2MiBQM i?2 Q{+BHHv bmTTQ`i2/ THi7Q`Kb,
qBM/Qrb Ud- 3- a2`p2` kyy3 _kV
GBMmt UkXeXR3 Q` Hi2`- p`BQmb /Bbi`B#miBQMbV- t3e M/ t3e@e9
Pas RyXd UGBQMV Q` ;`2i2`- t3e M/ t3e@e9
q2 2ti2MbBp2Hv i2bi _mbi QM i?2b2 THi7Q`Kb- M/ 72r Qi?2`b- iQQ- HBF2 M/`QB/X "mi i?2b2 `2
i?2 QM2b KQbi HBF2Hv iQ rQ`F- b i?2v ?p2 i?2 KQbi i2biBM;X
6BMHHv- +QKK2Mi #Qmi qBM/QrbX _mbi +QMbB/2`b qBM/Qrb iQ #2 }`bi@+Hbb THi7Q`K mTQM
`2H2b2- #mi B7 r2`2 ?QM2bi- i?2 qBM/Qrb 2tT2`B2M+2 BbMi b BMi2;`i2/ b i?2 GBMmtfPa s
2tT2`B2M+2 BbX q2`2 rQ`FBM; QM Bi5 A7 Mvi?BM; /Q2b MQi rQ`F- Bi Bb #m;X SH2b2 H2i mb FMQr B7
i?i ?TT2MbX 1+? M/ 2p2`v +QKKBi Bb i2bi2/ ;BMbi qBM/Qrb Dmbi HBF2 Mv Qi?2` THi7Q`KX
A7 vQmp2 ;Qi _mbi BMbiHH2/- vQm +M QT2M mT b?2HH- M/ ivT2 i?Bb,
$ rustc --version
uQm b?QmH/ b22 i?2 p2`bBQM MmK#2`- +QKKBi ?b?- +QKKBi /i2 M/ #mBH/ /i2,
rustc 1.0.0-beta (9854143cb 2015-04-02) (built 2015-04-02)
d ?iiT,ff+?iXKB##BiX+QKf\b2`p2`4B`+XKQxBHHXQ`;+?MM2H4Wkj`mbi
3 ?iiT,ffmb2`bX`mbi@HM;XQ`;f
N ?iiT,ffbi+FQp2`7HQrX+QKf[m2biBQMbfi;;2/f`mbi
kXk
Rd
>2HHQ- rQ`H/5
LQr i?i vQm ?p2 _mbi BMbiHH2/- H2ib r`Bi2 vQm` }`bi _mbi T`Q;`KX Aib i`/BiBQMH iQ KF2
vQm` }`bi T`Q;`K BM Mv M2r HM;m;2 QM2 i?i T`BMib i?2 i2ti >2HHQ- rQ`H/5 iQ i?2 b+`22MX
h?2 MB+2 i?BM; #Qmi bi`iBM; rBi? bm+? bBKTH2 T`Q;`K Bb i?i vQm +M p2`B7v i?i vQm`
+QKTBH2` BbMi Dmbi BMbiHH2/- #mi HbQ rQ`FBM; T`QT2`HvX M/ T`BMiBM; BM7Q`KiBQM iQ i?2 b+`22M
Bb T`2iiv +QKKQM i?BM; iQ /QX
h?2 }`bi i?BM; i?i r2 M22/ iQ /Q Bb KF2 }H2 iQ Tmi Qm` +Q/2 BMX A HBF2 iQ KF2 projects
/B`2+iQ`v BM Kv ?QK2 /B`2+iQ`v- M/ F22T HH Kv T`QD2+ib i?2`2X _mbi /Q2b MQi +`2 r?2`2 vQm`
+Q/2 HBp2bX
h?Bb +imHHv H2/b iQ QM2 Qi?2` +QM+2`M r2 b?QmH/ //`2bb, i?Bb ;mB/2 rBHH bbmK2 i?i vQm
?p2 #bB+ 7KBHB`Biv rBi? i?2 +QKKM/ HBM2X _mbi Bib2H7 KF2b MQ bT2+B}+ /2KM/b QM vQm`
2/BiBM; iQQHBM;- Q` r?2`2 vQm` +Q/2 HBp2bX A7 vQm T`272` M A.1 iQ i?2 +QKKM/ HBM2- vQm Kv
rMi iQ +?2+F Qmi aQHB/PFRy - Q` r?2`2p2` THm;BMb `2 7Q` vQm` 7pQ`Bi2 A.1X h?2`2 `2 MmK#2`
Q7 2ti2MbBQMb Q7 p`vBM; [mHBiv BM /2p2HQTK2Mi #v i?2 +QKKmMBivX h?2 _mbi i2K HbQ b?BTb
THm;BMb 7Q` p`BQmb 2/BiQ`bRR X *QM};m`BM; vQm` 2/BiQ` Q` A.1 Bb Qmi Q7 i?2 b+QT2 Q7 i?Bb imiQ`BHbQ +?2+F i?2 /Q+mK2MiiBQM 7Q` vQm` b2imT- bT2+B}+HHvX
qBi? i?i bB/- H2ib KF2 /B`2+iQ`v BM Qm` T`QD2+ib /B`2+iQ`vX
$ mkdir ~/projects
$ cd ~/projects
$ mkdir hello_world
$ cd hello_world
A7 vQm`2 QM qBM/Qrb M/ MQi mbBM; SQr2`a?2HH- i?2 ~ Kv MQi rQ`FX *QMbmHi i?2 /Q+mK2MiiBQM
7Q` vQm` b?2HH 7Q` KQ`2 /2iBHbX
G2ib KF2 M2r bQm`+2 }H2 M2tiX q2HH +HH Qm` }H2 main.rsX _mbi }H2b Hrvb 2M/ BM .rs
2ti2MbBQMX A7 vQm`2 mbBM; KQ`2 i?M QM2 rQ`/ BM vQm` }H2MK2- mb2 M mM/2`b+Q`2, hello_world.rs `i?2` i?M helloworld.rsX
LQr i?i vQmp2 ;Qi vQm` }H2 QT2M- ivT2 i?Bb BM,
fn main() {
println!("Hello, world!");
}
ap2 i?2 }H2- M/ i?2M ivT2 i?Bb BMiQ vQm` i2`KBMH rBM/Qr,
$ rustc main.rs
$ ./main # or main.exe on Windows
Hello, world!
RR ?iiTb,ff;Bi?m#X+QKf`mbi@HM;f`mbif#HQ#fKbi2`fb`+f2i+f*PL6A:aXK/
R3
fn main() {
}
h?2b2 HBM2b /2}M2 7mM+iBQM BM _mbiX h?2 main 7mM+iBQM Bb bT2+BH, Bib i?2 #2;BMMBM; Q7 2p2`v _mbi
T`Q;`KX h?2 }`bi HBM2 bvb AK /2+H`BM; 7mM+iBQM MK2/ main r?B+? iF2b MQ `;mK2Mib M/
`2im`Mb MQi?BM;X A7 i?2`2 r2`2 `;mK2Mib- i?2v rQmH/ ;Q BMbB/2 i?2 T`2Mi?2b2b U( M/ )V- M/
#2+mb2 r2 `2Mi `2im`MBM; Mvi?BM; 7`QK i?Bb 7mM+iBQM- r2 +M QKBi i?2 `2im`M ivT2 2MiB`2HvX
q2HH ;2i iQ Bi Hi2`X
uQmHH HbQ MQi2 i?i i?2 7mM+iBQM Bb r`TT2/ BM +m`Hv #`+2b U{ M/ }VX _mbi `2[mB`2b i?2b2
`QmM/ HH 7mM+iBQM #Q/B2bX Ai Bb HbQ +QMbB/2`2/ ;QQ/ bivH2 iQ Tmi i?2 QT2MBM; +m`Hv #`+2 QM
i?2 bK2 HBM2 b i?2 7mM+iBQM /2+H`iBQM- rBi? QM2 bT+2 BM #2ir22MX
L2ti mT Bb i?Bb HBM2,
println!("Hello, world!");
h?Bb HBM2 /Q2b HH Q7 i?2 rQ`F BM Qm` HBiiH2 T`Q;`KX h?2`2 `2 MmK#2` Q7 /2iBHb i?i `2
BKTQ`iMi ?2`2X h?2 }`bi Bb i?i Bib BM/2Mi2/ rBi? 7Qm` bT+2b- MQi i#bX SH2b2 +QM};m`2 vQm`
2/BiQ` Q7 +?QB+2 iQ BMb2`i 7Qm` bT+2b rBi? i?2 i# F2vX q2 T`QpB/2 bQK2 bKTH2 +QM};m`iBQMb
7Q` p`BQmb 2/BiQ`bRk X
h?2 b2+QM/ TQBMi Bb i?2 println!() T`iX h?Bb Bb +HHBM; _mbi K+`Q Ub2+iBQM 8Xj8- T;2 kkyVr?B+? Bb ?Qr K2iT`Q;`KKBM; Bb /QM2 BM _mbiX A7 Bi r2`2 7mM+iBQM BMbi2/- Bi rQmH/ HQQF
HBF2 i?Bb, println()X 6Q` Qm` Tm`TQb2b- r2 /QMi M22/ iQ rQ``v #Qmi i?Bb /Bz2`2M+2X Cmbi FMQr
i?i bQK2iBK2b- vQmHH b22 !- M/ i?i K2Mb i?i vQm`2 +HHBM; K+`Q BMbi2/ Q7 MQ`KH
7mM+iBQMX _mbi BKTH2K2Mib println! b K+`Q `i?2` i?M 7mM+iBQM 7Q` ;QQ/ `2bQMb- #mi
i?ib M /pM+2/ iQTB+X PM2 Hbi i?BM; iQ K2MiBQM, _mbib K+`Qb `2 bB;MB}+MiHv /Bz2`2Mi
7`QK * K+`Qb- B7 vQmp2 mb2/ i?Qb2X .QMi #2 b+`2/ Q7 mbBM; K+`QbX q2HH ;2i iQ i?2 /2iBHb
2p2MimHHv- vQmHH Dmbi ?p2 iQ i`mbi mb 7Q` MQrX
L2ti- "Hello, world!" Bb bi`BM;X ai`BM;b `2 bm`T`BbBM;Hv +QKTHB+i2/ iQTB+ BM bvbi2Kb
T`Q;`KKBM; HM;m;2- M/ i?Bb Bb biiB+HHv HHQ+i2/ bi`BM;X A7 vQm rMi iQ `2/ 7m`i?2`
#Qmi HHQ+iBQM- +?2+F Qmi i?2 bi+F M/ i?2 ?2T Ub2+iBQM 9XR- T;2 8NV- #mi vQm /QMi M22/ iQ
`B;?i MQr B7 vQm /QMi rMi iQX q2 Tbb i?Bb bi`BM; b M `;mK2Mi iQ println!- r?B+? T`BMib
i?2 bi`BM; iQ i?2 b+`22MX 1bv 2MQm;?5
6BMHHv- i?2 HBM2 2M/b rBi? b2KB+QHQM U;VX _mbi Bb M 2tT`2bbBQM Q`B2Mi2/ HM;m;2- r?B+?
K2Mb i?i KQbi i?BM;b `2 2tT`2bbBQMb- `i?2` i?M bii2K2MibX h?2 ; Bb mb2/ iQ BM/B+i2 i?i
i?Bb 2tT`2bbBQM Bb Qp2`- M/ i?2 M2ti QM2 Bb `2/v iQ #2;BMX JQbi HBM2b Q7 _mbi +Q/2 2M/ rBi? ;X
6BMHHv- +imHHv +QKTBHBM; M/ `mMMBM; Qm` T`Q;`KX q2 +M +QKTBH2 rBi? Qm` +QKTBH2`#v TbbBM; Bi i?2 MK2 Q7 Qm` bQm`+2 }H2,
rustc-
$ rustc main.rs
h?Bb Bb bBKBH` iQ gcc Q` clang- B7 vQm +QK2 7`QK * Q` *YY #+F;`QmM/X _mbi rBHH QmiTmi
#BM`v 2t2+mi#H2X uQm +M b22 Bi rBi? ls,
Rk ?iiTb,ff;Bi?m#X+QKf`mbi@HM;f`mbifi`22fKbi2`fb`+f2i+f*PL6A:aXK/
RN
$ ls
main
main.rs
P` QM qBM/Qrb,
$ dir
main.exe
main.rs
h?2`2 `2 MQr irQ }H2b, Qm` bQm`+2 +Q/2- rBi? i?2
QM qBM/Qrb- main 2p2`vr?2`2 2Hb2V
$ ./main
.rs
# or main.exe on Windows
Hello, world!
A7 vQm +QK2 7`QK /vMKB+ HM;m;2 HBF2 _m#v- Svi?QM- Q` Cpa+`BTi- vQm Kv MQi #2 mb2/ iQ
i?2b2 irQ bi2Tb #2BM; b2T`i2X _mbi Bb M ?2/@Q7@iBK2 +QKTBH2/ HM;m;2- r?B+? K2Mb i?i
vQm +M +QKTBH2 T`Q;`K- ;Bp2 Bi iQ bQK2QM2 2Hb2- M/ i?2v /QMi M22/ iQ ?p2 _mbi BMbiHH2/X
A7 vQm ;Bp2 bQK2QM2 .rb Q` .py Q` .js }H2- i?2v M22/ iQ ?p2 _m#vfSvi?QMfCpa+`BTi
BKTH2K2MiiBQM BMbiHH2/- #mi vQm Dmbi M22/ QM2 +QKKM/ iQ #Qi? +QKTBH2 M/ `mM vQm` T`Q;`KX
1p2`vi?BM; Bb i`/2Qz BM HM;m;2 /2bB;M- M/ _mbi ?b K/2 Bib +?QB+2X
*QM;`imHiBQMb5 uQm ?p2 Q{+BHHv r`Bii2M _mbi T`Q;`KX h?i KF2b vQm _mbi T`Q;`K@
K2`5 q2H+QK2X
L2ti- A/ HBF2 iQ BMi`Q/m+2 vQm iQ MQi?2` iQQH- *`;Q- r?B+? Bb mb2/ iQ r`Bi2 `2H@rQ`H/ _mbi
T`Q;`KbX Cmbi mbBM; rustc Bb MB+2 7Q` bBKTH2 i?BM;b- #mi b vQm` T`QD2+i ;`Qrb- vQmHH rMi
bQK2i?BM; iQ ?2HT vQm KM;2 HH Q7 i?2 QTiBQMb i?i Bi ?b- M/ iQ KF2 Bi 2bv iQ b?`2 vQm`
+Q/2 rBi? Qi?2` T2QTH2 M/ T`QD2+ibX
kXj
>2HHQ- *`;Q5
*`;QRj Bb iQQH i?i _mbi+2Mb mb2 iQ ?2HT KM;2 i?2B` _mbi T`QD2+ibX *`;Q Bb +m``2MiHv BM
T`2@RXy bii2- M/ bQ Bi Bb biBHH rQ`F BM T`Q;`2bbX >Qr2p2`- Bi Bb H`2/v ;QQ/ 2MQm;? iQ mb2 7Q`
KMv _mbi T`QD2+ib- M/ bQ Bi Bb bbmK2/ i?i _mbi T`QD2+ib rBHH mb2 *`;Q 7`QK i?2 #2;BMMBM;X
*`;Q KM;2b i?`22 i?BM;b, #mBH/BM; vQm` +Q/2- /QrMHQ/BM; i?2 /2T2M/2M+B2b vQm` +Q/2 M22/bM/ #mBH/BM; i?Qb2 /2T2M/2M+B2bX i }`bi- vQm` T`Q;`K /Q2bMi ?p2 Mv /2T2M/2M+B2b- bQ r2HH
QMHv #2 mbBM; i?2 }`bi T`i Q7 Bib 7mM+iBQMHBivX 1p2MimHHv- r2HH // KQ`2X aBM+2 r2 bi`i2/ Qz
#v mbBM; *`;Q- BiHH #2 2bv iQ // Hi2`X
A7 vQm BMbiHH2/ _mbi pB i?2 Q{+BH BMbiHH2`b vQm rBHH HbQ ?p2 *`;QX A7 vQm BMbiHH2/ _mbi
bQK2 Qi?2` rv- vQm Kv rMi iQ +?2+F i?2 *`;Q _1.J1R9 7Q` bT2+B}+ BMbi`m+iBQMb #Qmi
BMbiHHBM; BiX
Rj ?iiT,ff/Q+X+`i2bXBQ
R9 ?iiTb,ff;Bi?m#X+QKf`mbi@HM;f+`;QOBMbiHHBM;@+`;Q@7`QK@MB;?iHB2b
ky
*QMp2`iBM; iQ *`;Q
G2ib +QMp2`i >2HHQ qQ`H/ iQ *`;QX
hQ *`;Q@B7v Qm` T`QD2+i- r2 M22/ iQ /Q irQ i?BM;b, JF2
Tmi Qm` bQm`+2 }H2 BM i?2 `B;?i TH+2X G2ib /Q i?i T`i }`bi,
Cargo.toml
$ mkdir src
$ mv main.rs src/main.rs
LQi2 i?i bBM+2 r2`2 +`2iBM; M 2t2+mi#H2- r2 mb2/ main.rsX A7 r2 rMi iQ KF2 HB#``v
BMbi2/- r2 b?QmH/ mb2 lib.rsX *mbiQK }H2 HQ+iBQMb 7Q` i?2 2Mi`v TQBMi +M #2 bT2+B}2/ rBi?
[[lib]] Q` [[bin]]R8 F2v BM i?2 hPJG }H2 /2b+`B#2/ #2HQrX
*`;Q 2tT2+ib vQm` bQm`+2 }H2b iQ HBp2 BMbB/2 src /B`2+iQ`vX h?i H2p2b i?2 iQT H2p2H 7Q` Qi?2`
i?BM;b- HBF2 _1.J1b- HB+2Mb2 BM7Q`KiBQM- M/ Mvi?BM; MQi `2Hi2/ iQ vQm` +Q/2X *`;Q ?2HTb
mb F22T Qm` T`QD2+ib MB+2 M/ iB/vX TH+2 7Q` 2p2`vi?BM;- M/ 2p2`vi?BM; BM Bib TH+2X
L2ti- Qm` +QM};m`iBQM }H2,
$ editor Cargo.toml
JF2 bm`2 iQ ;2i i?Bb MK2 `B;?i, vQm M22/ i?2 +TBiH C5
Smi i?Bb BMbB/2,
[package]
name = "hello_world"
version = "0.0.1"
authors = [ "Your name <you@example.com>" ]
h?Bb }H2 Bb BM i?2 hPJGRe 7Q`KiX G2ib H2i Bi 2tTHBM Bib2H7 iQ vQm,
hPJG BKb iQ #2 KBMBKH +QM};m`iBQM }H2 7Q`Ki i?ib 2bv iQ `2/ /m2 iQ
Q#pBQmb b2KMiB+bX hPJG Bb /2bB;M2/ iQ KT mMK#B;mQmbHv iQ ?b? i#H2X hPJG
b?QmH/ #2 2bv iQ T`b2 BMiQ /i bi`m+im`2b BM rB/2 p`B2iv Q7 HM;m;2bX
hPJG Bb p2`v bBKBH` iQ ALA- #mi rBi? bQK2 2ti` ;QQ/B2bX
PM+2 vQm ?p2 i?Bb }H2 BM TH+2- r2 b?QmH/ #2 `2/v iQ #mBH/5 h`v i?Bb,
$ cargo build
Compiling hello_world v0.0.1 (file:///home/yourname/projects/hello_world)
$ ./target/debug/hello_world
Hello, world!
R8 ?iiT,ff/Q+X+`i2bXBQfKMB72biX?iKHO+QM7B;m`BM;@@i`;2i
Re ?iiTb,ff;Bi?m#X+QKfiQKH@HM;fiQKH
kR
"K5 q2 #mBH/ Qm` T`QD2+i rBi? cargo build- M/ `mM Bi rBi?
+M /Q #Qi? BM QM2 bi2T rBi? cargo run,
./target/debug/hello_worldX
q2
$ cargo run
Running `target/debug/hello_world`
Hello, world!
LQiB+2 i?i r2 /B/Mi `2@#mBH/ i?2 T`QD2+i i?Bb iBK2X *`;Q };m`2/ Qmi i?i r2 ?/Mi +?M;2/
i?2 bQm`+2 }H2- M/ bQ Bi Dmbi `M i?2 #BM`vX A7 r2 ?/ K/2 KQ/B}+iBQM- r2 rQmH/ ?p2 b22M
Bi /Q #Qi?,
$ cargo run
Compiling hello_world v0.0.1 (file:///home/yourname/projects/hello_world)
Running `target/debug/hello_world`
Hello, world!
h?Bb ?bMi #Qm;?i mb r?QH2 HQi Qp2` Qm` bBKTH2 mb2 Q7 rustc- #mi i?BMF #Qmi i?2 7mim`2,
r?2M Qm` T`QD2+i ;2ib KQ`2 +QKTH2t- r2 rQmH/ M22/ iQ /Q KQ`2 i?BM;b iQ ;2i HH Q7 i?2 T`ib iQ
T`QT2`Hv +QKTBH2X qBi? *`;Q- b Qm` T`QD2+i ;`Qrb- r2 +M Dmbi cargo build- M/ BiHH rQ`F i?2
`B;?i rvX
q?2M vQm` T`QD2+i Bb }MHHv `2/v 7Q` `2H2b2- vQm +M mb2
vQm` T`QD2+i rBi? QTiBKBxiBQMbX
uQmHH HbQ MQiB+2 i?i *`;Q ?b +`2i2/ M2r }H2,
iQ +QKTBH2
Cargo.lockX
[root]
name = "hello_world"
version = "0.0.1"
h?Bb }H2 Bb mb2/ #v *`;Q iQ F22T i`+F Q7 /2T2M/2M+B2b BM vQm` TTHB+iBQMX _B;?i MQr- r2 /QMi
?p2 Mv- bQ Bib #Bi bT`b2X uQm rQMi 2p2` M22/ iQ iQm+? i?Bb }H2 vQm`b2H7- Dmbi H2i *`;Q
?M/H2 BiX
h?ib Bi5 q2p2 bm++2bb7mHHv #mBHi hello_world rBi? *`;QX 1p2M i?Qm;? Qm` T`Q;`K Bb bBKTH2Bib mbBM; Km+? Q7 i?2 `2H iQQHBM; i?i vQmHH mb2 7Q` i?2 `2bi Q7 vQm` _mbi +`22`X uQm +M 2tT2+i
iQ /Q i?Bb iQ ;2i bi`i2/ rBi? pB`imHHv HH _mbi T`QD2+ib,
$ git clone someurl.com/foo
$ cd foo
$ cargo build
L2r S`QD2+i
uQm /QMi ?p2 iQ ;Q i?`Qm;? i?Bb r?QH2 T`Q+2bb 2p2`v iBK2 vQm rMi iQ bi`i M2r T`QD2+i5
*`;Q ?b i?2 #BHBiv iQ KF2 #`2@#QM2b T`QD2+i /B`2+iQ`v BM r?B+? vQm +M bi`i /2p2HQTBM;
`B;?i rvX
hQ bi`i M2r T`QD2+i rBi? *`;Q- mb2
cargo new,
kk
q2`2 TbbBM;
H2p2 Bi QzX
--bin
A7 vQm /QMi ?p2 i?2 tree +QKKM/- vQm +M T`Q##Hv ;2i Bi 7`QK vQm` /Bbi`B#miBQMb T+F;2
KM;2`X Aib MQi M2+2bb`v- #mi Bib +2`iBMHv mb27mHX
h?Bb Bb HH r2 M22/ iQ ;2i bi`i2/X 6B`bi- H2ib +?2+F Qmi
Cargo.toml,
[package]
name = "hello_world"
version = "0.0.1"
authors = ["Your Name <you@example.com>"]
*`;Q ?b TQTmHi2/ i?Bb }H2 rBi? `2bQM#H2 /27mHib #b2/ Qz i?2 `;mK2Mib vQm ;p2 Bi M/
vQm` git ;HQ#H +QM};m`iBQMX uQm Kv MQiB+2 i?i *`;Q ?b HbQ BMBiBHBx2/ i?2 hello_world
/B`2+iQ`v b git `2TQbBiQ`vX
>2`2b r?ib BM
src/main.rs,
fn main() {
println!("Hello, world!");
}
*`;Q ?b ;2M2`i2/ >2HHQ qQ`H/5 7Q` mb- M/ vQm`2 `2/v iQ bi`i +Q/BM;5 *`;Q ?b Bib
QrM ;mB/2Rd r?B+? +Qp2`b *`;Qb 72im`2b BM Km+? KQ`2 /2Ti?X
LQr i?i vQmp2 ;Qi i?2 iQQHb /QrM- H2ib +imHHv H2`M KQ`2 #Qmi i?2 _mbi HM;m;2 Bib2H7X
h?2b2 `2 i?2 #bB+b i?i rBHH b2`p2 vQm r2HH i?`Qm;? i?2 `2bi Q7 vQm` iBK2 rBi? _mbiX
uQm ?p2 irQ QTiBQMb, .Bp2 BMiQ T`QD2+i rBi? G2`M _mbi U+?Ti2` j- T;2 kjV- Q` bi`i 7`QK
i?2 #QiiQK M/ rQ`F vQm` rv mT rBi? avMit M/ a2KMiB+b U+?Ti2` 8- T;2 RRNVX JQ`2
2tT2`B2M+2/ bvbi2Kb T`Q;`KK2`b rBHH T`Q##Hv T`272` G2`M _mbi- r?BH2 i?Qb2 7`QK /vMKB+
#+F;`QmM/b Kv 2MDQv 2Bi?2`X .Bz2`2Mi T2QTH2 H2`M /Bz2`2MiHv5 *?QQb2 r?i2p2`b `B;?i 7Q`
vQmX
Rd ?iiT,ff/Q+X+`i2bXBQf;mB/2X?iKH
G2`M _mbi
q2H+QK25 h?Bb b2+iBQM ?b 72r imiQ`BHb i?i i2+? vQm _mbi i?`Qm;? #mBH/BM; T`QD2+ibX uQmHH
;2i ?B;?@H2p2H Qp2`pB2r- #mi r2HH bFBK Qp2` i?2 /2iBHbX
A7 vQm/ T`272` KQ`2 7`QK i?2 ;`QmM/ mT@bivH2 2tT2`B2M+2- +?2+F Qmi avMit M/ a2KMiB+b
U+?Ti2` 8- T;2 RRNVX
jXR
:m2bbBM; :K2
6Q` Qm` }`bi T`QD2+i- r2HH BKTH2K2Mi +HbbB+ #2;BMM2` T`Q;`KKBM; T`Q#H2K, i?2 ;m2bbBM;
;K2X >2`2b ?Qr Bi rQ`Fb, Pm` T`Q;`K rBHH ;2M2`i2 `M/QK BMi2;2` #2ir22M QM2 M/
?mM/`2/X Ai rBHH i?2M T`QKTi mb iQ 2Mi2` ;m2bbX lTQM 2Mi2`BM; Qm` ;m2bb- Bi rBHH i2HH mb B7 r2`2
iQQ HQr Q` iQQ ?B;?X PM+2 r2 ;m2bb +Q``2+iHv- Bi rBHH +QM;`imHi2 mbX aQmM/b ;QQ/\
jXRXR
a2i mT
G2ib b2i mT M2r T`QD2+iX :Q iQ vQm` T`QD2+ib /B`2+iQ`vX _2K2K#2` ?Qr r2 ?/ iQ +`2i2 Qm`
/B`2+iQ`v bi`m+im`2 M/ Cargo.toml 7Q` hello_world\ *`;Q ?b +QKKM/ i?i /Q2b i?i 7Q`
mbX G2ib ;Bp2 Bi b?Qi,
$ cd ~/projects
$ cargo new guessing_game --bin
$ cd guessing_game
Cargo.toml,
cargo new-
--bin
k9
[package]
name = "guessing_game"
version = "0.0.1"
authors = ["Your Name <you@example.com>"]
*`;Q ;2ib i?Bb BM7Q`KiBQM 7`QK vQm` 2MpB`QMK2MiX A7 Bib MQi +Q``2+i- ;Q ?2/ M/ }t i?iX
6BMHHv- *`;Q ;2M2`i2/ >2HHQ- rQ`H/5 7Q` mbX *?2+F Qmi
src/main.rs,
fn main() {
println!("Hello, world!")
}
src/main.rs
"27Q`2 r2 KQp2 QM- H2i K2 b?Qr vQm QM2 KQ`2 *`;Q +QKKM/, runX cargo
cargo build- #mi Bi HbQ i?2M `mMb i?2 T`Q/m+2/ 2t2+mi#H2X h`v Bi Qmi,
run
Bb FBM/ Q7 HBF2
$ cargo run
Compiling guessing_game v0.0.1 (file:///home/you/projects/guessing_game)
Running `target/debug/guessing_game`
Hello, world!
:`2i5 h?2 run +QKKM/ +QK2b BM ?M/v r?2M vQm M22/ iQ `TB/Hv Bi2`i2 QM T`QD2+iX Pm`
;K2 Bb Dmbi bm+? T`QD2+i- r2 M22/ iQ [mB+FHv i2bi 2+? Bi2`iBQM #27Q`2 KQpBM; QM iQ i?2 M2ti
QM2X
k8
io::stdin().read_line(&mut guess)
.ok()
.expect("Failed to read line");
println!("You guessed: {}", guess);
}
q2HH M22/ iQ iF2 mb2` BMTmi- M/ i?2M T`BMi i?2 `2bmHi b QmiTmiX b bm+?- r2 M22/ i?2 io HB#``v
7`QK i?2 biM/`/ HB#``vX _mbi QMHv BKTQ`ib 72r i?BM;b BMiQ 2p2`v T`Q;`K- i?2 T`2Hm/2R X A7
Bib MQi BM i?2 T`2Hm/2- vQmHH ?p2 iQ use Bi /B`2+iHvX
fn main() {
b vQmp2 b22M #27Q`2- i?2 main() 7mM+iBQM Bb i?2 2Mi`v TQBMi BMiQ vQm` T`Q;`KX h?2 fn bvMit
/2+H`2b M2r 7mM+iBQM- i?2 ()b BM/B+i2 i?i i?2`2 `2 MQ `;mK2Mib- M/ { bi`ib i?2 #Q/v Q7
i?2 7mM+iBQMX "2+mb2 r2 /B/Mi BM+Hm/2 `2im`M ivT2- Bib bbmK2/ iQ #2 ()- M 2KTiv imTH2k X
println!("Guess the number!");
println!("Please input your guess.");
q2 T`2pBQmbHv H2`M2/ i?i println!() Bb K+`Q Ub2+iBQM 8Xj8- T;2 kkyV i?i T`BMib bi`BM;
Ub2+iBQM 8XR3- T;2 ReNV iQ i?2 b+`22MX
let mut guess = String::new();
LQr r2`2 ;2iiBM; BMi2`2biBM;5 h?2`2b HQi ;QBM; QM BM i?Bb HBiiH2 HBM2X h?2 }`bi i?BM; iQ MQiB+2
Bb i?i i?Bb Bb H2i bii2K2Mi Ub2+iBQM 8XR- T;2 RRNV- r?B+? Bb mb2/ iQ +`2i2 p`B#H2 #BM/BM;bX
h?2v iF2 i?Bb 7Q`K,
let foo = bar;
h?Bb rBHH +`2i2 M2r #BM/BM; MK2/ foo- M/ #BM/ Bi iQ i?2 pHm2 barX AM KMv HM;m;2b- i?Bb
Bb +HH2/ p`B#H2- #mi _mbib p`B#H2 #BM/BM;b ?p2 72r i`B+Fb mT i?2B` bH22p2bX
6Q` 2tKTH2- i?2v`2 BKKmi#H2 Ub2+iBQM 8XRR- T;2 R8yV #v /27mHiX h?ib r?v Qm` 2tKTH2
mb2b mut, Bi KF2b #BM/BM; Kmi#H2- `i?2` i?M BKKmi#H2X let /Q2bMi iF2 MK2 QM i?2
H27i ?M/ bB/2- Bi +imHHv ++2Tib Tii2`M Ub2+iBQM 8XR8- T;2 R8NVX q2HH mb2 Tii2`Mb KQ`2
Hi2`X Aib 2bv 2MQm;? iQ mb2 7Q` MQr,
let foo = 5; // immutable.
let mut bar = 5; // mutable
R ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fT`2Hm/2fBM/2tX?iKH
k T`BKBiBp2@ivT2bX?iKHOimTH2b
ke
P?- M/ // rBHH bi`i +QKK2Mi- mMiBH i?2 2M/ Q7 i?2 HBM2X _mbi B;MQ`2b 2p2`vi?BM; BM +QKK2Mib
Ub2+iBQM 8X9- T;2 RjRVX
aQ MQr r2 FMQr i?i let mut guess rBHH BMi`Q/m+2 Kmi#H2 #BM/BM; MK2/ guess- #mi r2 ?p2
iQ HQQF i i?2 Qi?2` bB/2 Q7 i?2 = 7Q` r?i Bib #QmM/ iQ, String::new()X
Bb bi`BM; ivT2- T`QpB/2/ #v i?2 biM/`/ HB#``vX Stringj Bb ;`Qr#H2- lh6@3 2M+Q/2/
#Bi Q7 i2tiX
String
h?2 ::new() bvMit mb2b :: #2+mb2 i?Bb Bb M bbQ+Bi2/ 7mM+iBQM Q7 T`iB+mH` ivT2X h?i
Bb iQ bv- Bib bbQ+Bi2/ rBi? String Bib2H7- `i?2` i?M T`iB+mH` BMbiM+2 Q7 StringX aQK2
HM;m;2b +HH i?Bb biiB+ K2i?Q/X
h?Bb 7mM+iBQM Bb MK2/ new()- #2+mb2 Bi +`2i2b M2r- 2KTiv StringX uQmHH }M/ new() 7mM+iBQM
QM KMv ivT2b- b Bib +QKKQM MK2 7Q` KFBM; M2r pHm2 Q7 bQK2 FBM/X
G2ib KQp2 7Q`r`/,
io::stdin().read_line(&mut guess)
.ok()
.expect("Failed to read line");
h?ib HQi KQ`25 G2ib ;Q #Bi@#v@#BiX h?2 }`bi HBM2 ?b irQ T`ibX >2`2b i?2 }`bi,
io::stdin()
_2K2K#2` ?Qr r2 use/ std::io QM i?2 }`bi HBM2 Q7 i?2 T`Q;`K\ q2`2 MQr +HHBM; M bbQ+Bi2/
7mM+iBQM QM BiX A7 r2 /B/Mi use std::io- r2 +QmH/ ?p2 r`Bii2M i?Bb HBM2 b std::io::stdin()X
h?Bb T`iB+mH` 7mM+iBQM `2im`Mb ?M/H2 iQ i?2 biM/`/ BMTmi 7Q` vQm` i2`KBMHX JQ`2 bT2+B}@
+HHv- bi/,,BQ,,ai/BM9 X
h?2 M2ti T`i rBHH mb2 i?Bb ?M/H2 iQ ;2i BMTmi 7`QK i?2 mb2`,
.read_line(&mut guess)
>2`2- r2 +HH i?2 read_line()8 K2i?Q/ QM Qm` ?M/H2X J2i?Q/b Ub2+iBQM 8XRe- T;2 Re9V `2 HBF2
bbQ+Bi2/ 7mM+iBQMb- #mi `2 QMHv pBH#H2 QM T`iB+mH` BMbiM+2 Q7 ivT2- `i?2` i?M i?2
ivT2 Bib2H7X q2`2 HbQ TbbBM; QM2 `;mK2Mi iQ read_line(), &mut guessX
_2K2K#2` ?Qr r2 #QmM/ guess #Qp2\ q2 bB/ Bi rb Kmi#H2X >Qr2p2`- read_line /Q2bMi
iF2 String b M `;mK2Mi, Bi iF2b &mut StringX _mbi ?b 72im`2 +HH2/ `272`2M+2b
Ub2+iBQM 8XN- T;2 Rj3V- r?B+? HHQrb vQm iQ ?p2 KmHiBTH2 `272`2M+2b iQ QM2 TB2+2 Q7 /i- r?B+?
+M `2/m+2 +QTvBM;X _272`2M+2b `2 +QKTH2t 72im`2- b QM2 Q7 _mbib KDQ` b2HHBM; TQBMib Bb
?Qr b72 M/ 2bv Bi Bb iQ mb2 `272`2M+2bX q2 /QMi M22/ iQ FMQr HQi Q7 i?Qb2 /2iBHb iQ }MBb?
Qm` T`Q;`K `B;?i MQr- i?Qm;?X 6Q` MQr- HH r2 M22/ iQ FMQr Bb i?i HBF2 let #BM/BM;b- `272`2M+2b
`2 BKKmi#H2 #v /27mHiX >2M+2- r2 M22/ iQ r`Bi2 &mut guess- `i?2` i?M &guessX
q?v /Q2b read_line() iF2 Kmi#H2 `272`2M+2 iQ bi`BM;\ Aib DQ# Bb iQ iF2 r?i i?2 mb2`
ivT2b BMiQ biM/`/ BMTmi- M/ TH+2 i?i BMiQ bi`BM;X aQ Bi iF2b i?i bi`BM; b M `;mK2MiM/ BM Q`/2` iQ // i?2 BMTmi- Bi M22/b iQ #2 Kmi#H2X
j ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fbi`BM;fbi`m+iXai`BM;X?iKH
9 ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fBQfbi`m+iXai/BMX?iKH
8 ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fBQfbi`m+iXai/BMX?iKHOK2i?Q/X`2/nHBM2
kd
"mi r2`2 MQi [mBi2 /QM2 rBi? i?Bb HBM2 Q7 +Q/2- i?Qm;?X q?BH2 Bib bBM;H2 HBM2 Q7 i2ti- Bib QMHv
i?2 }`bi T`i Q7 i?2 bBM;H2 HQ;B+H HBM2 Q7 +Q/2,
.ok()
.expect("Failed to read line");
q?2M vQm +HH K2i?Q/ rBi? i?2 .foo() bvMit- vQm Kv BMi`Q/m+2 M2rHBM2 M/ Qi?2` r?Bi2b@
T+2X h?Bb ?2HTb vQm bTHBi mT HQM; HBM2bX q2 +QmH/ ?p2 /QM2,
io::stdin().read_line(&mut guess).ok().expect("failed to read line");
"mi i?i ;2ib ?`/ iQ `2/X aQ r2p2 bTHBi Bi mT- i?`22 HBM2b 7Q` i?`22 K2i?Q/ +HHbX q2 H`2/v
iHF2/ #Qmi read_line()- #mi r?i #Qmi ok() M/ expect()\ q2HH- r2 H`2/v K2MiBQM2/ i?i
read_line() Tmib r?i i?2 mb2` ivT2b BMiQ i?2 &mut String r2 Tbb BiX "mi Bi HbQ `2im`Mb
pHm2, BM i?Bb +b2- M io::Resulte X _mbi ?b MmK#2` Q7 ivT2b MK2/ Result BM Bib biM/`/
HB#``v, ;2M2`B+ Resultd - M/ i?2M bT2+B}+ p2`bBQMb 7Q` bm#@HB#``B2b- HBF2 io::ResultX
h?2 Tm`TQb2 Q7 i?2b2 Result ivT2b Bb iQ 2M+Q/2 2``Q` ?M/HBM; BM7Q`KiBQMX oHm2b Q7 i?2 Result
ivT2- HBF2 Mv ivT2- ?p2 K2i?Q/b /2}M2/ QM i?2KX AM i?Bb +b2- io::Result ?b M ok() K2i?Q/r?B+? bvb r2 rMi iQ bbmK2 i?Bb pHm2 Bb bm++2bb7mH QM2X A7 MQi- Dmbi i?`Qr rv i?2 2``Q`
BM7Q`KiBQMX q?v i?`Qr Bi rv\ q2HH- 7Q` #bB+ T`Q;`K- r2 Dmbi rMi iQ T`BMi ;2M2`B+
2``Q`- b #bB+HHv Mv Bbbm2 K2Mb r2 +Mi +QMiBMm2X h?2 ok() K2i?Q/3 `2im`Mb pHm2 r?B+?
?b MQi?2` K2i?Q/ /2}M2/ QM Bi, expect()X h?2 expect() K2i?Q/N iF2b pHm2 Bib +HH2/ QMM/ B7 Bi BbMi bm++2bb7mH QM2- panic! Ub2+iBQM 9Xd- T;2 RyyVb rBi? K2bb;2 vQm Tbb2/ BiX
panic! HBF2 i?Bb rBHH +mb2 Qm` T`Q;`K iQ +`b?- /BbTHvBM; i?2 K2bb;2X
A7 r2 H2p2 Qz +HHBM; i?2b2 irQ K2i?Q/b- Qm` T`Q;`K rBHH +QKTBH2- #mi r2HH ;2i r`MBM;,
$ cargo build
Compiling guessing_game v0.1.0 (file:///home/you/projects/guessing_game)
src/main.rs:10:5: 10:39 warning: unused result which must be used,
#[warn(unused_must_use)] on by default
src/main.rs:10
io::stdin().read_line(&mut guess);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_mbi r`Mb mb i?i r2 ?p2Mi mb2/ i?2 Result pHm2X h?Bb r`MBM; +QK2b 7`QK bT2+BH
MMQiiBQM i?i io::Result ?bX _mbi Bb i`vBM; iQ i2HH vQm i?i vQm ?p2Mi ?M/H2/ TQbbB#H2
2``Q`X h?2 `B;?i rv iQ bmTT`2bb i?2 2``Q` Bb iQ +imHHv r`Bi2 2``Q` ?M/HBM;X Gm+FBHv- B7 r2 Dmbi
rMi iQ +`b? B7 i?2`2b T`Q#H2K- r2 +M mb2 i?2b2 irQ HBiiH2 K2i?Q/bX A7 r2 +M `2+Qp2` 7`QK
i?2 2``Q` bQK2?Qr- r2/ /Q bQK2i?BM; 2Hb2- #mi r2HH bp2 i?i 7Q` 7mim`2 T`QD2+iX
h?2`2b Dmbi QM2 HBM2 Q7 i?Bb }`bi 2tKTH2 H27i,
println!("You guessed: {}", guess);
}
e ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fBQfivT2X_2bmHiX?iKH
d ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/f`2bmHif2MmKX_2bmHiX?iKH
3 ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/f`2bmHif2MmKX_2bmHiX?iKHOK2i?Q/XQF
N ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fQTiBQMf2MmKXPTiBQMX?iKHOK2i?Q/X2tT2+i
k3
h?Bb T`BMib Qmi i?2 bi`BM; r2 bp2/ Qm` BMTmi BMX h?2 {}b `2 TH+2?QH/2`- M/ bQ r2 Tbb Bi
guess b M `;mK2MiX A7 r2 ?/ KmHiBTH2 {}b- r2 rQmH/ Tbb KmHiBTH2 `;mK2Mib,
let x = 5;
let y = 10;
println!("x and y: {} and {}", x, y);
1bvX
Mvrv- i?ib i?2 iQm`X q2 +M `mM r?i r2 ?p2 rBi?
cargo run,
$ cargo run
Compiling guessing_game v0.1.0 (file:///home/you/projects/guessing_game)
Running `target/debug/guessing_game`
Guess the number!
Please input your guess.
6
You guessed: 6
HH `B;?i5 Pm` }`bi T`i Bb /QM2, r2 +M ;2i BMTmi 7`QK i?2 F2v#Q`/- M/ i?2M T`BMi Bi #+F QmiX
rand-
r2
[dependencies]
rand="0.3.0"
h?2 [dependencies] b2+iBQM Q7 Cargo.toml Bb HBF2 i?2 [package] b2+iBQM, 2p2`vi?BM; i?i 7QHHQrb
Bi Bb T`i Q7 Bi- mMiBH i?2 M2ti b2+iBQM bi`ibX *`;Q mb2b i?2 /2T2M/2M+B2b b2+iBQM iQ FMQr r?i
/2T2M/2M+B2b QM 2ti2`MH +`i2b vQm ?p2- M/ r?i p2`bBQMb vQm `2[mB`2X AM i?Bb +b2- r2p2
mb2/ p2`bBQM 0.3.0X *`;Q mM/2`biM/b a2KMiB+ o2`bBQMBM;RR - r?B+? Bb biM/`/ 7Q` r`BiBM;
p2`bBQM MmK#2`bX A7 r2 rMi2/ iQ mb2 i?2 Hi2bi p2`bBQM r2 +QmH/ mb2 * Q` r2 +QmH/ mb2 `M;2
Q7 p2`bBQMbX *`;Qb /Q+mK2MiiBQMRk +QMiBMb KQ`2 /2iBHbX
LQr- rBi?Qmi +?M;BM; Mv Q7 Qm` +Q/2- H2ib #mBH/ Qm` T`QD2+i,
Ry ?iiTb,ff+`i2bXBQf+`i2bf`M/
RR ?iiT,ffb2Kp2`XQ`;
Rk ?iiT,ff/Q+X+`i2bXBQf+`i2b@BQX?iKH
kN
$ cargo build
Updating registry `https://github.com/rust-lang/crates.io-index`
Downloading rand v0.3.8
Downloading libc v0.1.6
Compiling libc v0.1.6
Compiling rand v0.3.8
Compiling guessing_game v0.1.0 (file:///home/you/projects/guessing_game)
cargo build
$ cargo build
h?ib `B;?i- MQ QmiTmi5 *`;Q FMQrb i?i Qm` T`QD2+i ?b #22M #mBHi- M/ i?i HH Q7 Bib /2T2M@
/2M+B2b `2 #mBHi- M/ bQ i?2`2b MQ `2bQM iQ /Q HH i?i bimzX qBi? MQi?BM; iQ /Q- Bi bBKTHv
2tBibX A7 r2 QT2M mT src/main.rs ;BM- KF2 i`BpBH +?M;2- M/ i?2M bp2 Bi ;BM- r2HH Dmbi
b22 QM2 HBM2,
$ cargo build
Compiling guessing_game v0.1.0 (file:///home/you/projects/guessing_game)
aQ- r2 iQH/ *`;Q r2 rMi2/ Mv 0.3.x p2`bBQM Q7 rand- M/ bQ Bi 72i+?2/ i?2 Hi2bi p2`bBQM i
i?2 iBK2 i?Bb rb r`Bii2M- v0.3.8X "mi r?i ?TT2Mb r?2M M2ti r22F- p2`bBQM v0.3.9 +QK2b
Qmi- rBi? M BKTQ`iMi #m;}t\ q?BH2 ;2iiBM; #m;}t2b Bb BKTQ`iMi- r?i B7 0.3.9 +QMiBMb
`2;`2bbBQM i?i #`2Fb Qm` +Q/2\
h?2 Mbr2` iQ i?Bb T`Q#H2K Bb i?2 Cargo.lock }H2 vQmHH MQr }M/ BM vQm` T`QD2+i /B`2+iQ`vX q?2M
vQm #mBH/ vQm` T`QD2+i 7Q` i?2 }`bi iBK2- *`;Q };m`2b Qmi HH Q7 i?2 p2`bBQMb i?i }i vQm` +`Bi2`BM/ i?2M r`Bi2b i?2K iQ i?2 Cargo.lock }H2X q?2M vQm #mBH/ vQm` T`QD2+i BM i?2 7mim`2- *`;Q
rBHH b22 i?i i?2 Cargo.lock }H2 2tBbib- M/ i?2M mb2 i?i bT2+B}+ p2`bBQM `i?2` i?M /Q HH i?2
rQ`F Q7 };m`BM; Qmi p2`bBQMb ;BMX h?Bb H2ib vQm ?p2 `2T2i#H2 #mBH/ miQKiB+HHvX AM Qi?2`
rQ`/b- r2HH biv i 0.3.8 mMiBH r2 2tTHB+BiHv mT;`/2- M/ bQ rBHH MvQM2 r?Q r2 b?`2 Qm` +Q/2
rBi?- i?MFb iQ i?2 HQ+F }H2X
q?i #Qmi r?2M r2 /Q rMi iQ mb2 v0.3.9\ *`;Q ?b MQi?2` +QKKM/- update- r?B+? bvb
B;MQ`2 i?2 HQ+F- };m`2 Qmi HH i?2 Hi2bi p2`bBQMb i?i }i r?i r2p2 bT2+B}2/X A7 i?i rQ`Fbr`Bi2 i?Qb2 p2`bBQMb Qmi iQ i?2 HQ+F }H2X "mi- #v /27mHi- *`;Q rBHH QMHv HQQF 7Q` p2`bBQMb H`;2`
i?M 0.3.0 M/ bKHH2` i?M 0.4.0X A7 r2 rMi iQ KQp2 iQ 0.4.x- r2/ ?p2 iQ mT/i2 i?2
Rj ?iiTb,ff+`i2bXBQ
jy
cargo build-
h?2`2b HQi KQ`2 iQ bv #Qmi *`;QR9 M/ Bib 2+Qbvbi2KR8 - #mi 7Q` MQr- i?ib HH r2 M22/ iQ
FMQrX *`;Q KF2b Bi `2HHv 2bv iQ `2@mb2 HB#``B2b- M/ bQ _mbi+2Mb i2M/ iQ r`Bi2 bKHH2`
T`QD2+ib r?B+? `2 bb2K#H2/ Qmi Q7 MmK#2` Q7 bm#@T+F;2bX
G2ib ;2i QM iQ +imHHv mbBM;
randX
h?2 }`bi i?BM; r2p2 /QM2 Bb +?M;2 i?2 }`bi HBM2X Ai MQr bvb extern crate randX "2+mb2 r2
/2+H`2/ rand BM Qm` [dependencies]- r2 +M mb2 extern crate iQ H2i _mbi FMQr r2HH #2 KFBM;
mb2 Q7 BiX h?Bb HbQ /Q2b i?2 2[mBpH2Mi Q7 use rand; b r2HH- bQ r2 +M KF2 mb2 Q7 Mvi?BM;
BM i?2 rand +`i2 #v T`2}tBM; Bi rBi? rand::X
L2ti- r2 //2/ MQi?2` use HBM2, use rand::RngX q2`2 ;QBM; iQ mb2 K2i?Q/ BM KQK2MiM/ Bi `2[mB`2b i?i Rng #2 BM b+QT2 iQ rQ`FX h?2 #bB+ B/2 Bb i?Bb, K2i?Q/b `2 /2}M2/ QM
bQK2i?BM; +HH2/ i`Bib- M/ 7Q` i?2 K2i?Q/ iQ rQ`F- Bi M22/b i?2 i`Bi iQ #2 BM b+QT2X 6Q` KQ`2
#Qmi i?2 /2iBHb- `2/ i?2 i`Bib Ub2+iBQM 8Xky- T;2 RdjV b2+iBQMX
h?2`2 `2 irQ Qi?2` HBM2b r2 //2/- BM i?2 KB//H2,
let secret_number = rand::thread_rng().gen_range(1, 101);
println!("The secret number is: {}", secret_number);
R9 ?iiT,ff/Q+X+`i2bXBQ
R8 ?iiT,ff/Q+X+`i2bXBQf+`i2b@BQX?iKH
jR
q2 mb2 i?2 rand::thread_rng() 7mM+iBQM iQ ;2i +QTv Q7 i?2 `M/QK MmK#2` ;2M2`iQ`- r?B+?
Bb HQ+H iQ i?2 T`iB+mH` i?`2/ Ub2+iBQM 9Xe- T;2 N9V Q7 2t2+miBQM r2`2 BMX "2+mb2 r2 use
rand::Rng/ #Qp2- Bi ?b gen_range() K2i?Q/ pBH#H2X h?Bb K2i?Q/ iF2b irQ `;mK2MibM/ ;2M2`i2b MmK#2` #2ir22M i?2KX Aib BM+HmbBp2 QM i?2 HQr2` #QmM/- #mi 2t+HmbBp2 QM i?2
mTT2` #QmM/- bQ r2 M22/ 1 M/ 101 iQ ;2i MmK#2` #2ir22M QM2 M/ ?mM/`2/X
h?2 b2+QM/ HBM2 Dmbi T`BMib Qmi i?2 b2+`2i MmK#2`X h?Bb Bb mb27mH r?BH2 r2`2 /2p2HQTBM; Qm`
T`Q;`K- bQ r2 +M 2bBHv i2bi Bi QmiX "mi r2HH #2 /2H2iBM; Bi 7Q` i?2 }MH p2`bBQMX Aib MQi Km+?
Q7 ;K2 B7 Bi T`BMib Qmi i?2 Mbr2` r?2M vQm bi`i Bi mT5
h`v `mMMBM; Qm` M2r T`Q;`K 72r iBK2b,
$ cargo run
Compiling guessing_game v0.1.0 (file:///home/you/projects/guessing_game)
Running `target/debug/guessing_game`
Guess the number!
The secret number is: 7
Please input your guess.
4
You guessed: 4
$ cargo run
Running `target/debug/guessing_game`
Guess the number!
The secret number is: 83
Please input your guess.
5
You guessed: 5
:`2i5 L2ti mT, H2ib +QKT`2 Qm` ;m2bb iQ i?2 b2+`2i ;m2bbX
jXRX9
*QKT`BM; ;m2bb2b
LQr i?i r2p2 ;Qi mb2` BMTmi- H2ib +QKT`2 Qm` ;m2bb iQ i?2 `M/QK ;m2bbX >2`2b Qm` M2ti
bi2T- i?Qm;? Bi /Q2bMi [mBi2 rQ`F v2i,
extern crate rand;
use std::io;
use std::cmp::Ordering;
use rand::Rng;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1, 101);
println!("The secret number is: {}", secret_number);
println!("Please input your guess.");
jk
}
}
72r M2r #Bib ?2`2X h?2 }`bi Bb MQi?2` useX q2 #`BM; ivT2 +HH2/
b+QT2X h?2M- }p2 M2r HBM2b i i?2 #QiiQK i?i mb2 Bi,
std::cmp::Ordering
BMiQ
match guess.cmp(&secret_number) {
Ordering::Less
h?2 cmp() K2i?Q/ +M #2 +HH2/ QM Mvi?BM; i?i +M #2 +QKT`2/- M/ Bi iF2b `272`2M+2 iQ
i?2 i?BM; vQm rMi iQ +QKT`2 Bi iQX Ai `2im`Mb i?2 Ordering ivT2 r2 use/ 2`HB2`X q2 mb2 match
Ub2+iBQM 8XR9- T;2 R8dV bii2K2Mi iQ /2i2`KBM2 2t+iHv r?i FBM/ Q7 Ordering Bi BbX Ordering Bb
M enum Ub2+iBQM 8XRj- T;2 R8eV- b?Q`i 7Q` 2MmK2`iBQM- r?B+? HQQFb HBF2 i?Bb,
enum Foo {
Bar,
Baz,
}
Foo::Bar
Q`
Foo::BazX
q2 mb2 i?2
::
h?2 OrderingRe 2MmK ?b i?`22 TQbbB#H2 p`BMib, Less- Equal- M/ GreaterX h?2 match bii2K2Mi
iF2b pHm2 Q7 ivT2- M/ H2ib vQm +`2i2 M `K 7Q` 2+? TQbbB#H2 pHm2X aBM+2 r2 ?p2 i?`22
ivT2b Q7 Ordering- r2 ?p2 i?`22 `Kb,
match guess.cmp(&secret_number) {
Ordering::Less
}
Re ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/f+KTf2MmKXP`/2`BM;X?iKH
jj
M/ B7
Bb `2HHv
A /B/ K2MiBQM i?i i?Bb rQMi [mBi2 rQ`F v2i- i?Qm;?X G2ib i`v Bi,
$ cargo build
Compiling guessing_game v0.1.0 (file:///home/you/projects/guessing_game)
src/main.rs:28:21: 28:35 error: mismatched types:
expected `&collections::string::String`,
found `&_`
(expected struct `collections::string::String`,
found integral variable) [E0308]
src/main.rs:28
match guess.cmp(&secret_number) {
^~~~~~~~~~~~~~
q?2r5 h?Bb Bb #B; 2``Q`X h?2 +Q`2 Q7 Bi Bb i?i r2 ?p2 KBbKi+?2/ ivT2bX _mbi ?b
bi`QM;- biiB+ ivT2 bvbi2KX >Qr2p2`- Bi HbQ ?b ivT2 BM72`2M+2X q?2M r2 r`Qi2 let guess =
String::new()- _mbi rb #H2 iQ BM72` i?i guess b?QmH/ #2 String- M/ bQ Bi /Q2bMi KF2 mb
r`Bi2 Qmi i?2 ivT2X M/ rBi? Qm` secret_number- i?2`2 `2 MmK#2` Q7 ivT2b r?B+? +M ?p2
pHm2 #2ir22M QM2 M/ ?mM/`2/, i32- i?B`iv@irQ@#Bi MmK#2`- Q` u32- M mMbB;M2/ i?B`iv@irQ@
#Bi MmK#2`- Q` i64- bBtiv@7Qm`@#Bi MmK#2`X P` Qi?2`bX aQ 7`- i?i ?bMi Kii2`2/- M/ bQ
_mbi /27mHib iQ M i32X >Qr2p2`- ?2`2- _mbi /Q2bMi FMQr ?Qr iQ +QKT`2 i?2 guess M/ i?2
secret_numberX h?2v M22/ iQ #2 i?2 bK2 ivT2X lHiBKi2Hv- r2 rMi iQ +QMp2`i i?2 String r2
`2/ b BMTmi BMiQ `2H MmK#2` ivT2- 7Q` +QKT`BbQMX q2 +M /Q i?i rBi? i?`22 KQ`2 HBM2bX
>2`2b Qm` M2r T`Q;`K,
extern crate rand;
use std::io;
use std::cmp::Ordering;
use rand::Rng;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1, 101);
println!("The secret number is: {}", secret_number);
println!("Please input your guess.");
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.ok()
.expect("failed to read line");
j9
}
}
qBi KBMmi2- A i?Qm;?i r2 H`2/v ?/ guess\ q2 /Q- #mi _mbi HHQrb mb iQ b?/Qr i?2
T`2pBQmb guess rBi? M2r QM2X h?Bb Bb Q7i2M mb2/ BM i?Bb 2t+i bBimiBQM- r?2`2 guess bi`ib b
String- #mi r2 rMi iQ +QMp2`i Bi iQ M u32X a?/QrBM; H2ib mb `2@mb2 i?2 guess MK2- `i?2`
i?M 7Q`+BM; mb iQ +QK2 mT rBi? irQ mMB[m2 MK2b HBF2 guess_str M/ guess- Q` bQK2i?BM; 2Hb2X
q2 #BM/
guess
guess.trim().parse()
6QHHQr2/ #v M ok().expect() BMpQ+iBQMX >2`2- guess `272`b iQ i?2 QH/ guess- i?2 QM2 i?i rb
String rBi? Qm` BMTmi BM BiX h?2 trim() K2i?Q/ QM Stringb rBHH 2HBKBMi2 Mv r?Bi2 bT+2 i
i?2 #2;BMMBM; M/ 2M/ Q7 Qm` bi`BM;X h?Bb Bb BKTQ`iMi- b r2 ?/ iQ T`2bb i?2 `2im`M F2v iQ
biBb7v read_line()X h?Bb K2Mb i?i B7 r2 ivT2 5 M/ ?Bi `2im`M- guess HQQFb HBF2 i?Bb, 5\nX h?2
\n `2T`2b2Mib M2rHBM2- i?2 2Mi2` F2vX trim() ;2ib `B/ Q7 i?Bb- H2pBM; Qm` bi`BM; rBi? Dmbi i?2 5X
h?2 parse() K2i?Q/ QM bi`BM;bRd T`b2b bi`BM; BMiQ bQK2 FBM/ Q7 MmK#2`X aBM+2 Bi +M T`b2
p`B2iv Q7 MmK#2`b- r2 M22/ iQ ;Bp2 _mbi ?BMi b iQ i?2 2t+i ivT2 Q7 MmK#2` r2 rMiX >2M+2let guess: u32X h?2 +QHQM U:V 7i2` guess i2HHb _mbi r2`2 ;QBM; iQ MMQii2 Bib ivT2X u32 Bb
M mMbB;M2/- i?B`iv@irQ #Bi BMi2;2`X _mbi ?b MmK#2` Q7 #mBHi@BM MmK#2` ivT2bR3 - #mi r2p2
+?Qb2M u32X Aib ;QQ/ /27mHi +?QB+2 7Q` bKHH TQbBiBp2 MmK#2`X
Cmbi HBF2 read_line()- Qm` +HH iQ parse() +QmH/ +mb2 M 2``Q`X q?i B7 Qm` bi`BM; +QMiBM2/ A%\
h?2`2/ #2 MQ rv iQ +QMp2`i i?i iQ MmK#2`X b bm+?- r2HH /Q i?2 bK2 i?BM; r2 /B/ rBi?
read_line(), mb2 i?2 ok() M/ expect() K2i?Q/b iQ +`b? B7 i?2`2b M 2``Q`X
G2ib i`v Qm` T`Q;`K Qmi5
$ cargo run
Compiling guessing_game v0.0.1 (file:///home/you/projects/guessing_game)
Rd ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fT`BKBiBp2Xbi`X?iKHOK2i?Q/XT`b2
R3 T`BKBiBp2@ivT2bX?iKHOMmK2`B+@ivT2b
j8
Running `target/guessing_game`
Guess the number!
The secret number is: 58
Please input your guess.
76
You guessed: 76
Too big!
LB+25 uQm +M b22 A 2p2M //2/ bT+2b #27Q`2 Kv ;m2bb- M/ Bi biBHH };m`2/ Qmi i?i A ;m2bb2/ deX
_mM i?2 T`Q;`K 72r iBK2b- M/ p2`B7v i?i ;m2bbBM; i?2 MmK#2` rQ`Fb- b r2HH b ;m2bbBM;
MmK#2` iQQ bKHHX
LQr r2p2 ;Qi KQbi Q7 i?2 ;K2 rQ`FBM;- #mi r2 +M QMHv KF2 QM2 ;m2bbX G2ib +?M;2 i?i
#v //BM; HQQTb5
jXRX8
GQQTBM;
h?2
loop
je
}
}
}
M/ i`v Bi QmiX "mi rBi- /B/Mi r2 Dmbi // M BM}MBi2 HQQT\ umTX _2K2K#2` Qm` /Bb+mbbBQM
#Qmi parse()\ A7 r2 ;Bp2 MQM@MmK#2` Mbr2`- r2HH return M/ [mBiX P#b2`p2,
$ cargo run
Compiling guessing_game v0.0.1 (file:///home/you/projects/guessing_game)
Running `target/guessing_game`
Guess the number!
The secret number is: 59
Please input your guess.
45
You guessed: 45
Too small!
Please input your guess.
60
You guessed: 60
Too big!
Please input your guess.
59
You guessed: 59
You win!
Please input your guess.
quit
thread '<main>' panicked at 'Please type a number!'
>5 quit +imHHv [mBibX b /Q2b Mv Qi?2` MQM@MmK#2` BMTmiX q2HH- i?Bb Bb bm#QTiBKH iQ bv
i?2 H2biX 6B`bi- H2ib +imHHv [mBi r?2M vQm rBM i?2 ;K2,
extern crate rand;
use std::io;
use std::cmp::Ordering;
use rand::Rng;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1, 101);
println!("The secret number is: {}", secret_number);
loop {
jd
=> {
println!("You win!");
break;
}
}
}
}
"v //BM; i?2 break HBM2 7i2` i?2 You win!- r2HH 2tBi i?2 HQQT r?2M r2 rBMX 1tBiBM; i?2 HQQT
HbQ K2Mb 2tBiBM; i?2 T`Q;`K- bBM+2 Bib i?2 Hbi i?BM; BM main()X q2 ?p2 Dmbi QM2 KQ`2 ir2F
iQ KF2, r?2M bQK2QM2 BMTmib MQM@MmK#2`- r2 /QMi rMi iQ [mBi- r2 Dmbi rMi iQ B;MQ`2 BiX
q2 +M /Q i?i HBF2 i?Bb,
extern crate rand;
use std::io;
use std::cmp::Ordering;
use rand::Rng;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1, 101);
println!("The secret number is: {}", secret_number);
loop {
println!("Please input your guess.");
let mut guess = String::new();
io::stdin().read_line(&mut guess)
j3
=> {
println!("You win!");
break;
}
}
}
}
h?Bb Bb ?Qr vQm ;2M2`HHv KQp2 7`QK +`b? QM 2``Q` iQ +imHHv ?M/H2 i?2 2``Q`- #v brBi+?BM;
7`QK ok().expect() iQ match bii2K2MiX h?2 Result `2im`M2/ #v parse() Bb M 2MmK Dmbi HBF2
Ordering- #mi BM i?Bb +b2- 2+? p`BMi ?b bQK2 /i bbQ+Bi2/ rBi? Bi, Ok Bb bm++2bb- M/
Err Bb 7BHm`2X 1+? +QMiBMb KQ`2 BM7Q`KiBQM, i?2 bm++2bb7mH T`b2/ BMi2;2`- Q` M 2``Q` ivT2X
AM i?Bb +b2- r2 match QM Ok(num)- r?B+? b2ib i?2 BMM2` pHm2 Q7 i?2 Ok iQ i?2 MK2 num- M/ i?2M
r2 Dmbi `2im`M Bi QM i?2 `B;?i@?M/ bB/2X AM i?2 Err +b2- r2 /QMi +`2 r?i FBM/ Q7 2``Q` Bi BbbQ r2 Dmbi mb2 _ BMbi2/ Q7 MK2X h?Bb B;MQ`2b i?2 2``Q`- M/ continue +mb2b mb iQ ;Q iQ i?2
M2ti Bi2`iBQM Q7 i?2 loopX
LQr r2 b?QmH/ #2 ;QQ/5 G2ib i`v,
$ cargo run
Compiling guessing_game v0.0.1 (file:///home/you/projects/guessing_game)
Running `target/guessing_game`
Guess the number!
The secret number is: 61
Please input your guess.
10
You guessed: 10
Too small!
jN
r2bQK25 qBi? QM2 iBMv Hbi ir2F- r2 ?p2 }MBb?2/ i?2 ;m2bbBM; ;K2X *M vQm i?BMF Q7 r?i
Bi Bb\ h?ib `B;?i- r2 /QMi rMi iQ T`BMi Qmi i?2 b2+`2i MmK#2`X Ai rb ;QQ/ 7Q` i2biBM;- #mi Bi
FBM/ Q7 `mBMb i?2 ;K2X >2`2b Qm` }MH bQm`+2,
extern crate rand;
use std::io;
use std::cmp::Ordering;
use rand::Rng;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1, 101);
loop {
println!("Please input your guess.");
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.ok()
.expect("failed to read line");
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
println!("You guessed: {}", guess);
match guess.cmp(&secret_number) {
Ordering::Less
=> {
println!("You win!");
break;
}
9y
jXRXe *QKTH2i25
i i?Bb TQBMi- vQm ?p2 bm++2bb7mHHv #mBHi i?2 :m2bbBM; :K25 *QM;`imHiBQMb5
h?Bb }`bi T`QD2+i b?Qr2/ vQm HQi, let- match- K2i?Q/b- bbQ+Bi2/ 7mM+iBQMb- mbBM; 2ti2`MH
+`i2b- M/ KQ`2X Pm` M2ti T`QD2+i rBHH b?Qr Qz 2p2M KQ`2X
jXk
.BMBM; S?BHQbQT?2`b
6Q` Qm` b2+QM/ T`QD2+i- H2ib HQQF i +HbbB+ +QM+m``2M+v T`Q#H2KX Aib +HH2/ i?2 /BMBM; T?BHQbQ@
T?2`bX Ai rb Q`B;BMHHv +QM+2Bp2/ #v .BDFbi` BM RNe8- #mi r2HH mb2 i?2 p2`bBQM 7`QK i?Bb TT2`RN
#v hQMv >Q`2 BM RN38X
AM M+B2Mi iBK2b- r2Hi?v T?BHMi?`QTBbi 2M/Qr2/ *QHH2;2 iQ ++QKKQ/i2 }p2
2KBM2Mi T?BHQbQT?2`bX 1+? T?BHQbQT?2` ?/ `QQK BM r?B+? ?2 +QmH/ 2M;;2 BM ?Bb
T`Q72bbBQMH +iBpBiv Q7 i?BMFBM;c i?2`2 rb HbQ +QKKQM /BMBM; `QQK- 7m`MBb?2/
rBi? +B`+mH` i#H2- bm``QmM/2/ #v }p2 +?B`b- 2+? H#2HH2/ #v i?2 MK2 Q7 i?2
T?BHQbQT?2` r?Q rb iQ bBi BM BiX h?2v bi MiB+HQ+FrBb2 `QmM/ i?2 i#H2X hQ i?2
H27i Q7 2+? T?BHQbQT?2` i?2`2 rb HB/ ;QH/2M 7Q`F- M/ BM i?2 +2Mi`2 biQQ/ H`;2
#QrH Q7 bT;?2iiB- r?B+? rb +QMbiMiHv `2TH2MBb?2/X T?BHQbQT?2` rb 2tT2+i2/
iQ bT2M/ KQbi Q7 ?Bb iBK2 i?BMFBM;c #mi r?2M ?2 72Hi ?mM;`v- ?2 r2Mi iQ i?2 /BMBM;
`QQK- bi /QrM BM ?Bb QrM +?B`- TB+F2/ mT ?Bb QrM 7Q`F QM ?Bb H27i- M/ THmM;2/ Bi
BMiQ i?2 bT;?2iiBX "mi bm+? Bb i?2 iM;H2/ Mim`2 Q7 bT;?2iiB i?i b2+QM/ 7Q`F
Bb `2[mB`2/ iQ +``v Bi iQ i?2 KQmi?X h?2 T?BHQbQT?2` i?2`27Q`2 ?/ HbQ iQ TB+F mT
i?2 7Q`F QM ?Bb `B;?iX q?2M r2 rb }MBb?2/ ?2 rQmH/ Tmi /QrM #Qi? ?Bb 7Q`Fb- ;2i
mT 7`QK ?Bb +?B`- M/ +QMiBMm2 i?BMFBM;X P7 +Qm`b2- 7Q`F +M #2 mb2/ #v QMHv QM2
T?BHQbQT?2` i iBK2X A7 i?2 Qi?2` T?BHQbQT?2` rMib Bi- ?2 Dmbi ?b iQ rBi mMiBH i?2
7Q`F Bb pBH#H2 ;BMX
h?Bb +HbbB+ T`Q#H2K b?Qrb Qz 72r /Bz2`2Mi 2H2K2Mib Q7 +QM+m``2M+vX h?2 `2bQM Bb i?i Bib
+imHHv bHB;?iHv i`B+Fv iQ BKTH2K2Mi, bBKTH2 BKTH2K2MiiBQM +M /2/HQ+FX 6Q` 2tKTH2- H2ib
+QMbB/2` bBKTH2 H;Q`Bi?K i?i rQmH/ bQHp2 i?Bb T`Q#H2K,
RX
kX
jX
9X
S?BHQbQT?2` R #2;BMb
S?BHQbQT?2` k #2;BMb
S?BHQbQT?2` j #2;BMb
S?BHQbQT?2` 9 #2;BMb
S?BHQbQT?2` 8 #2;BMb
\ HH i?2 7Q`Fb `2
9R
7Q`F
7Q`F
7Q`F
7Q`F
7Q`F
QM
QM
QM
QM
QM
i?2B`
i?2B`
i?2B`
i?2B`
i?2B`
H27iX
H27iX
H27iX
H27iX
H27iX
h?2`2 `2 /Bz2`2Mi rvb iQ bQHp2 i?Bb T`Q#H2KX q2HH ;2i iQ Qm` bQHmiBQM BM i?2 imiQ`BH Bib2H7X
6Q` MQr- H2ib ;2i bi`i2/ KQ/2HHBM; i?2 T`Q#H2K Bib2H7X q2HH bi`i rBi? i?2 T?BHQbQT?2`b,
struct Philosopher {
name: String,
}
impl Philosopher {
fn new(name: &str) -> Philosopher {
Philosopher {
name: name.to_string(),
}
}
}
fn main() {
let p1 = Philosopher::new("Baruch Spinoza");
let p2 = Philosopher::new("Gilles Deleuze");
let p3 = Philosopher::new("Karl Marx");
let p4 = Philosopher::new("Friedrich Nietzsche");
let p5 = Philosopher::new("Michel Foucault");
}
>2`2- r2 KF2 struct Ub2+iBQM 8XRk- T;2 R8jV iQ `2T`2b2Mi T?BHQbQT?2`X 6Q` MQr- MK2 Bb
HH r2 M22/X q2 +?QQb2 i?2 String Ub2+iBQM 8XR3- T;2 ReNV ivT2 7Q` i?2 MK2- `i?2` i?M &strX
:2M2`HHv bT2FBM;- rQ`FBM; rBi? ivT2 r?B+? QrMb Bib /i Bb 2bB2` i?M rQ`FBM; rBi? QM2
i?i mb2b `272`2M+2bX
G2ib +QMiBMm2,
impl Philosopher {
fn new(name: &str) -> Philosopher {
Philosopher {
name: name.to_string(),
}
}
}
h?Bb impl #HQ+F H2ib mb /2}M2 i?BM;b QM Philosopher bi`m+ibX AM i?Bb +b2- r2 /2}M2 M bbQ+Bi2/
7mM+iBQM +HH2/ newX h?2 }`bi HBM2 HQQFb HBF2 i?Bb,
9k
&strX
Philosopher {
name: name.to_string(),
}
h?Bb +`2i2b M2r Philosopher- M/ b2ib Bib name iQ Qm` name `;mK2MiX LQi Dmbi i?2 `;mK2Mi
Bib2H7- i?Qm;?- b r2 +HH .to_string() QM BiX h?Bb rBHH +`2i2 +QTv Q7 i?2 bi`BM; i?i Qm` &str
TQBMib iQ- M/ ;Bp2 mb M2r String- r?B+? Bb i?2 ivT2 Q7 i?2 name }2H/ Q7 PhilosopherX
q?v MQi ++2Ti String /B`2+iHv\ Aib MB+2` iQ +HHX A7 r2 iQQF String- #mi Qm` +HH2` ?/
&str- i?2v/ ?p2 iQ +HH i?Bb K2i?Q/ i?2Kb2Hp2bX h?2 /QrMbB/2 Q7 i?Bb ~2tB#BHBiv Bb i?i r2
Hrvb KF2 +QTvX 6Q` i?Bb bKHH T`Q;`K- i?ib MQi T`iB+mH`Hv BKTQ`iMi- b r2 FMQr r2HH
Dmbi #2 mbBM; b?Q`i bi`BM;b MvrvX
PM2 Hbi i?BM; vQmHH MQiB+2, r2 Dmbi /2}M2 Philosopher- M/ b22KBM;Hv /QMi /Q Mvi?BM;
rBi? BiX _mbi Bb M 2tT`2bbBQM #b2/ HM;m;2- r?B+? K2Mb i?i HKQbi 2p2`vi?BM; BM _mbi
Bb M 2tT`2bbBQM r?B+? `2im`Mb pHm2X h?Bb Bb i`m2 Q7 7mM+iBQMb b r2HH- i?2 Hbi 2tT`2bbBQM Bb
miQKiB+HHv `2im`M2/X aBM+2 r2 +`2i2 M2r Philosopher b i?2 Hbi 2tT`2bbBQM Q7 i?Bb 7mM+iBQMr2 2M/ mT `2im`MBM; BiX
h?Bb MK2- new()- BbMi Mvi?BM; bT2+BH iQ _mbi- #mi Bi Bb +QMp2MiBQM 7Q` 7mM+iBQMb i?i +`2i2
M2r BMbiM+2b Q7 bi`m+ibX "27Q`2 r2 iHF #Qmi r?v- H2ib HQQF i main() ;BM,
fn main() {
let p1 = Philosopher::new("Baruch Spinoza");
let p2 = Philosopher::new("Gilles Deleuze");
let p3 = Philosopher::new("Karl Marx");
let p4 = Philosopher::new("Friedrich Nietzsche");
let p5 = Philosopher::new("Michel Foucault");
}
>2`2- r2 +`2i2 }p2 p`B#H2 #BM/BM;b rBi? }p2 M2r T?BHQbQT?2`bX h?2b2 `2 Kv 7pQ`Bi2 }p2- #mi
vQm +M bm#biBimi2 MvQM2 vQm rMiX A7 r2 /B/Mi /2}M2 i?i new() 7mM+iBQM- Bi rQmH/ HQQF HBF2
i?Bb,
fn main() {
let p1 = Philosopher { name: "Baruch Spinoza".to_string() };
let p2 = Philosopher { name: "Gilles Deleuze".to_string() };
let p3 = Philosopher { name: "Karl Marx".to_string() };
let p4 = Philosopher { name: "Friedrich Nietzche".to_string() };
let p5 = Philosopher { name: "Michel Foucault".to_string() };
}
new
?b Qi?2` /pMi;2b iQQ- #mi 2p2M BM i?Bb bBKTH2 +b2- Bi 2M/b
9j
LQr i?i r2p2 ;Qi i?2 #bB+b BM TH+2- i?2`2b MmK#2` Q7 rvb i?i r2 +M i+FH2 i?2 #`Q/2`
T`Q#H2K ?2`2X A HBF2 iQ bi`i 7`QK i?2 2M/ }`bi, H2ib b2i mT rv 7Q` 2+? T?BHQbQT?2` iQ }MBb?
2iBM;X b iBMv bi2T- H2ib KF2 K2i?Q/- M/ i?2M HQQT i?`Qm;? HH i?2 T?BHQbQT?2`b- +HHBM;
Bi,
struct Philosopher {
name: String,
}
impl Philosopher {
fn new(name: &str) -> Philosopher {
Philosopher {
name: name.to_string(),
}
}
fn eat(&self) {
println!("{} is done eating.", self.name);
}
}
fn main() {
let philosophers = vec![
Philosopher::new("Baruch Spinoza"),
Philosopher::new("Gilles Deleuze"),
Philosopher::new("Karl Marx"),
Philosopher::new("Friedrich Nietzsche"),
Philosopher::new("Michel Foucault"),
];
for p in &philosophers {
p.eat();
}
}
G2ib HQQF i main() }`biX _i?2` i?M ?p2 }p2 BM/BpB/mH p`B#H2 #BM/BM;b 7Q` Qm` T?BHQbQT?2`br2 KF2 Vec<T> Q7 i?2K BMbi2/X Vec<T> Bb HbQ +HH2/ p2+iQ`- M/ Bib ;`Qr#H2 ``v ivT2X
q2 i?2M mb2 for Ub2+iBQM 8Xe- T;2 RjjV HQQT iQ Bi2`i2 i?`Qm;? i?2 p2+iQ`- ;2iiBM; `272`2M+2
iQ 2+? T?BHQbQT?2` BM im`MX
AM i?2 #Q/v Q7 i?2 HQQT- r2 +HH
p.eat()-
fn eat(&self) {
println!("{} is done eating.", self.name);
}
AM _mbi- K2i?Q/b iF2 M 2tTHB+Bi self T`K2i2`X h?ib r?v eat() Bb K2i?Q/- #mi new Bb M
bbQ+Bi2/ 7mM+iBQM, new() ?b MQ selfX 6Q` Qm` }`bi p2`bBQM Q7 eat()- r2 Dmbi T`BMi Qmi i?2 MK2
Q7 i?2 T?BHQbQT?2`- M/ K2MiBQM i?2v`2 /QM2 2iBM;X _mMMBM; i?Bb T`Q;`K b?QmH/ ;Bp2 vQm i?2
7QHHQrBM; QmiTmi,
99
1bv 2MQm;?- i?2v`2 HH /QM25 q2 ?p2Mi +imHHv BKTH2K2Mi2/ i?2 `2H T`Q#H2K v2i- i?Qm;?bQ r2`2 MQi /QM2 v2i5
L2ti- r2 rMi iQ KF2 Qm` T?BHQbQT?2`b MQi Dmbi }MBb? 2iBM;- #mi +imHHv 2iX >2`2b i?2 M2ti
p2`bBQM,
use std::thread;
struct Philosopher {
name: String,
}
impl Philosopher {
fn new(name: &str) -> Philosopher {
Philosopher {
name: name.to_string(),
}
}
fn eat(&self) {
println!("{} is eating.", self.name);
thread::sleep_ms(1000);
println!("{} is done eating.", self.name);
}
}
fn main() {
let philosophers = vec![
Philosopher::new("Baruch Spinoza"),
Philosopher::new("Gilles Deleuze"),
Philosopher::new("Karl Marx"),
Philosopher::new("Friedrich Nietzsche"),
Philosopher::new("Michel Foucault"),
];
for p in &philosophers {
p.eat();
}
}
98
use std::thread;
thread
fn eat(&self) {
println!("{} is eating.", self.name);
thread::sleep_ms(1000);
println!("{} is done eating.", self.name);
}
sleep_ms()
A7 vQm `mM i?Bb T`Q;`K- uQm b?QmH/ b22 2+? T?BHQbQT?2` 2i BM im`M,
Baruch Spinoza is eating.
Baruch Spinoza is done eating.
Gilles Deleuze is eating.
Gilles Deleuze is done eating.
Karl Marx is eating.
Karl Marx is done eating.
Friedrich Nietzsche is eating.
Friedrich Nietzsche is done eating.
Michel Foucault is eating.
Michel Foucault is done eating.
1t+2HH2Mi5 q2`2 ;2iiBM; i?2`2X h?2`2b Dmbi QM2 T`Q#H2K, r2 `2Mi +imHHv QT2`iBM; BM
+QM+m``2Mi 7b?BQM- r?B+? Bb +Q`2 T`i Q7 i?2 T`Q#H2K5
hQ KF2 Qm` T?BHQbQT?2`b 2i +QM+m``2MiHv- r2 M22/ iQ KF2 bKHH +?M;2X >2`2b i?2 M2ti
Bi2`iBQM,
use std::thread;
struct Philosopher {
name: String,
}
impl Philosopher {
fn new(name: &str) -> Philosopher {
Philosopher {
name: name.to_string(),
}
}
9e
}
fn main() {
let philosophers = vec![
Philosopher::new("Baruch Spinoza"),
Philosopher::new("Gilles Deleuze"),
Philosopher::new("Karl Marx"),
Philosopher::new("Friedrich Nietzsche"),
Philosopher::new("Michel Foucault"),
];
let handles: Vec<_> = philosophers.into_iter().map(|p| {
thread::spawn(move || {
p.eat();
})
}).collect();
for h in handles {
h.join().unwrap();
}
}
main()-
q?BH2 i?Bb Bb QMHv }p2 HBM2b- i?2v`2 /2Mb2 }p2X G2ib #`2F Bi /QrMX
let handles: Vec<_> =
q2 BMi`Q/m+2 M2r #BM/BM;- +HH2/ handlesX q2p2 ;Bp2M Bi i?Bb MK2 #2+mb2 r2 `2 ;QBM; iQ
KF2 bQK2 M2r i?`2/b- M/ i?i rBHH `2im`M bQK2 ?M/H2b iQ i?Qb2 i?`2/b i?i H2i mb +QMi`QH
i?2B` QT2`iBQMX q2 M22/ iQ 2tTHB+BiHv MMQii2 i?2 ivT2 ?2`2- i?Qm;?- /m2 iQ M Bbbm2 r2HH iHF
#Qmi Hi2`X h?2 _ Bb ivT2 TH+2?QH/2`X q2`2 bvBM; handles Bb p2+iQ` Q7 bQK2i?BM;- #mi
vQm +M };m`2 Qmi r?i i?i bQK2i?BM; Bb- _mbiX
9d
philosophers.into_iter().map(|p| {
q2 iF2 Qm` HBbi Q7 T?BHQbQT?2`b M/ +HH into_iter() QM BiX h?Bb +`2i2b M Bi2`iQ` i?i iF2b
QrM2`b?BT Q7 2+? T?BHQbQT?2`X q2 M22/ iQ /Q i?Bb iQ Tbb i?2K iQ Qm` i?`2/bX q2 iF2 i?i
Bi2`iQ` M/ +HH map QM Bi- r?B+? iF2b +HQbm`2 b M `;mK2Mi M/ +HHb i?i +HQbm`2 QM 2+?
2H2K2Mi BM im`MX
thread::spawn(move || {
p.eat();
})
>2`2b r?2`2 i?2 +QM+m``2M+v ?TT2MbX h?2 thread::spawn 7mM+iBQM iF2b +HQbm`2 b M `;m@
K2Mi M/ 2t2+mi2b i?i +HQbm`2 BM M2r i?`2/X h?Bb +HQbm`2 M22/b M 2ti` MMQiiBQM- moveiQ BM/B+i2 i?i i?2 +HQbm`2 Bb ;QBM; iQ iF2 QrM2`b?BT Q7 i?2 pHm2b Bib +Tim`BM;X S`BK`BHvi?2 p p`B#H2 Q7 i?2 map 7mM+iBQMX
AMbB/2 i?2 i?`2/- HH r2 /Q Bb +HH
eat()
QM pX
}).collect();
6BMHHv- r2 iF2 i?2 `2bmHi Q7 HH i?Qb2 map +HHb M/ +QHH2+i i?2K mTX collect() rBHH KF2 i?2K
BMiQ +QHH2+iBQM Q7 bQK2 FBM/- r?B+? Bb r?v r2 M22/2/ iQ MMQii2 i?2 `2im`M ivT2, r2 rMi
Vec<T>X h?2 2H2K2Mib `2 i?2 `2im`M pHm2b Q7 i?2 thread::spawn +HHb- r?B+? `2 ?M/H2b iQ
i?Qb2 i?`2/bX q?2r5
for h in handles {
h.join().unwrap();
}
i i?2 2M/ Q7 main()- r2 HQQT i?`Qm;? i?2 ?M/H2b M/ +HH join() QM i?2K- r?B+? #HQ+Fb 2t2+miBQM
mMiBH i?2 i?`2/ ?b +QKTH2i2/ 2t2+miBQMX h?Bb 2Mbm`2b i?i i?2 i?`2/b +QKTH2i2 i?2B` rQ`F
#27Q`2 i?2 T`Q;`K 2tBibX
A7 vQm `mM i?Bb T`Q;`K- vQmHH b22 i?i i?2 T?BHQbQT?2`b 2i Qmi Q7 Q`/2`5 q2 ?p2 KmHiB@
i?`2/BM;5
Gilles Deleuze is eating.
Gilles Deleuze is done eating.
Friedrich Nietzsche is eating.
Friedrich Nietzsche is done eating.
Michel Foucault is eating.
Baruch Spinoza is eating.
Baruch Spinoza is done eating.
Karl Marx is eating.
Karl Marx is done eating.
Michel Foucault is done eating.
"mi r?i #Qmi i?2 7Q`Fb\ q2 ?p2Mi KQ/2H2/ i?2K i HH v2iX
hQ /Q i?i- H2ib KF2 M2r
struct,
93
use std::sync::Mutex;
struct Table {
forks: Vec<Mutex<()>>,
}
h?Bb Table ?b M p2+iQ` Q7 Mutex2bX Kmi2t Bb rv iQ +QMi`QH +QM+m``2M+v, QMHv QM2 i?`2/
+M ++2bb i?2 +QMi2Mib i QM+2X h?Bb Bb 2t+iHv i?2 T`QT2`iv r2 M22/ rBi? Qm` 7Q`FbX q2 mb2 M
2KTiv imTH2- ()- BMbB/2 i?2 Kmi2t- bBM+2 r2`2 MQi +imHHv ;QBM; iQ mb2 i?2 pHm2- Dmbi ?QH/ QMiQ
BiX
G2ib KQ/B7v i?2 T`Q;`K iQ mb2 i?2
Table,
use std::thread;
use std::sync::{Mutex, Arc};
struct Philosopher {
name: String,
left: usize,
right: usize,
}
impl Philosopher {
fn new(name: &str, left: usize, right: usize) -> Philosopher {
Philosopher {
name: name.to_string(),
left: left,
right: right,
}
}
fn eat(&self, table: &Table) {
let _left = table.forks[self.left].lock().unwrap();
let _right = table.forks[self.right].lock().unwrap();
println!("{} is eating.", self.name);
thread::sleep_ms(1000);
println!("{} is done eating.", self.name);
}
}
struct Table {
forks: Vec<Mutex<()>>,
}
fn main() {
let table = Arc::new(Table { forks: vec![
9N
Mutex::new(()),
Mutex::new(()),
Mutex::new(()),
Mutex::new(()),
Mutex::new(()),
]});
let philosophers = vec![
Philosopher::new("Baruch Spinoza", 0, 1),
Philosopher::new("Gilles Deleuze", 1, 2),
Philosopher::new("Karl Marx", 2, 3),
Philosopher::new("Friedrich Nietzsche", 3, 4),
Philosopher::new("Michel Foucault", 0, 4),
];
let handles: Vec<_> = philosophers.into_iter().map(|p| {
let table = table.clone();
thread::spawn(move || {
p.eat(&table);
})
}).collect();
for h in handles {
h.join().unwrap();
}
}
GQib Q7 +?M;2b5 >Qr2p2`- rBi? i?Bb Bi2`iBQM- r2p2 ;Qi rQ`FBM; T`Q;`KX G2ib ;Q Qp2` i?2
/2iBHb,
use std::sync::{Mutex, Arc};
Arc<T>X
struct Philosopher {
name: String,
left: usize,
right: usize,
}
q2 M22/ iQ // irQ KQ`2 }2H/b iQ Qm` PhilosopherX 1+? T?BHQbQT?2` Bb ;QBM; iQ ?p2 irQ 7Q`Fb,
i?2 QM2 QM i?2B` H27i- M/ i?2 QM2 QM i?2B` `B;?iX q2HH mb2 i?2 usize ivT2 iQ BM/B+i2 i?2K- b
Bib i?2 ivT2 i?i vQm BM/2t p2+iQ`b rBi?X h?2b2 irQ pHm2b rBHH #2 i?2 BM/2t2b BMiQ i?2 forks
Qm` Table ?bX
8y
left
M/
right
new()X
q2 ?p2 irQ M2r HBM2bX q2p2 HbQ //2/ M `;mK2Mi- tableX q2 ++2bb i?2 Tableb HBbi Q7 7Q`FbM/ i?2M mb2 self.left M/ self.right iQ ++2bb i?2 7Q`F i i?i T`iB+mH` BM/2tX h?i ;Bp2b
mb ++2bb iQ i?2 Mutex i i?i BM/2t- M/ r2 +HH lock() QM BiX A7 i?2 Kmi2t Bb +m``2MiHv #2BM;
++2bb2/ #v bQK2QM2 2Hb2- r2HH #HQ+F mMiBH Bi #2+QK2b pBH#H2X
h?2 +HH iQ lock() KB;?i 7BH- M/ B7 Bi /Q2b- r2 rMi iQ +`b?X AM i?Bb +b2- i?2 2``Q` i?i +QmH/
?TT2M Bb i?i i?2 Kmi2t Bb TQBbQM2/ky - r?B+? Bb r?i ?TT2Mb r?2M i?2 i?`2/ TMB+b r?BH2
i?2 HQ+F Bb ?2H/X aBM+2 i?Bb b?QmH/Mi ?TT2M- r2 Dmbi mb2 unwrap()X
PM2 Qi?2` Q// i?BM; #Qmi i?2b2 HBM2b, r2p2 MK2/ i?2 `2bmHib _left M/ _rightX q?ib mT
rBi? i?i mM/2`b+Q`2\ q2HH- r2 `2Mi THMMBM; QM mbBM; i?2 pHm2 BMbB/2 i?2 HQ+FX q2 Dmbi rMi
iQ +[mB`2 BiX b bm+?- _mbi rBHH r`M mb i?i r2 M2p2` mb2 i?2 pHm2X "v mbBM; i?2 mM/2`b+Q`2r2 i2HH _mbi i?i i?Bb Bb r?i r2 BMi2M/2/- M/ Bi rQMi i?`Qr r`MBM;X
q?i #Qmi `2H2bBM; i?2 HQ+F\ q2HH- i?i rBHH ?TT2M r?2M
miQKiB+HHvX
_left
M/
_right
;Q Qmi Q7 b+QT2-
L2ti- BM main()- r2 KF2 M2r Table M/ r`T Bi BM M Arc<T>X `+ biM/b 7Q` iQKB+ `272`2M+2
+QmMi- M/ r2 M22/ i?i iQ b?`2 Qm` Table +`Qbb KmHiBTH2 i?`2/bX b r2 b?`2 Bi- i?2 `272`2M+2
+QmMi rBHH ;Q mT- M/ r?2M 2+? i?`2/ 2M/b- Bi rBHH ;Q #+F /QrMX
ky ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fbvM+fbi`m+iXJmi2tX?iKHOTQBbQMBM;
8R
q2 M22/ iQ Tbb BM Qm` left M/ right pHm2b iQ i?2 +QMbi`m+iQ`b 7Q` Qm` PhilosopherbX "mi i?2`2b
QM2 KQ`2 /2iBH ?2`2- M/ Bib p2`v BKTQ`iMiX A7 vQm HQQF i i?2 Tii2`M- Bib HH +QMbBbi2Mi mMiBH
i?2 p2`v 2M/X JQMbB2m` 6Qm+mHi b?QmH/ ?p2 4, 0 b `;mK2Mib- #mi BMbi2/- ?b 0, 4X h?Bb
Bb r?i T`2p2Mib /2/HQ+F- +imHHv, QM2 Q7 Qm` T?BHQbQT?2`b Bb H27i ?M/2/5 h?Bb Bb QM2 rv iQ
bQHp2 i?2 T`Q#H2K- M/ BM Kv QTBMBQM- Bib i?2 bBKTH2biX
let handles: Vec<_> = philosophers.into_iter().map(|p| {
let table = table.clone();
thread::spawn(move || {
p.eat(&table);
})
}).collect();
6BMHHv- BMbB/2 Q7 Qm` map()fcollect() HQQT- r2 +HH table.clone()X h?2 clone() K2i?Q/ QM
Bb r?i #mKTb mT i?2 `272`2M+2 +QmMi- M/ r?2M Bi ;Q2b Qmi Q7 b+QT2- Bi /2+`2K2Mib i?2
+QmMiX uQmHH MQiB+2 r2 +M BMi`Q/m+2 M2r #BM/BM; iQ table ?2`2- M/ Bi rBHH b?/Qr i?2 QH/
QM2X h?Bb Bb Q7i2M mb2/ bQ i?i vQm /QMi M22/ iQ +QK2 mT rBi? irQ mMB[m2 MK2bX
Arc<T>
qBi? i?Bb- Qm` T`Q;`K rQ`Fb5 PMHv irQ T?BHQbQT?2`b +M 2i i Mv QM2 iBK2- M/ bQ vQmHH ;2i
bQK2 QmiTmi HBF2 i?Bb,
Gilles Deleuze is eating.
Friedrich Nietzsche is eating.
Friedrich Nietzsche is done eating.
Gilles Deleuze is done eating.
Baruch Spinoza is eating.
Karl Marx is eating.
Baruch Spinoza is done eating.
Michel Foucault is eating.
Karl Marx is done eating.
Michel Foucault is done eating.
jXj
6Q` Qm` i?B`/ T`QD2+i- r2`2 ;QBM; iQ +?QQb2 bQK2i?BM; i?i b?Qrb Qz QM2 Q7 _mbib ;`2i2bi
bi`2M;i?b, H+F Q7 bm#biMiBH `mMiBK2X
8k
8j
count += 1
end
end
end
threads.each {|t| t.join }
puts "done!"
h`v `mMMBM; i?Bb 2tKTH2- M/ +?QQb2 MmK#2` i?i `mMb 7Q` 72r b2+QM/bX .2T2M/BM; QM vQm`
+QKTmi2`b ?`/r`2- vQm Kv ?p2 iQ BM+`2b2 Q` /2+`2b2 i?2 MmK#2`X
PM Kv bvbi2K- `mMMBM; i?Bb T`Q;`K iF2b 2.156 b2+QM/bX M/- B7 A mb2 bQK2 bQ`i Q7 T`Q+2bb
KQMBiQ`BM; iQQH- HBF2 top- A +M b22 i?i Bi QMHv mb2b QM2 +Q`2 QM Kv K+?BM2X h?ib i?2 :AG
FB+FBM; BMX
q?BH2 Bib i`m2 i?i i?Bb Bb bvMi?2iB+ T`Q;`K- QM2 +M BK;BM2 KMv T`Q#H2Kb i?i `2 bBKBH`
iQ i?Bb BM i?2 `2H rQ`H/X 6Q` Qm` Tm`TQb2b- bTBMMBM; mT bQK2 #mbv i?`2/b `2T`2b2Mib bQK2 bQ`i
Q7 T`HH2H- 2tT2MbBp2 +QKTmiiBQMX
jXjXk
_mbi HB#``v
G2ib `2@r`Bi2 i?Bb T`Q#H2K BM _mbiX 6B`bi- H2ib KF2 M2r T`QD2+i rBi? *`;Q,
$ cargo new embed
$ cd embed
aQK2 Q7 i?Bb b?QmH/ HQQF 7KBHB` 7`QK T`2pBQmb 2tKTH2bX q2 bTBM mT i2M i?`2/b- +QHH2+iBM;
i?2K BMiQ handles p2+iQ`X AMbB/2 Q7 2+? i?`2/- r2 HQQT }p2 KBHHBQM iBK2b- M/ // QM2 iQ _x
2+? iBK2X q?v i?2 mM/2`b+Q`2\ q2HH- B7 r2 `2KQp2 Bi M/ +QKTBH2,
89
$ cargo build
Compiling embed v0.1.0 (file:///home/steve/src/embed)
src/lib.rs:3:1: 16:2 warning: function is never used: `process`, #[warn(dead_code)] on
by default
src/lib.rs:3 fn process() {
src/lib.rs:4
src/lib.rs:5
thread::spawn(|| {
src/lib.rs:6
let mut x = 0;
src/lib.rs:7
for _ in (0..5_000_001) {
src/lib.rs:8
x += 1
...
src/lib.rs:6:17: 6:22 warning: variable `x` is assigned to, but never used, #[warn(unus
ed_variables)] on by default
src/lib.rs:6
let mut x = 0;
^~~~~
h?i }`bi r`MBM; Bb #2+mb2 r2 `2 #mBH/BM; HB#``vX A7 r2 ?/ i2bi 7Q` i?Bb 7mM+iBQM- i?2
r`MBM; rQmH/ ;Q rvX "mi 7Q` MQr- Bib M2p2` +HH2/X
h?2 b2+QM/ Bb `2Hi2/ iQ x p2`bmb _xX "2+mb2 r2 M2p2` +imHHv /Q Mvi?BM; rBi? x- r2 ;2i
r`MBM; #Qmi BiX AM Qm` +b2- i?ib T2`72+iHv QFv- b r2`2 Dmbi i`vBM; iQ rbi2 *Sl +v+H2bX
S`2}tBM; x rBi? i?2 mM/2`b+Q`2 `2KQp2b i?2 r`MBM;X
6BMHHv- r2 DQBM QM 2+? i?`2/X
_B;?i MQr- ?Qr2p2`- i?Bb Bb _mbi HB#``v- M/ Bi /Q2bMi 2tTQb2 Mvi?BM; i?ib +HH#H2 7`QK
*X A7 r2 i`B2/ iQ ?QQF i?Bb mT iQ MQi?2` HM;m;2 `B;?i MQr- Bi rQmH/Mi rQ`FX q2 QMHv M22/ iQ
KF2 irQ bKHH +?M;2b iQ }t i?Bb- i?Qm;?X h?2 }`bi Bb KQ/B7v i?2 #2;BMMBM; Q7 Qm` +Q/2,
#[no_mangle]
pub extern fn process() {
q2 ?p2 iQ // M2r ii`B#mi2- no_mangleX q?2M vQm +`2i2 _mbi HB#``v- Bi +?M;2b i?2
MK2 Q7 i?2 7mM+iBQM BM i?2 +QKTBH2/ QmiTmiX h?2 `2bQMb 7Q` i?Bb `2 QmibB/2 i?2 b+QT2 Q7 i?Bb
imiQ`BH- #mi BM Q`/2` 7Q` Qi?2` HM;m;2b iQ FMQr ?Qr iQ +HH i?2 7mM+iBQM- r2 M22/ iQ MQi /Q
i?iX h?Bb ii`B#mi2 im`Mb i?i #2?pBQ` QzX
h?2 Qi?2` +?M;2 Bb i?2 pub externX h?2 pub K2Mb i?i i?Bb 7mM+iBQM b?QmH/ #2 +HH#H2 7`QK
QmibB/2 Q7 i?Bb KQ/mH2- M/ i?2 extern bvb i?i Bi b?QmH/ #2 #H2 iQ #2 +HH2/ 7`QK *X h?ib
Bi5 LQi r?QH2 HQi Q7 +?M;2X
h?2 b2+QM/ i?BM; r2 M22/ iQ /Q Bb iQ +?M;2 b2iiBM; BM Qm` Cargo.tomlX // i?Bb i i?2 #QiiQK,
[lib]
name = "embed"
crate-type = ["dylib"]
h?Bb i2HHb _mbi i?i r2 rMi iQ +QKTBH2 Qm` HB#``v BMiQ biM/`/ /vMKB+ HB#``vX "v /27mHi_mbi +QKTBH2b BMiQ M `HB#- _mbi@bT2+B}+ 7Q`KiX
G2ib #mBH/ i?2 T`QD2+i MQr,
88
q2p2 +?Qb2M cargo build --release- r?B+? #mBH/b rBi? QTiBKBxiBQMb QMX q2 rMi i?Bb iQ #2
b 7bi b TQbbB#H25 uQm +M }M/ i?2 QmiTmi Q7 i?2 HB#``v BM target/release,
$ ls target/release/
build
deps
examples
libembed.so
native
h?i libembed.so Bb Qm` b?`2/ Q#D2+i HB#``vX q2 +M mb2 i?Bb }H2 Dmbi HBF2 Mv b?`2/ Q#D2+i
HB#``v r`Bii2M BM *5 b M bB/2- i?Bb Kv #2 embed.dll Q` libembed.dylib- /2T2M/BM; QM i?2
THi7Q`KX
LQr i?i r2p2 ;Qi Qm` _mbi HB#``v #mBHi- H2ib mb2 Bi 7`QK Qm` _m#vX
jXjXj
_m#v
PT2M mT
embed.rb
require 'ffi'
module Hello
extend FFI::Library
ffi_lib 'target/release/libembed.so'
attach_function :process, [], :void
end
Hello.process
puts "done!
ffi
;2K,
8e
q?Q?- i?i rb 7bi5 PM Kv bvbi2K- i?Bb iQQF 0.086 b2+QM/b- `i?2` i?M i?2 irQ b2+QM/b i?2
Tm`2 _m#v p2`bBQM iQQFX G2ib #`2F /QrM i?Bb _m#v +Q/2,
require 'ffi'
q2 }`bi M22/ iQ `2[mB`2 i?2 ffi ;2KX h?Bb H2ib mb BMi2`7+2 rBi? Qm` _mbi HB#``v HBF2 * HB#``vX
module Hello
extend FFI::Library
ffi_lib 'target/release/libembed.so'
h?2 ffi ;2Kb mi?Q`b `2+QKK2M/ mbBM; KQ/mH2 iQ b+QT2 i?2 7mM+iBQMb r2HH BKTQ`i 7`QK i?2
b?`2/ HB#``vX AMbB/2- r2 extend i?2 M2+2bb`v FFI::Library KQ/mH2- M/ i?2M +HH ffi_lib iQ
HQ/ mT Qm` b?`2/ Q#D2+i HB#``vX q2 Dmbi Tbb Bi i?2 Ti? i?i Qm` HB#``v Bb biQ`2/- r?B+? b
r2 br #27Q`2- Bb target/release/libembed.soX
attach_function :process, [], :void
h?2 attach_function K2i?Q/ Bb T`QpB/2/ #v i?2 66A ;2KX Aib r?i +QMM2+ib Qm` process()
7mM+iBQM BM _mbi iQ _m#v 7mM+iBQM Q7 i?2 bK2 MK2X aBM+2 process() iF2b MQ `;mK2Mibi?2 b2+QM/ T`K2i2` Bb M 2KTiv ``v- M/ bBM+2 Bi `2im`Mb MQi?BM;- r2 Tbb :void b i?2 }MH
`;mK2MiX
Hello.process
h?Bb Bb i?2 +imH +HH BMiQ _mbiX h?2 +QK#BMiBQM Q7 Qm` module M/ i?2 +HH iQ
b2ib i?Bb HH mTX Ai HQQFb HBF2 _m#v 7mM+iBQM- #mi Bb +imHHv _mbi5
attach_function
puts "done!"
done!X
h?ib Bi5 b r2p2 b22M- #`B/;BM; #2ir22M i?2 irQ HM;m;2b Bb `2HHv 2bv- M/ #mvb mb HQi Q7
T2`7Q`KM+2X
L2ti- H2ib i`v Svi?QM5
jXjX9 Svi?QM
*`2i2 M
embed.py
8d
1p2M 2bB2`5 q2 mb2 cdll 7`QK i?2 ctypes KQ/mH2X [mB+F +HH iQ LoadLibrary Hi2`- M/ r2 +M
+HH process()X
PM Kv bvbi2K- i?Bb iF2b
jXjX8
0.017
b2+QM/bX aT22/v5
LQ/2XDb
LQ/2 BbMi HM;m;2- #mi Bib +m``2MiHv i?2 /QKBMMi BKTH2K2MiiBQM Q7 b2`p2`@bB/2 Cpa+`BTiX
AM Q`/2` iQ /Q 66A rBi? LQ/2- r2 }`bi M22/ iQ BMbiHH i?2 HB#``v,
$ npm install ffi
});
lib.process();
console.log("done!");
Ai HQQFb KQ`2 HBF2 i?2 _m#v 2tKTH2 i?M i?2 Svi?QM 2tKTH2X q2 mb2 i?2 ffi KQ/mH2 iQ ;2i
++2bb iQ ffi.Library()- r?B+? HQ/b mT Qm` b?`2/ Q#D2+iX q2 M22/ iQ MMQii2 i?2 `2im`M ivT2
M/ `;mK2Mi ivT2b Q7 i?2 7mM+iBQM- r?B+? `2 pQB/ 7Q` `2im`M- M/ M 2KTiv ``v iQ bB;MB7v
MQ `;mK2MibX 6`QK i?2`2- r2 Dmbi +HH Bi M/ T`BMi i?2 `2bmHiX
PM Kv bvbi2K- i?Bb iF2b [mB+F
jXjXe
0.092
b2+QM/bX
*QM+HmbBQM
b vQm +M b22- i?2 #bB+b Q7 /QBM; i?Bb `2 p2`v 2bvX P7 +Qm`b2- i?2`2b HQi KQ`2 i?i r2 +QmH/
/Q ?2`2X *?2+F Qmi i?2 66A Ub2+iBQM 9X3- T;2 RyeV +?Ti2` 7Q` KQ`2 /2iBHbX
83
1z2+iBp2 _mbi
aQ vQmp2 H2`M2/ ?Qr iQ r`Bi2 bQK2 _mbi +Q/2X "mi i?2`2b /Bz2`2M+2 #2ir22M r`BiBM; Mv
_mbi +Q/2 M/ r`BiBM; ;QQ/ _mbi +Q/2X
h?Bb b2+iBQM +QMbBbib Q7 `2HiBp2Hv BM/2T2M/2Mi imiQ`BHb r?B+? b?Qr vQm ?Qr iQ iF2 vQm` _mbi iQ
i?2 M2ti H2p2HX *QKKQM Tii2`Mb M/ biM/`/ HB#``v 72im`2b rBHH #2 BMi`Q/m+2/X _2/ i?2b2
b2+iBQMb BM Mv Q`/2` Q7 vQm` +?QQbBM;X
9XR
b bvbi2Kb HM;m;2- _mbi QT2`i2b i HQr H2p2HX A7 vQm`2 +QKBM; 7`QK ?B;?@H2p2H HM;m;2i?2`2 `2 bQK2 bT2+ib Q7 bvbi2Kb T`Q;`KKBM; i?i vQm Kv MQi #2 7KBHB` rBi?X h?2 KQbi
BKTQ`iMi QM2 Bb ?Qr K2KQ`v rQ`Fb- rBi? bi+F M/ ?2TX A7 vQm`2 7KBHB` rBi? ?Qr *@HBF2
HM;m;2b mb2 bi+F HHQ+iBQM- i?Bb +?Ti2` rBHH #2 `27`2b?2`X A7 vQm`2 MQi- vQmHH H2`M #Qmi
i?Bb KQ`2 ;2M2`H +QM+2Ti- #mi rBi? _mbi@v 7Q+mbX
9XRXR
J2KQ`v KM;2K2Mi
h?2b2 irQ i2`Kb `2 #Qmi K2KQ`v KM;2K2MiX h?2 bi+F M/ i?2 ?2T `2 #bi`+iBQMb i?i
?2HT vQm /2i2`KBM2 r?2M iQ HHQ+i2 M/ /2HHQ+i2 K2KQ`vX
>2`2b ?B;?@H2p2H +QKT`BbQM,
h?2 bi+F Bb p2`v 7bi- M/ Bb r?2`2 K2KQ`v Bb HHQ+i2/ BM _mbi #v /27mHiX "mi i?2 HHQ+iBQM
Bb HQ+H iQ 7mM+iBQM +HH- M/ Bb HBKBi2/ BM bBx2X h?2 ?2T- QM i?2 Qi?2` ?M/- Bb bHQr2`- M/
Bb 2tTHB+BiHv HHQ+i2/ #v vQm` T`Q;`KX "mi Bib 2z2+iBp2Hv mMHBKBi2/ BM bBx2- M/ Bb ;HQ#HHv
++2bbB#H2X
ey
h?Bb T`Q;`K ?b QM2 p`B#H2 #BM/BM;- xX h?Bb K2KQ`v M22/b iQ #2 HHQ+i2/ 7`QK bQK2r?2`2X
_mbi bi+F HHQ+i2b #v /27mHi- r?B+? K2Mb i?i #bB+ pHm2b ;Q QM i?2 bi+FX q?i /Q2b
i?i K2M\
q2HH- r?2M 7mM+iBQM ;2ib +HH2/- bQK2 K2KQ`v ;2ib HHQ+i2/ 7Q` HH Q7 Bib HQ+H p`B#H2b M/
bQK2 Qi?2` BM7Q`KiBQMX h?Bb Bb +HH2/ bi+F 7`K2- M/ 7Q` i?2 Tm`TQb2 Q7 i?Bb imiQ`BH- r2`2
;QBM; iQ B;MQ`2 i?2 2ti` BM7Q`KiBQM M/ Dmbi +QMbB/2` i?2 HQ+H p`B#H2b r2`2 HHQ+iBM;X aQ
BM i?Bb +b2- r?2M main() Bb `mM- r2HH HHQ+i2 bBM;H2 jk@#Bi BMi2;2` 7Q` Qm` bi+F 7`K2X h?Bb Bb
miQKiB+HHv ?M/H2/ 7Q` vQm- b vQm +M b22- r2 /B/Mi ?p2 iQ r`Bi2 Mv bT2+BH _mbi +Q/2 Q`
Mvi?BM;X
q?2M i?2 7mM+iBQM Bb Qp2`- Bib bi+F 7`K2 ;2ib /2HHQ+i2/X h?Bb ?TT2Mb miQKiB+HHv- r2
/B/Mi ?p2 iQ /Q Mvi?BM; bT2+BH ?2`2X
h?ib HH i?2`2 Bb 7Q` i?Bb bBKTH2 T`Q;`KX h?2 F2v i?BM; iQ mM/2`biM/ ?2`2 Bb i?i bi+F
HHQ+iBQM Bb p2`v- p2`v 7biX aBM+2 r2 FMQr HH i?2 HQ+H p`B#H2b r2 ?p2 ?2/ Q7 iBK2- r2 +M
;`# i?2 K2KQ`v HH i QM+2X M/ bBM+2 r2HH i?`Qr i?2K HH rv i i?2 bK2 iBK2 b r2HH- r2
+M ;2i `B/ Q7 Bi p2`v 7bi iQQX
h?2 /QrMbB/2 Bb i?i r2 +Mi F22T pHm2b `QmM/ B7 r2 M22/ i?2K 7Q` HQM;2` i?M bBM;H2
7mM+iBQMX q2 HbQ ?p2Mi iHF2/ #Qmi r?i i?i MK2- bi+F K2MbX hQ /Q i?i- r2 M22/
bHB;?iHv KQ`2 +QKTHB+i2/ 2tKTH2,
fn foo() {
let y = 5;
let z = 100;
}
fn main() {
let x = 42;
foo();
}
h?Bb T`Q;`K ?b i?`22 p`B#H2b iQiH, irQ BM foo()- QM2 BM main()X Cmbi b #27Q`2- r?2M main()
Bb +HH2/- bBM;H2 BMi2;2` Bb HHQ+i2/ 7Q` Bib bi+F 7`K2X "mi #27Q`2 r2 +M b?Qr r?i ?TT2Mb
r?2M foo() Bb +HH2/- r2 M22/ iQ pBbmHBx2 r?ib ;QBM; QM rBi? K2KQ`vX uQm` QT2`iBM; bvbi2K
T`2b2Mib pB2r Q7 K2KQ`v iQ vQm` T`Q;`K i?ib T`2iiv bBKTH2, ?m;2 HBbi Q7 //`2bb2b- 7`QK
y iQ H`;2 MmK#2`- `2T`2b2MiBM; ?Qr Km+? _J vQm` +QKTmi2` ?bX 6Q` 2tKTH2- B7 vQm ?p2
;B;#vi2 Q7 _J- vQm` //`2bb2b ;Q 7`QK 0 iQ 1,073,741,824X h?i MmK#2` +QK2b 7`QK kjyi?2 MmK#2` Q7 #vi2b BM ;B;#vi2X
h?Bb K2KQ`v Bb FBM/ Q7 HBF2 ;BMi ``v, //`2bb2b bi`i i x2`Q M/ ;Q mT iQ i?2 }MH MmK#2`X
aQ ?2`2b /B;`K Q7 Qm` }`bi bi+F 7`K2,
q2p2 ;Qi
q?2M
foo()
eR
//`2bb
LK2
oHm2
9k
42X
LK2
oHm2
k
R
y
x
v
t
Ryy
8
9k
"2+mb2 0 rb iF2M #v i?2 }`bi 7`K2- 1 M/ 2 `2 mb2/ 7Q` foo()b bi+F 7`K2X Ai ;`Qrb mTr`/i?2 KQ`2 7mM+iBQMb r2 +HHX
h?2`2b bQK2 BKTQ`iMi i?BM;b r2 ?p2 iQ iF2 MQi2 Q7 ?2`2X h?2 MmK#2`b y- R- M/ k `2 HH
bQH2Hv 7Q` BHHmbi`iBp2 Tm`TQb2b- M/ #2` MQ `2HiBQMb?BT iQ i?2 +imH MmK#2`b i?2 +QKTmi2` rBHH
+imHHv mb2X AM T`iB+mH`- i?2 b2`B2b Q7 //`2bb2b `2 BM `2HBiv ;QBM; iQ #2 b2T`i2/ #v bQK2
MmK#2` Q7 #vi2b i?i b2T`i2 2+? //`2bb- M/ i?i b2T`iBQM Kv 2p2M 2t+22/ i?2 bBx2 Q7 i?2
pHm2 #2BM; biQ`2/X
7i2`
foo()
main()-
//`2bb
LK2
oHm2
9k
Aib +HH2/ bi+F #2+mb2 Bi rQ`Fb HBF2 bi+F Q7 /BMM2` THi2b, i?2 }`bi THi2 vQm Tmi /QrM
Bb i?2 Hbi THi2 iQ TB+F #+F mTX ai+Fb `2 bQK2iBK2b +HH2/ Hbi BM- }`bi Qmi [m2m2b 7Q` i?Bb
`2bQM- b i?2 Hbi pHm2 vQm Tmi QM i?2 bi+F Bb i?2 }`bi QM2 vQm `2i`B2p2 7`QK BiX
G2ib i`v i?`22@/22T 2tKTH2,
fn bar() {
let i = 6;
}
fn foo() {
let a = 5;
let b = 100;
let c = 1;
bar();
}
fn main() {
ek
L2ti mT-
M/ i?2M
main()
foo()
main(),
+HHb
+HHb
//`2bb
LK2
oHm2
9k
//`2bb
LK2
oHm2
j
k
R
y
+
#
t
R
Ryy
8
9k
//`2bb
LK2
oHm2
9
j
k
R
y
B
+
#
t
e
R
Ryy
8
9k
foo(),
bar(),
bar()
M/ i?2M
foo()
foo()
//`2bb
LK2
oHm2
j
k
R
y
+
#
t
R
Ryy
8
9k
//`2bb
LK2
oHm2
9k
main()
M/
main(),
ej
M/ i?2M r2`2 /QM2X :2iiBM; i?2 ?M; Q7 Bi\ Aib HBF2 TBHBM; mT /Bb?2b, vQm // iQ i?2 iQT- vQm
iF2 rv 7`QK i?2 iQTX
9XRXj
h?2 >2T
LQr- i?Bb rQ`Fb T`2iiv r2HH- #mi MQi 2p2`vi?BM; +M rQ`F HBF2 i?BbX aQK2iBK2b- vQm M22/ iQ Tbb
bQK2 K2KQ`v #2ir22M /Bz2`2Mi 7mM+iBQMb- Q` F22T Bi HBp2 7Q` HQM;2` i?M bBM;H2 7mM+iBQMb
2t2+miBQMX 6Q` i?Bb- r2 +M mb2 i?2 ?2TX
AM _mbi- vQm +M HHQ+i2 K2KQ`v QM i?2 ?2T rBi? i?2
Box<T>
fn main() {
let x = Box::new(5);
let y = 42;
}
main()
Bb +HH2/,
//`2bb
LK2
oHm2
R
y
v
t
9k
\\\\\\
q2 HHQ+i2 bT+2 7Q` irQ p`B#H2b QM i?2 bi+FX y Bb 42- b Bi Hrvb ?b #22M- #mi r?i #Qmi
x\ q2HH- x Bb Box<i32>- M/ #Qt2b HHQ+i2 K2KQ`v QM i?2 ?2TX h?2 +imH pHm2 Q7 i?2 #Qt
Bb bi`m+im`2 r?B+? ?b TQBMi2` iQ i?2 ?2TX q?2M r2 bi`i 2t2+miBM; i?2 7mM+iBQM- M/
Box::new() Bb +HH2/- Bi HHQ+i2b bQK2 K2KQ`v 7Q` i?2 ?2T- M/ Tmib 5 i?2`2X h?2 K2KQ`v MQr
HQQFb HBF2 i?Bb,
//`2bb
LK2
oHm2
kjy
R
y
v
t
9k
kjy
q2 ?p2 kjy BM Qm` ?vTQi?2iB+H +QKTmi2` rBi? R:" Q7 _JX M/ bBM+2 Qm` bi+F ;`Qrb 7`QK
x2`Q- i?2 2bB2bi TH+2 iQ HHQ+i2 K2KQ`v Bb 7`QK i?2 Qi?2` 2M/X aQ Qm` }`bi pHm2 Bb i i?2
?B;?2bi TH+2 BM K2KQ`vX M/ i?2 pHm2 Q7 i?2 bi`m+i i x ?b `r TQBMi2` Ub2+iBQM 8XjeT;2 kjjV iQ i?2 TH+2 r2p2 HHQ+i2/ QM i?2 ?2T- bQ i?2 pHm2 Q7 x Bb kjy- i?2 K2KQ`v HQ+iBQM
r2p2 bF2/ 7Q`X
q2 ?p2Mi `2HHv iHF2/ iQQ Km+? #Qmi r?i Bi +imHHv K2Mb iQ HHQ+i2 M/ /2HHQ+i2
K2KQ`v BM i?2b2 +QMi2tibX :2iiBM; BMiQ p2`v /22T /2iBH Bb Qmi Q7 i?2 b+QT2 Q7 i?Bb imiQ`BH#mi r?ib BKTQ`iMi iQ TQBMi Qmi ?2`2 Bb i?i i?2 ?2T BbMi Dmbi bi+F i?i ;`Qrb 7`QK i?2
QTTQbBi2 2M/X q2HH ?p2 M 2tKTH2 Q7 i?Bb Hi2` BM i?2 #QQF- #mi #2+mb2 i?2 ?2T +M #2
R ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/f#Qt2/fBM/2tX?iKH
e9
HHQ+i2/ M/ 7`22/ BM Mv Q`/2`- Bi +M 2M/ mT rBi? ?QH2bX >2`2b /B;`K Q7 i?2 K2KQ`v
HvQmi Q7 T`Q;`K r?B+? ?b #22M `mMMBM; 7Q` r?BH2 MQr,
//`2bb
kjy
UkjyV @ R
UkjyV @ k
UkjyV @ j
j
k
R
y
LK2
oHm2
8
v
v
v
t
9k
UkjyV @ j
9k
9k
kjy
AM i?Bb +b2- r2p2 HHQ+i2/ 7Qm` i?BM;b QM i?2 ?2T- #mi /2HHQ+i2/ irQ Q7 i?2KX h?2`2b
;T #2ir22M kjy M/ UkjyV @ j r?B+? BbMi +m``2MiHv #2BM; mb2/X h?2 bT2+B}+ /2iBHb Q7 ?Qr
M/ r?v i?Bb ?TT2Mb /2T2M/b QM r?i FBM/ Q7 bi`i2;v vQm mb2 iQ KM;2 i?2 ?2TX .Bz2`2Mi
T`Q;`Kb +M mb2 /Bz2`2Mi K2KQ`v HHQ+iQ`b- r?B+? `2 HB#``B2b i?i KM;2 i?Bb 7Q` vQmX
_mbi T`Q;`Kb mb2 D2KHHQ+k 7Q` i?Bb Tm`TQb2X
Mvrv- #+F iQ Qm` 2tKTH2X aBM+2 i?Bb K2KQ`v Bb QM i?2 ?2T- Bi +M biv HBp2 HQM;2` i?M i?2
7mM+iBQM r?B+? HHQ+i2b i?2 #QtX AM i?Bb +b2- ?Qr2p2`- Bi /Q2bMiX(KQpBM;) q?2M i?2 7mM+iBQM
Bb Qp2`- r2 M22/ iQ 7`22 i?2 bi+F 7`K2 7Q` main()X Box<T>- i?Qm;?- ?b i`B+F mT Bib bH22p2, .`QT
Ub2+iBQM 8XkR- T;2 R3yVX h?2 BKTH2K2MiiBQM Q7 Drop 7Q` Box /2HHQ+i2b i?2 K2KQ`v i?i rb
HHQ+i2/ r?2M Bi rb +`2i2/X :`2i5 aQ r?2M x ;Q2b rv- Bi }`bi 7`22b i?2 K2KQ`v HHQ+i2/
QM i?2 ?2T,
sometimes called
moving
//`2bb
LK2
oHm2
R
y
v
t
9k
\\\\\\
be covered later.
M/ i?2M i?2 bi+F 7`K2 ;Q2b rv- 7`22BM; HH Q7 Qm` K2KQ`vX
e8
}
fn main() {
let x = 5;
let y = &x;
foo(y);
}
q?2M r2 2Mi2`
main()-
LK2
oHm2
R
y
v
t
y
8
x Bb THBM QH/ 5- M/ y Bb `272`2M+2 iQ xX aQ Bib pHm2 Bb i?2 K2KQ`v HQ+iBQM i?i
r?B+? BM i?Bb +b2 Bb 0X
foo()-
TbbBM;
HBp2b i-
b M `;mK2Mi\
//`2bb
LK2
oHm2
j
k
R
y
x
B
v
t
9k
y
y
8
ai+F 7`K2b `2Mi Dmbi 7Q` HQ+H #BM/BM;b- i?2v`2 7Q` `;mK2Mib iQQX aQ BM i?Bb +b2- r2 M22/
iQ ?p2 #Qi? i- Qm` `;mK2Mi- M/ z- Qm` HQ+H p`B#H2 #BM/BM;X i Bb +QTv Q7 i?2 `;mK2Mi- yX
aBM+2 yb pHm2 Bb 0- bQ Bb ibX
h?Bb Bb QM2 `2bQM r?v #Q``QrBM; p`B#H2 /Q2bMi /2HHQ+i2 Mv K2KQ`v, i?2 pHm2 Q7
`272`2M+2 Bb Dmbi TQBMi2` iQ K2KQ`v HQ+iBQMX A7 r2 ;Qi `B/ Q7 i?2 mM/2`HvBM; K2KQ`v- i?BM;b
rQmH/Mi rQ`F p2`v r2HHX
9XRX8
+QKTH2t 2tKTH2
ee
6B`bi- r2 +HH
main(),
//`2bb
LK2
oHm2
kjy
k
R
y
D
B
?
ky
y
kjy
j
main()- foo()
;2ib +HH2/,
//`2bb
LK2
oHm2
kjy
8
9
j
k
R
y
x
v
t
D
B
?
ky
9
Ry
y
y
kjy
j
aT+2 ;2ib HHQ+i2/ 7Q` x- y- M/ zX h?2 `;mK2Mi x ?b i?2 bK2 pHm2 b j- bBM+2 i?ib r?i
r2 Tbb2/ Bi BMX Aib TQBMi2` iQ i?2 0 //`2bb- bBM+2 j TQBMib i hX
foo()
+HHb
baz()-
TbbBM; z,
//`2bb
LK2
oHm2
kjy
d
e
8
9
j
k
R
y
;
7
x
v
t
D
B
?
ky
Ryy
9
9
Ry
y
y
kjy
j
L2ti-
foo()
+HHb
bar()
ed
rBi?
baz()
//`2bb
LK2
oHm2
kjy
8
9
j
k
R
y
x
v
t
D
B
?
ky
9
Ry
y
y
kjy
j
M/ z,
//`2bb
kjy
UkjyV @ R
Ry
N
3
d
e
8
9
j
k
R
y
LK2
oHm2
2
/
+
#
x
v
t
D
B
?
ky
8
N
UkjyV @ R
8
9
y
9
Ry
y
y
kjy
j
e3
q2 2M/ mT HHQ+iBM; MQi?2` pHm2 QM i?2 ?2T- M/ bQ r2 ?p2 iQ bm#i`+i QM2 7`QK kjyX Aib
2bB2` iQ Dmbi r`Bi2 i?i i?M 1,073,741,823X AM Mv +b2- r2 b2i mT i?2 p`B#H2b b mbmHX
i i?2 2M/ Q7
bar()-
Bi +HHb
baz(),
//`2bb
kjy
UkjyV @ R
Rk
RR
Ry
N
3
d
e
8
9
j
k
R
y
LK2
oHm2
;
7
2
/
+
#
x
v
t
D
B
?
ky
8
Ryy
9
N
UkjyV @ R
8
9
y
9
Ry
y
y
kjy
j
qBi? i?Bb- r2`2 i Qm` /22T2bi TQBMi5 q?2r5 *QM;`ib 7Q` 7QHHQrBM; HQM; i?Bb 7`X
7i2`
baz()
M/ g,
//`2bb
kjy
UkjyV @ R
Ry
N
3
d
e
8
9
j
k
R
y
L2ti- r2 `2im`M 7`QK
RX
bar()X d
LK2
oHm2
2
/
+
#
x
v
t
D
B
?
ky
8
N
UkjyV @ R
8
9
y
9
Ry
y
y
kjy
j
BM i?Bb +b2 Bb
Box<T>-
foo()
9XRXe
eN
//`2bb
LK2
oHm2
kjy
8
9
j
k
R
y
x
v
t
D
B
?
ky
9
Ry
y
y
kjy
j
//`2bb
LK2
oHm2
kjy
k
R
y
D
B
?
ky
y
kjy
j
`2im`Mb,
main()-
Bb
DropT2/-
JQbi HM;m;2b rBi? ;`#;2 +QHH2+iQ` ?2T@HHQ+i2 #v /27mHiX h?Bb K2Mb i?i 2p2`v pHm2 Bb
#Qt2/X h?2`2 `2 MmK#2` Q7 `2bQMb r?v i?Bb Bb /QM2- #mi i?2v`2 Qmi Q7 b+QT2 7Q` i?Bb imiQ`BHX
h?2`2 `2 bQK2 TQbbB#H2 QTiBKBxiBQMb i?i /QMi KF2 Bi i`m2 RyyW Q7 i?2 iBK2- iQQX _i?2`
i?M `2HvBM; QM i?2 bi+F M/ Drop iQ +H2M mT K2KQ`v- i?2 ;`#;2 +QHH2+iQ` /2Hb rBi? i?2 ?2T
BMbi2/X
9XRXd
q?B+? iQ mb2\
aQ B7 i?2 bi+F Bb 7bi2` M/ 2bB2` iQ KM;2- r?v /Q r2 M22/ i?2 ?2T\ #B; `2bQM Bb
i?i ai+F@HHQ+iBQM HQM2 K2Mb vQm QMHv ?p2 GA6P b2KMiB+b 7Q` `2+HBKBM; biQ`;2X >2T@
HHQ+iBQM Bb bi`B+iHv KQ`2 ;2M2`H- HHQrBM; biQ`;2 iQ #2 iF2M 7`QK M/ `2im`M2/ iQ i?2 TQQH BM
`#Bi``v Q`/2`- #mi i +QKTH2tBiv +QbiX
:2M2`HHv- vQm b?QmH/ T`272` bi+F HHQ+iBQM- M/ bQ- _mbi bi+F@HHQ+i2b #v /27mHiX h?2 GA6P
KQ/2H Q7 i?2 bi+F Bb bBKTH2`- i 7mM/K2MiH H2p2HX h?Bb ?b irQ #B; BKT+ib, `mMiBK2 2{+B2M+v
M/ b2KMiB+ BKT+iX
_mMiBK2 1{+B2M+vX
JM;BM; i?2 K2KQ`v 7Q` i?2 bi+F Bb i`BpBH, h?2 K+?BM2 Dmbi BM+`2K2Mib Q` /2+`2K2Mib
bBM;H2 pHm2- i?2 bQ@+HH2/ bi+F TQBMi2`X JM;BM; K2KQ`v 7Q` i?2 ?2T Bb MQM@i`BpBH, ?2T@
dy
HHQ+i2/ K2KQ`v Bb 7`22/ i `#Bi``v TQBMib- M/ 2+? #HQ+F Q7 ?2T@HHQ+i2/ K2KQ`v +M #2
Q7 `#Bi``v bBx2- i?2 K2KQ`v KM;2` Kmbi ;2M2`HHv rQ`F Km+? ?`/2` iQ B/2MiB7v K2KQ`v 7Q`
`2mb2X
A7 vQm/ HBF2 iQ /Bp2 BMiQ i?Bb iQTB+ BM ;`2i2` /2iBH- i?Bb TT2`j Bb ;`2i BMi`Q/m+iBQMX
a2KMiB+ BKT+i
ai+F@HHQ+iBQM BKT+ib i?2 _mbi HM;m;2 Bib2H7- M/ i?mb i?2 /2p2HQT2`b K2MiH KQ/2HX h?2
GA6P b2KMiB+b Bb r?i /`Bp2b ?Qr i?2 _mbi HM;m;2 ?M/H2b miQKiB+ K2KQ`v KM;2K2MiX
1p2M i?2 /2HHQ+iBQM Q7 mMB[m2Hv@QrM2/ ?2T@HHQ+i2/ #Qt +M #2 /`Bp2M #v i?2 bi+F@#b2/
GA6P b2KMiB+b- b /Bb+mbb2/ i?`Qm;?Qmi i?Bb +?Ti2`X h?2 ~2tB#BHBiv UBX2X 2tT`2bbBp2M2bbV Q7 MQM
GA6P@b2KMiB+b K2Mb i?i BM ;2M2`H i?2 +QKTBH2` +MMQi miQKiB+HHv BM72` i +QKTBH2@iBK2
r?2`2 K2KQ`v b?QmH/ #2 7`22/c Bi ?b iQ `2Hv QM /vMKB+ T`QiQ+QHb- TQi2MiBHHv 7`QK QmibB/2 i?2
HM;m;2 Bib2H7- iQ /`Bp2 /2HHQ+iBQM U`272`2M+2 +QmMiBM;- b mb2/ #v Rc<T> M/ Arc<T>- Bb QM2
2tKTH2 Q7 i?BbVX
q?2M iF2M iQ i?2 2ti`2K2- i?2 BM+`2b2/ 2tT`2bbBp2 TQr2` Q7 ?2T HHQ+iBQM +QK2b i i?2
+Qbi Q7 2Bi?2` bB;MB}+Mi `mMiBK2 bmTTQ`i U2X;X BM i?2 7Q`K Q7 ;`#;2 +QHH2+iQ`V Q` bB;MB}+Mi
T`Q;`KK2` 2zQ`i UBM i?2 7Q`K Q7 2tTHB+Bi K2KQ`v KM;2K2Mi +HHb i?i `2[mB`2 p2`B}+iBQM
MQi T`QpB/2/ #v i?2 _mbi +QKTBH2`VX
9Xk
h2biBM;
S`Q;`K i2biBM; +M #2 p2`v 2z2+iBp2 rv iQ b?Qr i?2 T`2b2M+2 Q7 #m;b- #mi Bi Bb
?QT2H2bbHv BM/2[mi2 7Q` b?QrBM; i?2B` #b2M+2X
1/b;2` qX .BDFbi`- h?2 >mK#H2 S`Q;`KK2` URNdkV
G2ib iHF #Qmi ?Qr iQ i2bi _mbi +Q/2X q?i r2 rBHH MQi #2 iHFBM; #Qmi Bb i?2 `B;?i rv iQ
i2bi _mbi +Q/2X h?2`2 `2 KMv b+?QQHb Q7 i?Qm;?i `2;`/BM; i?2 `B;?i M/ r`QM; rv iQ r`Bi2
i2bibX HH Q7 i?2b2 TT`Q+?2b mb2 i?2 bK2 #bB+ iQQHb- M/ bQ r2HH b?Qr vQm i?2 bvMit 7Q`
mbBM; i?2KX
9XkXR h?2
test
ii`B#mi2
test
*`;Q rBHH miQKiB+HHv ;2M2`i2 bBKTH2 i2bi r?2M vQm KF2 M2r T`QD2+iX >2`2b i?2 +QMi2Mib
Q7 src/lib.rs,
j ?iiT,ffrrrX+bXMQ`i?r2bi2`MX2/mfT/BM/fB+b+Hbbf/Q+f/bXT/7
9XkX h1ahAL:
dR
#[test]
fn it_works() {
}
LQi2 i?2 #[test]X h?Bb ii`B#mi2 BM/B+i2b i?i i?Bb Bb i2bi 7mM+iBQMX Ai +m``2MiHv ?b MQ #Q/vX
h?ib ;QQ/ 2MQm;? iQ Tbb5 q2 +M `mM i?2 i2bib rBi? cargo test,
$ cargo test
Compiling adder v0.0.1 (file:///home/you/projects/adder)
Running target/adder-91b3e234d4ed382a
running 1 test
test it_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
Doc-tests adder
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured
*`;Q +QKTBH2/ M/ `M Qm` i2bibX h?2`2 `2 irQ b2ib Q7 QmiTmi ?2`2, QM2 7Q` i?2 i2bi r2 r`Qi2M/ MQi?2` 7Q` /Q+mK2MiiBQM i2bibX q2HH iHF #Qmi i?Qb2 Hi2`X 6Q` MQr- b22 i?Bb HBM2,
test it_works ... ok
LQi2 i?2
it_worksX
fn it_works() {
aQ r?v /Q2b Qm` /Q@MQi?BM; i2bi Tbb\ Mv i2bi r?B+? /Q2bMi
/Q2b panic! 7BHbX G2ib KF2 Qm` i2bi 7BH,
panic!
#[test]
fn it_works() {
assert!(false);
}
Bb K+`Q T`QpB/2/ #v _mbi r?B+? iF2b QM2 `;mK2Mi, B7 i?2 `;mK2Mi Bb true- MQi?BM;
?TT2MbX A7 i?2 `;mK2Mi Bb 7Hb2- Bi panic!bX G2ib `mM Qm` i2bib ;BM,
assert!
dk
$ cargo test
Compiling adder v0.0.1 (file:///home/you/projects/adder)
Running target/adder-91b3e234d4ed382a
running 1 test
test it_works ... FAILED
failures:
---- it_works stdout ---thread 'it_works' panicked at 'assertion failed: false', /home/steve/tmp/adder/
src/lib.rs:3
failures:
it_works
test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured
thread '<main>' panicked at 'Some tests failed', /home/steve/src/rust/src/libtest/lib.r
s:247
cargo test
should_panic,
#[test]
#[should_panic]
fn it_works() {
assert!(false);
}
panic!
9XkX h1ahAL:
dj
$ cargo test
Compiling adder v0.0.1 (file:///home/you/projects/adder)
Running target/adder-91b3e234d4ed382a
running 1 test
test it_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
Doc-tests adder
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured
assert_eq!-
#[test]
#[should_panic]
fn it_works() {
assert_eq!("Hello", "world");
}
should_panic
ii`B#mi2- Bi Tbb2b,
$ cargo test
Compiling adder v0.0.1 (file:///home/you/projects/adder)
Running target/adder-91b3e234d4ed382a
running 1 test
test it_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
Doc-tests adder
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured
i2bib +M #2 7`;BH2- b Bib ?`/ iQ ;m`Mi22 i?i i?2 i2bi /B/Mi 7BH 7Q` M mM2t@
T2+i2/ `2bQMX hQ ?2HT rBi? i?Bb- M QTiBQMH expected T`K2i2` +M #2 //2/ iQ i?2 should_panic ii`B#mi2X h?2 i2bi ?`M2bb rBHH KF2 bm`2 i?i i?2 7BHm`2 K2bb;2 +QMiBMb i?2 T`QpB/2/
i2tiX b72` p2`bBQM Q7 i?2 2tKTH2 #Qp2 rQmH/ #2,
should_panic
#[test]
#[should_panic(expected = "assertion failed")]
fn it_works() {
d9
h?ib HH i?2`2 Bb iQ i?2 #bB+b5 G2ib r`Bi2 QM2 `2H i2bi,
pub fn add_two(a: i32) -> i32 {
a + 2
}
#[test]
fn it_works() {
assert_eq!(4, add_two(2));
}
h?Bb Bb p2`v +QKKQM mb2 Q7 assert_eq!, +HH bQK2 7mM+iBQM rBi? bQK2 FMQrM `;mK2Mib M/
+QKT`2 Bi iQ i?2 2tT2+i2/ QmiTmiX
9XkXk h?2
tests
KQ/mH2
h?2`2 Bb QM2 rv BM r?B+? Qm` 2tBbiBM; 2tKTH2 Bb MQi B/BQKiB+, Bib KBbbBM; i?2
h?2 B/BQKiB+ rv Q7 r`BiBM; Qm` 2tKTH2 HQQFb HBF2 i?Bb,
tests
KQ/mH2X
h?2`2b 72r +?M;2b ?2`2X h?2 }`bi Bb i?2 BMi`Q/m+iBQM Q7 mod tests rBi? cfg ii`B#mi2X
h?2 KQ/mH2 HHQrb mb iQ ;`QmT HH Q7 Qm` i2bib iQ;2i?2`- M/ iQ HbQ /2}M2 ?2HT2` 7mM+iBQMb B7
M22/2/- i?i /QMi #2+QK2 T`i Q7 i?2 `2bi Q7 Qm` +`i2X h?2 cfg ii`B#mi2 QMHv +QKTBH2b Qm`
i2bi +Q/2 B7 r2`2 +m``2MiHv i`vBM; iQ `mM i?2 i2bibX h?Bb +M bp2 +QKTBH2 iBK2- M/ HbQ 2Mbm`2b
i?i Qm` i2bib `2 2MiB`2Hv H27i Qmi Q7 MQ`KH #mBH/X
h?2 b2+QM/ +?M;2 Bb i?2 use /2+H`iBQMX "2+mb2 r2`2 BM M BMM2` KQ/mH2- r2 M22/ iQ #`BM;
Qm` i2bi 7mM+iBQM BMiQ b+QT2X h?Bb +M #2 MMQvBM; B7 vQm ?p2 H`;2 KQ/mH2- M/ bQ i?Bb Bb
+QKKQM mb2 Q7 i?2 glob 72im`2X G2ib +?M;2 Qm` src/lib.rs iQ KF2 mb2 Q7 Bi,
9XkX h1ahAL:
d8
use
$ cargo test
Updating registry `https://github.com/rust-lang/crates.io-index`
Compiling adder v0.0.1 (file:///home/you/projects/adder)
Running target/adder-91b3e234d4ed382a
running 1 test
test tests::it_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
Doc-tests adder
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured
Ai rQ`Fb5
h?2 +m``2Mi +QMp2MiBQM Bb iQ mb2 i?2 tests KQ/mH2 iQ ?QH/ vQm` mMBi@bivH2 i2bibX Mvi?BM; i?i
Dmbi i2bib QM2 bKHH #Bi Q7 7mM+iBQMHBiv KF2b b2Mb2 iQ ;Q ?2`2X "mi r?i #Qmi BMi2;`iBQM@
bivH2 i2bib BMbi2/\ 6Q` i?i- r2 ?p2 i?2 tests /B`2+iQ`v
9XkXj
h?2
tests
/B`2+iQ`v
hQ r`Bi2 M BMi2;`iBQM i2bi- H2ib KF2 tests /B`2+iQ`v- M/ Tmi tests/lib.rs }H2 BMbB/2- rBi?
i?Bb b Bib +QMi2Mib,
extern crate adder;
#[test]
fn it_works() {
de
h?Bb HQQFb bBKBH` iQ Qm` T`2pBQmb i2bib- #mi bHB;?iHv /Bz2`2MiX q2 MQr ?p2 M extern crate
adder i i?2 iQTX h?Bb Bb #2+mb2 i?2 i2bib BM i?2 tests /B`2+iQ`v `2 M 2MiB`2Hv b2T`i2
+`i2- M/ bQ r2 M22/ iQ BKTQ`i Qm` HB#``vX h?Bb Bb HbQ r?v tests Bb bmBi#H2 TH+2 iQ r`Bi2
BMi2;`iBQM@bivH2 i2bib, i?2v mb2 i?2 HB#``v HBF2 Mv Qi?2` +QMbmK2` Q7 Bi rQmH/X
G2ib `mM i?2K,
$ cargo test
Compiling adder v0.0.1 (file:///home/you/projects/adder)
Running target/adder-91b3e234d4ed382a
running 1 test
test tests::it_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
Running target/lib-c18e7d3494509e74
running 1 test
test it_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
Doc-tests adder
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured
LQr r2 ?p2 i?`22 b2+iBQMb, Qm` T`2pBQmb i2bi Bb HbQ `mM- b r2HH b Qm` M2r QM2X
h?ib HH i?2`2 Bb iQ i?2
i?BM; Bb 7Q+mb2/ QM i2bibX
tests
/B`2+iQ`vX h?2
tests
9XkX h1ahAL:
dd
//! # Examples
//!
//! ```
//! assert_eq!(4, adder::add_two(2));
//! ```
/// This function adds two to its argument.
///
/// # Examples
///
/// ```
/// use adder::add_two;
///
/// assert_eq!(4, add_two(2));
/// ```
pub fn add_two(a: i32) -> i32 {
a + 2
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
assert_eq!(4, add_two(2));
}
}
LQi2 i?2 KQ/mH2@H2p2H /Q+mK2MiiBQM rBi? //! M/ i?2 7mM+iBQM@H2p2H /Q+mK2MiiBQM rBi? ///X
_mbib /Q+mK2MiiBQM bmTTQ`ib J`F/QrM BM +QKK2Mib- M/ bQ i`BTH2 ;`p2b K`F +Q/2 #HQ+FbX
Ai Bb +QMp2MiBQMH iQ BM+Hm/2 i?2 # Examples b2+iBQM- 2t+iHv HBF2 i?i- rBi? 2tKTH2b 7QHHQrBM;X
G2ib `mM i?2 i2bib ;BM,
$ cargo test
Compiling adder v0.0.1 (file:///home/steve/tmp/adder)
Running target/adder-91b3e234d4ed382a
running 1 test
test tests::it_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
Running target/lib-c18e7d3494509e74
running 1 test
test it_works ... ok
d3
LQr r2 ?p2 HH i?`22 FBM/b Q7 i2bib `mMMBM;5 LQi2 i?2 MK2b Q7 i?2 /Q+mK2MiiBQM i2bib, i?2 _0
Bb ;2M2`i2/ 7Q` i?2 KQ/mH2 i2bi- M/ add_two_0 7Q` i?2 7mM+iBQM i2biX h?2b2 rBHH miQ BM+`2K2Mi
rBi? MK2b HBF2 add_two_1 b vQm // KQ`2 2tKTH2bX
9Xj
*QM/BiBQMH *QKTBHiBQM
_mbi ?b bT2+BH ii`B#mi2- #[cfg]- r?B+? HHQrb vQm iQ +QKTBH2 +Q/2 #b2/ QM ~; Tbb2/ iQ
i?2 +QKTBH2`X Ai ?b irQ 7Q`Kb,
#[cfg(foo)]
#[cfg(bar = "baz")]
b 7Q` ?Qr iQ 2M#H2 Q` /Bb#H2 i?2b2 brBi+?2b- B7 vQm`2 mbBM; *`;Q- i?2v ;2i b2i BM i?2 [features]
b2+iBQM9 Q7 vQm` Cargo.toml,
[features]
# no features by default
default = []
# The
secure-password = ["bcrypt"]
9 ?iiT,ff/Q+X+`i2bXBQfKMB72biX?iKHOi?2@&('72im`2b&)'@b2+iBQM
9X9X .P*lJ1LhhAPL
dN
rustc,
--cfg feature="${feature_name}"
h?2 bmK Q7 i?2b2 cfg ~;b rBHH /2i2`KBM2 r?B+? QM2b ;2i +iBpi2/- M/ i?2`27Q`2- r?B+? +Q/2
;2ib +QKTBH2/X G2ib iF2 i?Bb +Q/2,
#[cfg(feature = "foo")]
mod foo {
}
A7 r2 +QKTBH2 Bi rBi? cargo build --features "foo"- Bi rBHH b2M/ i?2 --cfg feature="foo" ~; iQ
rustc- M/ i?2 QmiTmi rBHH ?p2 i?2 mod foo BM BiX A7 r2 +QKTBH2 Bi rBi? `2;mH` cargo buildMQ 2ti` ~;b ;2i Tbb2/ QM- M/ bQ- MQ foo KQ/mH2 rBHH 2tBbiX
9XjXR
+7;nii`
cfg
p`B#H2 rBi?
cfg_attr,
#[cfg_attr(a, b)]
9XjXk
#[b]
B7
Bb b2i #v
cfg
+7;5
h?2 cfg! bvMit 2ti2MbBQM Ub2+iBQM eXR- T;2 k9RV H2ib vQm mb2 i?2b2 FBM/b Q7 ~;b 2Hb2r?2`2 BM
vQm` +Q/2- iQQ,
if cfg!(target_os = "macos") || cfg!(target_os = "ios") {
println!("Think Different!");
}
9X9
true
Q`
false
.Q+mK2MiiBQM
.Q+mK2MiiBQM Bb M BKTQ`iMi T`i Q7 Mv bQ7ir`2 T`QD2+i- M/ Bib }`bi@+Hbb BM _mbiX G2ib
iHF #Qmi i?2 iQQHBM; _mbi ;Bp2b vQm iQ /Q+mK2Mi vQm` T`QD2+iX
#Qmi
rustdoc
rustdoc-
rustdoc
Bb HbQ
.Q+mK2MiiBQM +M #2 ;2M2`i2/ BM irQ rvb, 7`QK bQm`+2 +Q/2- M/ 7`QK biM/HQM2 J`F/QrM
}H2bX
3y
h?Bb +Q/2 ;2M2`i2b /Q+mK2MiiBQM i?i HQQFb HBF2 i?Bb8 X Ap2 H27i i?2 BKTH2K2MiiBQM Qmi- rBi?
`2;mH` +QKK2Mi BM Bib TH+2X h?ib i?2 }`bi i?BM; iQ MQiB+2 #Qmi i?Bb MMQiiBQM, Bi mb2b
///- BMbi2/ Q7 //X h?2 i`BTH2 bHb? BM/B+i2b /Q+mK2MiiBQM +QKK2MiX
.Q+mK2MiiBQM +QKK2Mib `2 r`Bii2M BM J`F/QrMX
_mbi F22Tb i`+F Q7 i?2b2 +QKK2Mib- M/ mb2b i?2K r?2M ;2M2`iBM; /Q+mK2MiiBQMX h?Bb Bb
BKTQ`iMi r?2M /Q+mK2MiBM; i?BM;b HBF2 2MmKb,
/// The `Option` type. See [the module level documentation](../) for more.
enum Option<T> {
/// No value
None,
/// Some value `T`
Some(T),
}
9X9X .P*lJ1LhhAPL
3R
h?Bb mM7Q`imMi2 2``Q`e Bb +Q``2+i, /Q+mK2MiiBQM +QKK2Mib TTHv iQ i?2 i?BM; 7i2` i?2K- M/
i?2`2b MQ i?BM; 7i2` i?i Hbi +QKK2MiX
q`BiBM; /Q+mK2MiiBQM +QKK2Mib Mvrv- H2ib +Qp2` 2+? T`i Q7 i?Bb +QKK2Mi BM /2iBH,
/// Constructs a new `Rc<T>`.
# fn foo() {}
h?2 }`bi HBM2 Q7 /Q+mK2MiiBQM +QKK2Mi b?QmH/ #2 b?Q`i bmKK`v Q7 Bib 7mM+iBQMHBivX PM2
b2Mi2M+2X Cmbi i?2 #bB+bX >B;? H2p2HX
///
/// Other details about constructing `Rc<T>`s, maybe describing complicated
/// semantics, maybe additional options, all kinds of stuff.
///
# fn foo() {}
Pm` Q`B;BMH 2tKTH2 ?/ Dmbi bmKK`v HBM2- #mi B7 r2 ?/ KQ`2 i?BM;b iQ bv- r2 +QmH/ ?p2
//2/ KQ`2 2tTHMiBQM BM M2r T`;`T?X
aT2+BH b2+iBQMb
/// # Examples
# fn foo() {}
L2ti- `2 bT2+BH b2+iBQMbX h?2b2 `2 BM/B+i2/ rBi? ?2/2`- #X h?2`2 `2 i?`22 FBM/b Q7 ?2/2`b
i?i `2 +QKKQMHv mb2/X h?2v `2Mi bT2+BH bvMit- Dmbi +QMp2MiBQM- 7Q` MQrX
/// # Panics
# fn foo() {}
lM`2+Qp2`#H2 KBbmb2b Q7 7mM+iBQM UBX2X T`Q;`KKBM; 2``Q`bV BM _mbi `2 mbmHHv BM/B+i2/ #v
TMB+b- r?B+? FBHH i?2 r?QH2 +m``2Mi i?`2/ i i?2 p2`v H2biX A7 vQm` 7mM+iBQM ?b MQM@i`BpBH
+QMi`+i HBF2 i?Bb- i?i Bb /2i2+i2/f2M7Q`+2/ #v TMB+b- /Q+mK2MiBM; Bi Bb p2`v BKTQ`iMiX
/// # Failures
# fn foo() {}
A7 vQm` 7mM+iBQM Q` K2i?Q/ `2im`Mb Result<T, E>- i?2M /2b+`B#BM; i?2 +QM/BiBQMb mM/2` r?B+? Bi
`2im`Mb Err(E) Bb MB+2 i?BM; iQ /QX h?Bb Bb bHB;?iHv H2bb BKTQ`iMi i?M Panics- #2+mb2 7BHm`2
Bb 2M+Q/2/ BMiQ i?2 ivT2 bvbi2K- #mi Bib biBHH ;QQ/ i?BM; iQ /QX
/// # Safety
# fn foo() {}
e ?iiTb,ff;Bi?m#X+QKf`mbi@HM;f`mbifBbbm2bfkk89d
3k
A7 vQm` 7mM+iBQM Bb
?QH/BM;X
vQm b?QmH/ 2tTHBM r?B+? BMp`BMib i?2 +HH2` Bb `2bTQMbB#H2 7Q` mT@
/// # Examples
///
/// ```
/// use std::rc::Rc;
///
/// let five = Rc::new(5);
/// ```
# fn foo() {}
h?B`/- ExamplesX AM+Hm/2 QM2 Q` KQ`2 2tKTH2b Q7 mbBM; vQm` 7mM+iBQM Q` K2i?Q/- M/ vQm` mb2`b
rBHH HQp2 vQm 7Q` BiX h?2b2 2tKTH2b ;Q BMbB/2 Q7 +Q/2 #HQ+F MMQiiBQMb- r?B+? r2HH iHF #Qmi
BM KQK2Mi- M/ +M ?p2 KQ`2 i?M QM2 b2+iBQM,
/// # Examples
///
/// Simple `&str` patterns:
///
/// ```
/// let v: Vec<&str> = "Mary had a little lamb".split(' ').collect();
/// assert_eq!(v, vec!["Mary", "had", "a", "little", "lamb"]);
/// ```
///
/// More complex patterns with a lambda:
///
/// ```
/// let v: Vec<&str> = "abc1def2ghi".split(|c: char| c.is_numeric()).collect();
/// assert_eq!(v, vec!["abc", "def", "ghi"]);
/// ```
# fn foo() {}
A7 vQm rMi bQK2i?BM; i?ib MQi _mbi +Q/2- vQm +M // M MMQiiBQM,
/// ```c
/// printf("Hello, world\n");
/// ```
# fn foo() {}
9X9X .P*lJ1LhhAPL
3j
h?Bb rBHH ?B;?HB;?i ++Q`/BM; iQ r?i2p2` HM;m;2 vQm`2 b?QrBM; QzX A7 vQm`2 Dmbi b?QrBM;
THBM i2ti- +?QQb2 textX
Aib BKTQ`iMi iQ +?QQb2 i?2 +Q``2+i MMQiiBQM ?2`2- #2+mb2 rustdoc mb2b Bi BM M BMi2`2biBM;
rv, Ai +M #2 mb2/ iQ +imHHv i2bi vQm` 2tKTH2b- bQ i?i i?2v /QMi ;2i Qmi Q7 /i2X A7 vQm
?p2 bQK2 * +Q/2 #mi rustdoc i?BMFb Bib _mbi #2+mb2 vQm H27i Qz i?2 MMQiiBQM- rustdoc rBHH
+QKTHBM r?2M i`vBM; iQ ;2M2`i2 i?2 /Q+mK2MiiBQMX
.Q+mK2MiiBQM b i2bib
G2ib /Bb+mbb Qm` bKTH2 2tKTH2 /Q+mK2MiiBQM,
/// ```
/// println!("Hello, world");
/// ```
# fn foo() {}
uQmHH MQiB+2 i?i vQm /QMi M22/ fn main() Q` Mvi?BM; ?2`2X rustdoc rBHH miQKiB+HHv //
KBMUV r`TT2` `QmM/ vQm` +Q/2- M/ BM i?2 `B;?i TH+2X 6Q` 2tKTH2,
/// ```
/// use std::rc::Rc;
///
/// let five = Rc::new(5);
/// ```
# fn foo() {}
aQK2iBK2b- i?Bb BbMi 2MQm;?- i?Qm;?X 6Q` 2tKTH2- HH Q7 i?2b2 +Q/2 bKTH2b rBi?
#22M iHFBM; #Qmi\ h?2 `r i2ti,
///
r2p2
39
u2b- i?ib `B;?i, vQm +M // HBM2b i?i bi`i rBi? #- M/ i?2v rBHH #2 ?B//2M 7`QK i?2 QmiTmi#mi rBHH #2 mb2/ r?2M +QKTBHBM; vQm` +Q/2X uQm +M mb2 i?Bb iQ vQm` /pMi;2X AM i?Bb +b2/Q+mK2MiiBQM +QKK2Mib M22/ iQ TTHv iQ bQK2 FBM/ Q7 7mM+iBQM- bQ B7 A rMi iQ b?Qr vQm Dmbi
/Q+mK2MiiBQM +QKK2Mi- A M22/ iQ // HBiiH2 7mM+iBQM /2}MBiBQM #2HQr BiX i i?2 bK2 iBK2Bib Dmbi i?2`2 iQ biBb7v i?2 +QKTBH2`- bQ ?B/BM; Bi KF2b i?2 2tKTH2 KQ`2 +H2`X uQm +M mb2
i?Bb i2+?MB[m2 iQ 2tTHBM HQM;2` 2tKTH2b BM /2iBH- r?BH2 biBHH T`2b2`pBM; i?2 i2bi#BHBiv Q7 vQm`
/Q+mK2MiiBQMX 6Q` 2tKTH2- i?Bb +Q/2,
let x = 5;
let y = 6;
println!("{}", x + y);
iQ }p2,
let x = 5;
# let y = 6;
# println!("{}", x + y);
L2ti- r2 b2i
iQ bBt,
# let x = 5;
let y = 6;
# println!("{}", x + y);
M/ y,
# let x = 5;
# let y = 6;
println!("{}", x + y);
iQ }p2,
let x = 5;
# let y = 6;
# println!("{}", x + y);
9X9X .P*lJ1LhhAPL
L2ti- r2 b2i
38
iQ bBt,
# let x = 5;
let y = 6;
# println!("{}", x + y);
M/ y,
# let x = 5;
# let y = 6;
println!("{}", x + y);
"v `2T2iBM; HH T`ib Q7 i?2 2tKTH2- vQm +M 2Mbm`2 i?i vQm` 2tKTH2 biBHH +QKTBH2b- r?BH2
QMHv b?QrBM; i?2 T`ib i?i `2 `2H2pMi iQ i?i T`i Q7 vQm` 2tTHMiBQMX
.Q+mK2MiBM; K+`Qb
Math is broken.);
/// # }
/// ```
///
/// ```should_panic
/// # #[macro_use] extern crate foo;
/// # fn main() {
/// panic_unless!(true == false,
Im broken.);
/// # }
/// ```
#[macro_export]
macro_rules! panic_unless {
($condition:expr, $($rest:expr),+) => ({ if ! $condition { panic!($($rest),+); } });
}
# fn main() {}
uQmHH MQi2 i?`22 i?BM;b, r2 M22/ iQ // Qm` QrM extern crate HBM2- bQ i?i r2 +M // i?2
#[macro_use] ii`B#mi2X a2+QM/- r2HH M22/ iQ // Qm` QrM main() b r2HHX 6BMHHv- Dm/B+BQmb
mb2 Q7 # iQ +QKK2Mi Qmi i?Qb2 irQ i?BM;b- bQ i?2v /QMi b?Qr mT BM i?2 QmiTmiX
_mMMBM; /Q+mK2MiiBQM i2bib hQ `mM i?2 i2bib- 2Bi?2`
3e
h?ib `B;?i- cargo test i2bib 2K#2//2/ /Q+mK2MiiBQM iQQX >Qr2p2`- cargo test rBHH MQi i2bi
#BM`v +`i2b- QMHv HB#``v QM2bX h?Bb Bb /m2 iQ i?2 rv rustdoc rQ`Fb, Bi HBMFb ;BMbi i?2 HB#``v
iQ #2 i2bi2/- #mi rBi? #BM`v- i?2`2b MQi?BM; iQ HBMF iQX
h?2`2 `2 72r KQ`2 MMQiiBQMb i?i `2 mb27mH iQ ?2HT rustdoc /Q i?2 `B;?i i?BM; r?2M i2biBM;
vQm` +Q/2,
/// ```ignore
/// fn foo() {
/// ```
# fn foo() {}
h?2 ignore /B`2+iBp2 i2HHb _mbi iQ B;MQ`2 vQm` +Q/2X h?Bb Bb HKQbi M2p2` r?i vQm rMi- b Bib
i?2 KQbi ;2M2`B+X AMbi2/- +QMbB/2` MMQiiBM; Bi rBi? text B7 Bib MQi +Q/2- Q` mbBM; #b iQ ;2i
rQ`FBM; 2tKTH2 i?i QMHv b?Qrb i?2 T`i vQm +`2 #QmiX
/// ```should_panic
/// assert!(false);
/// ```
# fn foo() {}
should_panic
i2HHb rustdoc i?i i?2 +Q/2 b?QmH/ +QKTBH2 +Q``2+iHv- #mi MQi +imHHv Tbb b i2biX
/// ```no_run
/// loop {
///
println!("Hello, world");
/// }
/// ```
# fn foo() {}
h?2 no_run ii`B#mi2 rBHH +QKTBH2 vQm` +Q/2- #mi MQi `mM BiX h?Bb Bb BKTQ`iMi 7Q` 2tKTH2b bm+?
b >2`2b ?Qr iQ bi`i mT M2irQ`F b2`pB+2- r?B+? vQm rQmH/ rMi iQ KF2 bm`2 +QKTBH2- #mi
KB;?i `mM BM M BM}MBi2 HQQT5
.Q+mK2MiBM; KQ/mH2b _mbi ?b MQi?2` FBM/ Q7 /Q+ +QKK2Mi/Q+mK2Mi i?2 M2ti Bi2K- #mi i?2 2M+HQbBM; Bi2KX AM Qi?2` rQ`/b,
mod foo {
//! This is documentation for the `foo` module.
//!
//! # Examples
// ...
}
//!X
9X9X .P*lJ1LhhAPL
3d
h?Bb Bb r?2`2 vQmHH b22 //! mb2/ KQbi Q7i2M, 7Q` KQ/mH2 /Q+mK2MiiBQMX A7 vQm ?p2 KQ/mH2
BM foo.rs- vQmHH Q7i2M QT2M Bib +Q/2 M/ b22 i?Bb,
//! A module for using `foo`s.
//!
//! The `foo` module contains a lot of useful functionality blah blah blah
.Q+mK2MiiBQM +QKK2Mi bivH2 *?2+F Qmi _6* 8y8d 7Q` 7mHH +QMp2MiBQMb `QmM/ i?2 bivH2
M/ 7Q`Ki Q7 /Q+mK2MiiBQMX
Pi?2` /Q+mK2MiiBQM
HH Q7 i?Bb #2?pBQ` rQ`Fb BM MQM@_mbi bQm`+2 }H2b iQQX "2+mb2 +QKK2Mib `2 r`Bii2M BM J`F@
/QrM- i?2v`2 Q7i2M .md }H2bX
q?2M vQm r`Bi2 /Q+mK2MiiBQM BM J`F/QrM }H2b- vQm /QMi M22/ iQ T`2}t i?2 /Q+mK2MiiBQM
rBi? +QKK2MibX 6Q` 2tKTH2,
/// # Examples
///
/// ```
/// use std::rc::Rc;
///
/// let five = Rc::new(5);
/// ```
# fn foo() {}
Bb Dmbi
# Examples
mb2 bi/,,`+,,_+c
H2i }p2 4 _+,,M2rU8Vc
r?2M Bib BM J`F/QrM }H2X h?2`2 Bb QM2 r`BMFH2 i?Qm;?, J`F/QrM }H2b M22/ iQ ?p2 iBiH2
HBF2 i?Bb,
% The title
This is the example documentation.
h?Bb
d ?iiTb,ff;Bi?m#X+QKf`mbi@HM;f`7+bf#HQ#fKbi2`fi2tify8y8@TB@+QKK2Mi@+QMp2MiBQMbXK/
33
doc
uQm rQMi Q7i2M b22 i?Bb ii`B#mi2 mb2/ 7Q` r`BiBM; /Q+mK2MiiBQM- #mi Bi +M #2 mb27mH r?2M
+?M;BM; bQK2 QTiBQMb- Q` r?2M r`BiBM; K+`QX
_2@2tTQ`ib
rustdoc
h?Bb rBHH +`2i2 /Q+mK2MiiBQM 7Q` #` #Qi? BMbB/2 i?2 /Q+mK2MiiBQM 7Q` i?2 +`i2 foo- b r2HH
b i?2 /Q+mK2MiiBQM 7Q` vQm` +`i2X Ai rBHH mb2 i?2 bK2 /Q+mK2MiiBQM BM #Qi? TH+2bX
h?Bb #2?pBQ` +M #2 bmTT`2bb2/ rBi?
no_inline,
*QMi`QHHBM; >hJG uQm +M +QMi`QH 72r bT2+ib Q7 i?2 >hJG i?i
i?`Qm;? i?2 #![doc] p2`bBQM Q7 i?2 ii`B#mi2,
rustdoc
;2M2`i2b
#![doc(html_logo_url = "http://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
html_favicon_url = "http://www.rust-lang.org/favicon.ico",
html_root_url = "http://doc.rust-lang.org/")];
h?Bb b2ib 72r /Bz2`2Mi QTiBQMb- rBi? HQ;Q- 7pB+QM- M/ `QQi l_GX
9X8X Ah1_hP_a
3N
:2M2`iBQM QTiBQMb
rustdoc
HbQ +QMiBMb 72r Qi?2` QTiBQMb QM i?2 +QKKM/ HBM2- 7Q` 7m`i?2` +mbiQKBxiBQM,
--html-in-header FILE,
--html-before-content FILE,
b2+iBQMX
<head>...</head>
9X8
Ai2`iQ`b
for
for x in 0..10 {
println!("{}", x);
}
LQr i?i vQm FMQr KQ`2 _mbi- r2 +M iHF BM /2iBH #Qmi ?Qr i?Bb rQ`FbX _M;2b Ui?2 0..10V
`2 Bi2`iQ`bX M Bi2`iQ` Bb bQK2i?BM; i?i r2 +M +HH i?2 .next() K2i?Q/ QM `2T2i2/Hv- M/
Bi ;Bp2b mb b2[m2M+2 Q7 i?BM;bX
GBF2 i?Bb,
let mut range = 0..10;
loop {
match range.next() {
Some(x) => {
println!("{}", x);
},
None => { break }
}
}
q2 KF2 Kmi#H2 #BM/BM; iQ i?2 `M;2- r?B+? Bb Qm` Bi2`iQ`X q2 i?2M loop- rBi? M BMM2`
matchX h?Bb match Bb mb2/ QM i?2 `2bmHi Q7 range.next()- r?B+? ;Bp2b mb `272`2M+2 iQ i?2 M2ti
Ny
pHm2 Q7 i?2 Bi2`iQ`X next `2im`Mb M Option<i32>- BM i?Bb +b2- r?B+? rBHH #2 Some(i32) r?2M r2
?p2 pHm2 M/ None QM+2 r2 `mM QmiX A7 r2 ;2i Some(i32)- r2 T`BMi Bi Qmi- M/ B7 r2 ;2i Noner2 break Qmi Q7 i?2 HQQTX
h?Bb +Q/2 bKTH2 Bb #bB+HHv i?2 bK2 b Qm` for HQQT p2`bBQMX h?2 for HQQT Bb Dmbi ?M/v rv
iQ r`Bi2 i?Bb loopfmatchfbreak +QMbi`m+iX
HQQTb `2Mi i?2 QMHv i?BM; i?i mb2b Bi2`iQ`b- ?Qr2p2`X q`BiBM; vQm` QrM Bi2`iQ` BMpQHp2b
BKTH2K2MiBM; i?2 Iterator i`BiX q?BH2 /QBM; i?i Bb QmibB/2 Q7 i?2 b+QT2 Q7 i?Bb ;mB/2- _mbi
T`QpB/2b MmK#2` Q7 mb27mH Bi2`iQ`b iQ ++QKTHBb? p`BQmb ibFbX "27Q`2 r2 iHF #Qmi i?Qb2r2 b?QmH/ iHF #Qmi _mbi MiB@Tii2`MX M/ i?ib mbBM; `M;2b HBF2 i?BbX
for
u2b- r2 Dmbi iHF2/ #Qmi ?Qr `M;2b `2 +QQHX "mi `M;2b `2 HbQ p2`v T`BKBiBp2X 6Q` 2tKTH2B7 vQm M22/2/ iQ Bi2`i2 Qp2` i?2 +QMi2Mib Q7 p2+iQ`- vQm Kv #2 i2KTi2/ iQ r`Bi2 i?Bb,
let nums = vec![1, 2, 3];
for i in 0..nums.len() {
println!("{}", nums[i]);
}
h?Bb Bb bi`B+iHv rQ`b2 i?M mbBM; M +imH Bi2`iQ`X uQm +M Bi2`i2 Qp2` p2+iQ`b /B`2+iHv- bQ r`Bi2
i?Bb,
let nums = vec![1, 2, 3];
for num in &nums {
println!("{}", num);
}
h?2`2 `2 irQ `2bQMb 7Q` i?BbX 6B`bi- i?Bb KQ`2 /B`2+iHv 2tT`2bb2b r?i r2 K2MX q2 Bi2`i2
i?`Qm;? i?2 2MiB`2 p2+iQ`- `i?2` i?M Bi2`iBM; i?`Qm;? BM/2t2b- M/ i?2M BM/2tBM; i?2 p2+iQ`X
a2+QM/- i?Bb p2`bBQM Bb KQ`2 2{+B2Mi, i?2 }`bi p2`bBQM rBHH ?p2 2ti` #QmM/b +?2+FBM; #2+mb2
Bi mb2/ BM/2tBM;- nums[i]X "mi bBM+2 r2 vB2H/ `272`2M+2 iQ 2+? 2H2K2Mi Q7 i?2 p2+iQ` BM im`M
rBi? i?2 Bi2`iQ`- i?2`2b MQ #QmM/b +?2+FBM; BM i?2 b2+QM/ 2tKTH2X h?Bb Bb p2`v +QKKQM rBi?
Bi2`iQ`b, r2 +M B;MQ`2 mMM2+2bb`v #QmM/b +?2+Fb- #mi biBHH FMQr i?i r2`2 b72X
h?2`2b MQi?2` /2iBH ?2`2 i?ib MQi RyyW +H2` #2+mb2 Q7 ?Qr println! rQ`FbX num Bb +imHHv
Q7 ivT2 &i32X h?i Bb- Bib `272`2M+2 iQ M i32- MQi M i32 Bib2H7X println! ?M/H2b i?2
/2`272`2M+BM; 7Q` mb- bQ r2 /QMi b22 BiX h?Bb +Q/2 rQ`Fb }M2 iQQ,
let nums = vec![1, 2, 3];
for num in &nums {
println!("{}", *num);
}
LQr r2`2 2tTHB+BiHv /2`272`2M+BM; numX q?v /Q2b &nums ;Bp2 mb `272`2M+2b\ 6B`biHv- #2+mb2 r2
2tTHB+BiHv bF2/ Bi iQ rBi? &X a2+QM/Hv- B7 Bi ;p2 mb i?2 /i Bib2H7- r2 rQmH/ ?p2 iQ #2 Bib QrM2`r?B+? rQmH/ BMpQHp2 KFBM; +QTv Q7 i?2 /i M/ ;BpBM; mb i?2 +QTvX qBi? `272`2M+2b- r2`2
9X8X Ah1_hP_a
NR
Dmbi #Q``QrBM; `272`2M+2 iQ i?2 /i- M/ bQ Bib Dmbi TbbBM; `272`2M+2- rBi?Qmi M22/BM; iQ
/Q i?2 KQp2X
aQ- MQr i?i r2p2 2bi#HBb?2/ i?i `M;2b `2 Q7i2M MQi r?i vQm rMi- H2ib iHF #Qmi r?i
vQm /Q rMi BMbi2/X
h?2`2 `2 i?`22 #`Q/ +Hbb2b Q7 i?BM;b i?i `2 `2H2pMi ?2`2, Bi2`iQ`b- Bi2`iQ` /Ti2`b- M/
+QMbmK2`bX >2`2b bQK2 /2}MBiBQMb,
Bi2`iQ`b ;Bp2 vQm b2[m2M+2 Q7 pHm2bX
Bi2`iQ` /Ti2`b QT2`i2 QM M Bi2`iQ`- T`Q/m+BM; M2r Bi2`iQ` rBi? /Bz2`2Mi QmiTmi
b2[m2M+2X
+QMbmK2`b QT2`i2 QM M Bi2`iQ`- T`Q/m+BM; bQK2 }MH b2i Q7 pHm2bX
G2ib iHF #Qmi +QMbmK2`b }`bi- bBM+2 vQmp2 H`2/v b22M M Bi2`iQ`- `M;2bX
*QMbmK2`b
+QMbmK2` QT2`i2b QM M Bi2`iQ`- `2im`MBM; bQK2 FBM/ Q7 pHm2 Q` pHm2bX h?2 KQbi +QKKQM
+QMbmK2` Bb collect()X h?Bb +Q/2 /Q2bMi [mBi2 +QKTBH2- #mi Bi b?Qrb i?2 BMi2MiBQM,
let one_to_one_hundred = (1..101).collect();
b vQm +M b22- r2 +HH collect() QM Qm` Bi2`iQ`X collect() iF2b b KMv pHm2b b i?2 Bi2`iQ`
rBHH ;Bp2 Bi- M/ `2im`Mb +QHH2+iBQM Q7 i?2 `2bmHibX aQ r?v rQMi i?Bb +QKTBH2\ _mbi +Mi
/2i2`KBM2 r?i ivT2 Q7 i?BM;b vQm rMi iQ +QHH2+i- M/ bQ vQm M22/ iQ H2i Bi FMQrX >2`2b i?2
p2`bBQM i?i /Q2b +QKTBH2,
let one_to_one_hundred = (1..101).collect::<Vec<i32>>();
A7 vQm `2K2K#2`- i?2 ::<> bvMit HHQrb mb iQ ;Bp2 ivT2 ?BMi- M/ bQ r2 i2HH Bi i?i r2 rMi
p2+iQ` Q7 BMi2;2`bX uQm /QMi Hrvb M22/ iQ mb2 i?2 r?QH2 ivT2- i?Qm;?X lbBM; _ rBHH H2i vQm
T`QpB/2 T`iBH ?BMi,
let one_to_one_hundred = (1..101).collect::<Vec<_>>();
h?Bb bvb *QHH2+i BMiQ Vec<T>- TH2b2- #mi BM72` r?i i?2
ivT2 TH+2?QH/2` 7Q` i?Bb `2bQMX
collect()
Bb 7Q` K2X
find()
Bb bQK2iBK2b +HH2/
Bb QM2,
Nk
iF2b +HQbm`2- M/ rQ`Fb QM `272`2M+2 iQ 2+? 2H2K2Mi Q7 M Bi2`iQ`X h?Bb +HQbm`2 `2im`Mb
B7 i?2 2H2K2Mi Bb i?2 2H2K2Mi r2`2 HQQFBM; 7Q`- M/ false Qi?2`rBb2X "2+mb2 r2 KB;?i MQi
}M/ Ki+?BM; 2H2K2Mi- find `2im`Mb M Option `i?2` i?M i?2 2H2K2Mi Bib2H7X
find
true
foldX
Bb +QMbmK2` i?i HQQFb HBF2 i?Bb, fold(base, |accumulator, element| ...)X Ai iF2b irQ
`;mK2Mib, i?2 }`bi Bb M 2H2K2Mi +HH2/ i?2 #b2X h?2 b2+QM/ Bb +HQbm`2 i?i Bib2H7 iF2b irQ
`;mK2Mib, i?2 }`bi Bb +HH2/ i?2 ++mKmHiQ`- M/ i?2 b2+QM/ Bb M 2H2K2MiX lTQM 2+? Bi2`iBQMi?2 +HQbm`2 Bb +HH2/- M/ i?2 `2bmHi Bb i?2 pHm2 Q7 i?2 ++mKmHiQ` QM i?2 M2ti Bi2`iBQMX PM i?2
}`bi Bi2`iBQM- i?2 #b2 Bb i?2 pHm2 Q7 i?2 ++mKmHiQ`X
fold()
PFv- i?ib #Bi +QM7mbBM;X G2ib 2tKBM2 i?2 pHm2b Q7 HH Q7 i?2b2 i?BM;b BM i?Bb Bi2`iQ`,
q2 +HH2/
fold()
#b2
++mKmHiQ`
2H2K2Mi
+HQbm`2 `2bmHi
y
y
y
y
R
j
R
k
j
R
j
e
aQ- 0 Bb Qm` #b2- sum Bb Qm` ++mKmHiQ`- M/ x Bb Qm` 2H2K2MiX PM i?2 }`bi Bi2`iBQM- r2 b2i sum
iQ 0- M/ x Bb i?2 }`bi 2H2K2Mi Q7 nums- 1X q2 i?2M // sum M/ x- r?B+? ;Bp2b mb 0 + 1 = 1X PM
i?2 b2+QM/ Bi2`iBQM- i?i pHm2 #2+QK2b Qm` ++mKmHiQ`- sum- M/ i?2 2H2K2Mi Bb i?2 b2+QM/
2H2K2Mi Q7 i?2 ``v- 2X 1 + 2 = 3- M/ bQ i?i #2+QK2b i?2 pHm2 Q7 i?2 ++mKmHiQ` 7Q` i?2 Hbi
Bi2`iBQMX PM i?i Bi2`iBQM- x Bb i?2 Hbi 2H2K2Mi- 3- M/ 3 + 3 = 6- r?B+? Bb Qm` }MH `2bmHi 7Q`
Qm` bmKX 1 + 2 + 3 = 6- M/ i?ib i?2 `2bmHi r2 ;QiX
q?2rX fold +M #2 #Bi bi`M;2 i?2 }`bi 72r iBK2b vQm b22 Bi- #mi QM+2 Bi +HB+Fb- vQm +M mb2
Bi HH Qp2` i?2 TH+2X Mv iBK2 vQm ?p2 HBbi Q7 i?BM;b- M/ vQm rMi bBM;H2 `2bmHi- fold Bb
TT`QT`Bi2X
*QMbmK2`b `2 BKTQ`iMi /m2 iQ QM2 //BiBQMH T`QT2`iv Q7 Bi2`iQ`b r2 ?p2Mi iHF2/ #Qmi
v2i, HxBM2bbX G2ib iHF bQK2 KQ`2 #Qmi Bi2`iQ`b- M/ vQmHH b22 r?v +QMbmK2`b Kii2`X
Ai2`iQ`b
b r2p2 bB/ #27Q`2- M Bi2`iQ` Bb bQK2i?BM; i?i r2 +M +HH i?2 .next() K2i?Q/ QM `2T2i2/HvM/ Bi ;Bp2b mb b2[m2M+2 Q7 i?BM;bX "2+mb2 vQm M22/ iQ +HH i?2 K2i?Q/- i?Bb K2Mb i?i
Bi2`iQ`b +M #2 Hxv M/ MQi ;2M2`i2 HH Q7 i?2 pHm2b mT7`QMiX h?Bb +Q/2- 7Q` 2tKTH2- /Q2b
MQi +imHHv ;2M2`i2 i?2 MmK#2`b 1-100- BMbi2/ +`2iBM; pHm2 i?i K2`2Hv `2T`2b2Mib i?2
b2[m2M+2,
9X8X Ah1_hP_a
Nj
aBM+2 r2 /B/Mi /Q Mvi?BM; rBi? i?2 `M;2- Bi /B/Mi ;2M2`i2 i?2 b2[m2M+2X G2ib // i?2
+QMbmK2`,
let nums = (1..100).collect::<Vec<i32>>();
LQr- collect() rBHH `2[mB`2 i?i i?2 `M;2 ;Bp2b Bi bQK2 MmK#2`b- M/ bQ Bi rBHH /Q i?2 rQ`F Q7
;2M2`iBM; i?2 b2[m2M+2X
_M;2b `2 QM2 Q7 irQ #bB+ Bi2`iQ`b i?i vQmHH b22X h?2 Qi?2` Bb
p2+iQ` BMiQ bBKTH2 Bi2`iQ` i?i ;Bp2b vQm 2+? 2H2K2Mi BM im`M,
iter()X iter()
+M im`M
h?2b2 irQ #bB+ Bi2`iQ`b b?QmH/ b2`p2 vQm r2HHX h?2`2 `2 bQK2 KQ`2 /pM+2/ Bi2`iQ`b- BM+Hm/@
BM; QM2b i?i `2 BM}MBi2X
h?ib 2MQm;? #Qmi Bi2`iQ`bX Ai2`iQ` /Ti2`b `2 i?2 Hbi +QM+2Ti r2 M22/ iQ iHF #Qmi rBi?
`2;`/b iQ Bi2`iQ`bX G2ib ;2i iQ Bi5
Ai2`iQ` /Ti2`b
Ai2`iQ` /Ti2`b iF2 M Bi2`iQ` M/ KQ/B7v Bi bQK2?Qr- T`Q/m+BM; M2r Bi2`iQ`X h?2 bBKTH2bi
QM2 Bb +HH2/ map,
(1..100).map(|x| x + 1);
Bb +HH2/ mTQM MQi?2` Bi2`iQ`- M/ T`Q/m+2b M2r Bi2`iQ` r?2`2 2+? 2H2K2Mi `272`2M+2
?b i?2 +HQbm`2 Bib #22M ;Bp2M b M `;mK2Mi +HH2/ QM BiX aQ i?Bb rQmH/ ;Bp2 mb i?2 MmK#2`b
7`QK 2-100X q2HH- HKQbi5 A7 vQm +QKTBH2 i?2 2tKTH2- vQmHH ;2i r`MBM;,
map
warning: unused result which must be used: iterator adaptors are lazy and
do nothing unless consumed, #[warn(unused_must_use)] on by default
(1..100).map(|x| x + 1);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GxBM2bb bi`BF2b ;BM5 h?i +HQbm`2 rBHH M2p2` 2t2+mi2X h?Bb 2tKTH2 /Q2bMi T`BMi Mv MmK#2`b,
(1..100).map(|x| println!("{}", x));
A7 vQm `2 i`vBM; iQ 2t2+mi2 +HQbm`2 QM M Bi2`iQ` 7Q` Bib bB/2 2z2+ib- Dmbi mb2
for
BMbi2/X
h?2`2 `2 iQMb Q7 BMi2`2biBM; Bi2`iQ` /Ti2`bX take(n) rBHH `2im`M M Bi2`iQ` Qp2` i?2 M2ti n
2H2K2Mib Q7 i?2 Q`B;BMH Bi2`iQ`X LQi2 i?i i?Bb ?b MQ bB/2 2z2+i QM i?2 Q`B;BMH Bi2`iQ`X G2ib
i`v Bi Qmi rBi? Qm` BM}MBi2 Bi2`iQ` 7`QK #27Q`2,
N9
for i in (1..).step_by(5).take(5) {
println!("{}", i);
}
falseX
for i in (1..100).filter(|&x| x % 2 == 0) {
println!("{}", i);
}
h?Bb rBHH T`BMi HH Q7 i?2 2p2M MmK#2`b #2ir22M QM2 M/ ?mM/`2/X ULQi2 i?i #2+mb2 filter
/Q2bMi +QMbmK2 i?2 2H2K2Mib i?i `2 #2BM; Bi2`i2/ Qp2`- Bi Bb Tbb2/ `272`2M+2 iQ 2+? 2H2K2MiM/ i?mb i?2 }Hi2` T`2/B+i2 mb2b i?2 &x Tii2`M iQ 2ti`+i i?2 BMi2;2` Bib2H7XV
uQm +M +?BM HH i?`22 i?BM;b iQ;2i?2`, bi`i rBi? M Bi2`iQ`- /Ti Bi 72r iBK2b- M/ i?2M
+QMbmK2 i?2 `2bmHiX *?2+F Bi Qmi,
(1..1000)
.filter(|&x| x % 2 == 0)
.filter(|&x| x % 3 == 0)
.take(5)
.collect::<Vec<i32>>();
M/
30X
h?Bb Bb Dmbi bKHH ibi2 Q7 r?i Bi2`iQ`b- Bi2`iQ` /Ti2`b- M/ +QMbmK2`b +M ?2HT vQm rBi?X
h?2`2 `2 MmK#2` Q7 `2HHv mb27mH Bi2`iQ`b- M/ vQm +M r`Bi2 vQm` QrM b r2HHX Ai2`iQ`b
T`QpB/2 b72- 2{+B2Mi rv iQ KMBTmHi2 HH FBM/b Q7 HBbibX h?2v`2 HBiiH2 mMmbmH i }`bi- #mi
B7 vQm THv rBi? i?2K- vQmHH ;2i ?QQF2/X 6Q` 7mHH HBbi Q7 i?2 /Bz2`2Mi Bi2`iQ`b M/ +QMbmK2`b+?2+F Qmi i?2 Bi2`iQ` KQ/mH2 /Q+mK2MiiBQM3 X
9Xe
*QM+m``2M+v
*QM+m``2M+v M/ T`HH2HBbK `2 BM+`2/B#Hv BKTQ`iMi iQTB+b BM +QKTmi2` b+B2M+2- M/ `2 HbQ
?Qi iQTB+ BM BM/mbi`v iQ/vX *QKTmi2`b `2 ;BMBM; KQ`2 M/ KQ`2 +Q`2b- v2i KMv T`Q;`KK2`b
`2Mi T`2T`2/ iQ 7mHHv miBHBx2 i?2KX
3 ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fBi2`fBM/2tX?iKH
9XeX *PL*l__1L*u
N8
_mbib K2KQ`v b72iv 72im`2b HbQ TTHv iQ Bib +QM+m``2M+v biQ`v iQQX 1p2M +QM+m``2Mi _mbi
T`Q;`Kb Kmbi #2 K2KQ`v b72- ?pBM; MQ /i `+2bX _mbib ivT2 bvbi2K Bb mT iQ i?2 ibF- M/
;Bp2b vQm TQr2`7mH rvb iQ `2bQM #Qmi +QM+m``2Mi +Q/2 i +QKTBH2 iBK2X
"27Q`2 r2 iHF #Qmi i?2 +QM+m``2M+v 72im`2b i?i +QK2 rBi? _mbi- Bib BKTQ`iMi iQ mM/2`biM/
bQK2i?BM;, _mbi Bb HQr@H2p2H 2MQm;? i?i HH Q7 i?Bb Bb T`QpB/2/ #v i?2 biM/`/ HB#``v- MQi #v i?2
HM;m;2X h?Bb K2Mb i?i B7 vQm /QMi HBF2 bQK2 bT2+i Q7 i?2 rv _mbi ?M/H2b +QM+m``2M+vvQm +M BKTH2K2Mi M Hi2`MiBp2 rv Q7 /QBM; i?BM;bX KBQN Bb `2H@rQ`H/ 2tKTH2 Q7 i?Bb
T`BM+BTH2 BM +iBQMX
"+F;`QmM/,
Send
M/
Sync
*QM+m``2M+v Bb /B{+mHi iQ `2bQM #QmiX AM _mbi- r2 ?p2 bi`QM;- biiB+ ivT2 bvbi2K iQ ?2HT
mb `2bQM #Qmi Qm` +Q/2X b bm+?- _mbi ;Bp2b mb irQ i`Bib iQ ?2HT mb KF2 b2Mb2 Q7 +Q/2 i?i
+M TQbbB#Hv #2 +QM+m``2MiX
h?2 }`bi i`Bi r2`2 ;QBM; iQ iHF #Qmi Bb SendRy X q?2M ivT2 T BKTH2K2Mib Send- Bi
BM/B+i2b iQ i?2 +QKTBH2` i?i bQK2i?BM; Q7 i?Bb ivT2 Bb #H2 iQ ?p2 QrM2`b?BT i`Mb72``2/ b72Hv
#2ir22M i?`2/bX
Send
h?Bb Bb BKTQ`iMi iQ 2M7Q`+2 +2`iBM `2bi`B+iBQMbX 6Q` 2tKTH2- B7 r2 ?p2 +?MM2H +QMM2+iBM;
irQ i?`2/b- r2 rQmH/ rMi iQ #2 #H2 iQ b2M/ bQK2 /i /QrM i?2 +?MM2H M/ iQ i?2 Qi?2`
i?`2/X h?2`27Q`2- r2/ 2Mbm`2 i?i Send rb BKTH2K2Mi2/ 7Q` i?i ivT2X
AM i?2 QTTQbBi2 rv- B7 r2 r2`2 r`TTBM; HB#``v rBi? 66A i?i BbMi i?`2/b72- r2 rQmH/Mi
rMi iQ BKTH2K2Mi Send- M/ bQ i?2 +QKTBH2` rBHH ?2HT mb 2M7Q`+2 i?i Bi +Mi H2p2 i?2 +m``2Mi
i?`2/X
h?2 b2+QM/ Q7 i?2b2 i`Bib Bb +HH2/ SyncRR X q?2M ivT2 T BKTH2K2Mib Sync- Bi BM/B+i2b
iQ i?2 +QKTBH2` i?i bQK2i?BM; Q7 i?Bb ivT2 ?b MQ TQbbB#BHBiv Q7 BMi`Q/m+BM; K2KQ`v mMb72iv
r?2M mb2/ 7`QK KmHiBTH2 i?`2/b +QM+m``2MiHvX
Sync
6Q` 2tKTH2- b?`BM; BKKmi#H2 /i rBi? M iQKB+ `272`2M+2 +QmMi Bb i?`2/b72X _mbi T`QpB/2b
ivT2 HBF2 i?Bb- Arc<T>- M/ Bi BKTH2K2Mib Sync- bQ Bi Bb b72 iQ b?`2 #2ir22M i?`2/bX
h?2b2 irQ i`Bib HHQr vQm iQ mb2 i?2 ivT2 bvbi2K iQ KF2 bi`QM; ;m`Mi22b #Qmi i?2 T`QT2`iB2b
Q7 vQm` +Q/2 mM/2` +QM+m``2M+vX "27Q`2 r2 /2KQMbi`i2 r?v- r2 M22/ iQ H2`M ?Qr iQ +`2i2
+QM+m``2Mi _mbi T`Q;`K BM i?2 }`bi TH+25
h?`2/b
_mbib biM/`/ HB#``v T`QpB/2b HB#``v 7Q` i?`2/b- r?B+? HHQr vQm iQ `mM _mbi +Q/2 BM
T`HH2HX >2`2b #bB+ 2tKTH2 Q7 mbBM; std::thread,
use std::thread;
N ?iiTb,ff;Bi?m#X+QKf+`HH2`+?2fKBQ
Ry ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fK`F2`fi`BiXa2M/X?iKH
RR ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fK`F2`fi`BiXavM+X?iKH
Ne
fn main() {
thread::spawn(|| {
println!("Hello from a thread!");
});
}
h?2 thread::spawn() K2i?Q/ ++2Tib +HQbm`2- r?B+? Bb 2t2+mi2/ BM M2r i?`2/X Ai `2im`Mb
?M/H2 iQ i?2 i?`2/- i?i +M #2 mb2/ iQ rBi 7Q` i?2 +?BH/ i?`2/ iQ }MBb? M/ 2ti`+i Bib
`2bmHi,
use std::thread;
fn main() {
let handle = thread::spawn(|| {
"Hello from a thread!"
});
println!("{}", handle.join().unwrap());
}
JMv HM;m;2b ?p2 i?2 #BHBiv iQ 2t2+mi2 i?`2/b- #mi Bib rBH/Hv mMb72X h?2`2 `2 2MiB`2
#QQFb #Qmi ?Qr iQ T`2p2Mi 2``Q`b i?i Q++m` 7`QK b?`2/ Kmi#H2 bii2X _mbi ?2HTb Qmi rBi?
Bib ivT2 bvbi2K ?2`2 b r2HH- #v T`2p2MiBM; /i `+2b i +QKTBH2 iBK2X G2ib iHF #Qmi ?Qr vQm
+imHHv b?`2 i?BM;b #2ir22M i?`2/bX
a72 a?`2/ Jmi#H2 aii2
.m2 iQ _mbib ivT2 bvbi2K- r2 ?p2 +QM+2Ti i?i bQmM/b HBF2 HB2, b72 b?`2/ Kmi#H2 bii2X
JMv T`Q;`KK2`b ;`22 i?i b?`2/ Kmi#H2 bii2 Bb p2`v- p2`v #/X
aQK2QM2 QM+2 bB/ i?Bb,
a?`2/ Kmi#H2 bii2 Bb i?2 `QQi Q7 HH 2pBHX JQbi HM;m;2b ii2KTi iQ /2H rBi? i?Bb
T`Q#H2K i?`Qm;? i?2 Kmi#H2 T`i- #mi _mbi /2Hb rBi? Bi #v bQHpBM; i?2 b?`2/
T`iX
h?2 bK2 QrM2`b?BT bvbi2K Ub2+iBQM 8X3- T;2 Rj8V i?i ?2HTb T`2p2Mi mbBM; TQBMi2`b BM+Q``2+iHv
HbQ ?2HTb `mH2 Qmi /i `+2b- QM2 Q7 i?2 rQ`bi FBM/b Q7 +QM+m``2M+v #m;bX
b M 2tKTH2- ?2`2 Bb _mbi T`Q;`K i?i rQmH/ ?p2 /i `+2 BM KMv HM;m;2bX Ai rBHH
MQi +QKTBH2,
use std::thread;
fn main() {
let mut data = vec![1u32, 2, 3];
for i in 0..3 {
9XeX *PL*l__1L*u
Nd
thread::spawn(move || {
data[i] += 1;
});
}
thread::sleep_ms(50);
}
AM i?Bb +b2- r2 FMQr i?i Qm` +Q/2 b?QmH/ #2 b72- #mi _mbi BbMi bm`2X M/ Bib +imHHv MQi b72,
B7 r2 ?/ `272`2M+2 iQ data BM 2+? i?`2/- M/ i?2 i?`2/ iF2b QrM2`b?BT Q7 i?2 `272`2M+2- r2
?p2 i?`22 QrM2`b5 h?ib #/X q2 +M }t i?Bb #v mbBM; i?2 Arc<T> ivT2- r?B+? Bb M iQKB+
`272`2M+2 +QmMi2/ TQBMi2`X h?2 iQKB+ T`i K2Mb i?i Bib b72 iQ b?`2 +`Qbb i?`2/bX
bbmK2b QM2 KQ`2 T`QT2`iv #Qmi Bib +QMi2Mib iQ 2Mbm`2 i?i Bi Bb b72 iQ b?`2 +`Qbb
i?`2/b, Bi bbmK2b Bib +QMi2Mib `2 SyncX "mi BM Qm` +b2- r2 rMi iQ #2 #H2 iQ Kmii2 i?2
pHm2X q2 M22/ ivT2 i?i +M 2Mbm`2 QMHv QM2 T2`bQM i iBK2 +M Kmii2 r?ib BMbB/2X 6Q`
i?i- r2 +M mb2 i?2 Mutex<T> ivT2X >2`2b i?2 b2+QM/ p2`bBQM Q7 Qm` +Q/2X Ai biBHH /Q2bMi rQ`F#mi 7Q` /Bz2`2Mi `2bQM,
Arc<T>
use std::thread;
use std::sync::Mutex;
fn main() {
let mut data = Mutex::new(vec![1u32, 2, 3]);
for i in 0..3 {
let data = data.lock().unwrap();
thread::spawn(move || {
data[i] += 1;
});
}
thread::sleep_ms(50);
}
thread::spawn(move || {
^~~~~~~~~~~~~
N3
thread::spawn(move || {
^~~~~~~~~~~~~
uQm b22-
MutexRk
?b
lockRj
Arc<T>
MutexGuard<T>-
q2 MQr +HH clone() QM Qm` Arc- r?B+? BM+`2b2b i?2 BMi2`MH +QmMiX h?Bb ?M/H2 Bb i?2M KQp2/
BMiQ i?2 M2r i?`2/X G2ib 2tKBM2 i?2 #Q/v Q7 i?2 i?`2/ KQ`2 +HQb2Hv,
thread::spawn(move || {
let mut data = data.lock().unwrap();
data[i] += 1;
});
6B`bi- r2 +HH lock()- r?B+? +[mB`2b i?2 Kmi2tb HQ+FX "2+mb2 i?Bb Kv 7BH- Bi `2im`Mb M
Result<T, E>- M/ #2+mb2 i?Bb Bb Dmbi M 2tKTH2- r2 unwrap() Bi iQ ;2i `272`2M+2 iQ i?2 /iX
_2H +Q/2 rQmH/ ?p2 KQ`2 `Q#mbi 2``Q` ?M/HBM; ?2`2X q2`2 i?2M 7`22 iQ Kmii2 Bi- bBM+2 r2
?p2 i?2 HQ+FX
GbiHv- r?BH2 i?2 i?`2/b `2 `mMMBM;- r2 rBi QM b?Q`i iBK2`X "mi i?Bb Bb MQi B/2H, r2 Kv
?p2 TB+F2/ `2bQM#H2 KQmMi Q7 iBK2 iQ rBi #mi Bib KQ`2 HBF2Hv r2HH 2Bi?2` #2 rBiBM; HQM;2`
i?M M2+2bb`v Q` MQi HQM; 2MQm;?- /2T2M/BM; QM Dmbi ?Qr Km+? iBK2 i?2 i?`2/b +imHHv iF2
iQ }MBb? +QKTmiBM; r?2M i?2 T`Q;`K `mMbX
Rk ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fbvM+fbi`m+iXJmi2tX?iKH
Rj ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fbvM+fbi`m+iXJmi2tX?iKHOK2i?Q/XHQ+F
9XeX *PL*l__1L*u
NN
KQ`2 T`2+Bb2 Hi2`MiBp2 iQ i?2 iBK2` rQmH/ #2 iQ mb2 QM2 Q7 i?2 K2+?MBbKb T`QpB/2/ #v i?2
_mbi biM/`/ HB#``v 7Q` bvM+?`QMBxBM; i?`2/b rBi? 2+? Qi?2`X G2ib iHF #Qmi QM2 Q7 i?2K,
+?MM2HbX
*?MM2Hb
>2`2b p2`bBQM Q7 Qm` +Q/2 i?i mb2b +?MM2Hb 7Q` bvM+?`QMBxiBQM- `i?2` i?M rBiBM; 7Q`
bT2+B}+ iBK2,
use std::sync::{Arc, Mutex};
use std::thread;
use std::sync::mpsc;
fn main() {
let data = Arc::new(Mutex::new(0u32));
let (tx, rx) = mpsc::channel();
for _ in 0..10 {
let (data, tx) = (data.clone(), tx.clone());
thread::spawn(move || {
let mut data = data.lock().unwrap();
*data += 1;
tx.send(());
});
}
for _ in 0..10 {
rx.recv();
}
}
send
bBKTH2
q?BH2 i?Bb +?MM2H Bb Dmbi b2M/BM; ;2M2`B+ bB;MH- r2 +M b2M/ Mv /i i?i Bb
+?MM2H5
use std::thread;
use std::sync::mpsc;
fn main() {
let (tx, rx) = mpsc::channel();
for _ in 0..10 {
let tx = tx.clone();
Send
()
/QrM
Qp2` i?2
Ryy
thread::spawn(move || {
let answer = 42u32;
tx.send(answer);
});
}
rx.recv().ok().expect("Could not receive answer");
}
u32 Bb Send #2+mb2 r2 +M KF2 +QTvX aQ r2 +`2i2 i?`2/- bF Bi iQ +H+mHi2 i?2 Mbr2`M/ i?2M Bi send()b mb i?2 Mbr2` Qp2` i?2 +?MM2HX
SMB+b
panic! rBHH +`b? i?2 +m``2MiHv 2t2+miBM; i?`2/X uQm +M mb2 _mbib i?`2/b b bBKTH2
BbQHiBQM K2+?MBbK,
use std::thread;
let result = thread::spawn(move || {
panic!("oops!");
}).join();
assert!(result.is_err());
Pm`
Thread
9Xd
;Bp2b mb
Result
1``Q` >M/HBM;
h?2 #2bi@HB/ THMb Q7 KB+2 M/ K2M
P7i2M ;Q r`v
h2 JQQb2- _Q#2`i "m`Mb
aQK2iBK2b- i?BM;b Dmbi ;Q r`QM;X Aib BKTQ`iMi iQ ?p2 THM 7Q` r?2M i?2 BM2pBi#H2 ?TT2MbX
_mbi ?b `B+? bmTTQ`i 7Q` ?M/HBM; 2``Q`b i?i Kv UH2ib #2 ?QM2bi, rBHHV Q++m` BM vQm` T`Q;`KbX
h?2`2 `2 irQ KBM FBM/b Q7 2``Q`b i?i +M Q++m` BM vQm` T`Q;`Kb, 7BHm`2b- M/ TMB+bX G2ib
iHF #Qmi i?2 /Bz2`2M+2 #2ir22M i?2 irQ- M/ i?2M /Bb+mbb ?Qr iQ ?M/H2 2+?X h?2M- r2HH
/Bb+mbb mT;`/BM; 7BHm`2b iQ TMB+bX
9XdXR
RyR
_mbi mb2b irQ i2`Kb iQ /Bz2`2MiBi2 #2ir22M irQ 7Q`Kb Q7 2``Q`, 7BHm`2- M/ TMB+X 7BHm`2 Bb
M 2``Q` i?i +M #2 `2+Qp2`2/ 7`QK BM bQK2 rvX TMB+ Bb M 2``Q` i?i +MMQi #2 `2+Qp2`2/
7`QKX
q?i /Q r2 K2M #v `2+Qp2`\ q2HH- BM KQbi +b2b- i?2 TQbbB#BHBiv Q7 M 2``Q` Bb 2tT2+i2/X 6Q`
2tKTH2- +QMbB/2` i?2 parse 7mM+iBQM,
"5".parse();
h?Bb K2i?Q/ +QMp2`ib bi`BM; BMiQ MQi?2` ivT2X "mi #2+mb2 Bib bi`BM;- vQm +Mi #2 bm`2
i?i i?2 +QMp2`bBQM +imHHv rQ`FbX 6Q` 2tKTH2- r?i b?QmH/ i?Bb +QMp2`i iQ\
"hello5world".parse();
h?Bb rQMi rQ`FX aQ r2 FMQr i?i i?Bb 7mM+iBQM rBHH QMHv rQ`F T`QT2`Hv 7Q` bQK2 BMTmibX Aib
2tT2+i2/ #2?pBQ`X q2 +HH i?Bb FBM/ Q7 2``Q` 7BHm`2X
PM i?2 Qi?2` ?M/- bQK2iBK2b- i?2`2 `2 2``Q`b i?i `2 mM2tT2+i2/- Q` r?B+? r2 +MMQi `2+Qp2`
7`QKX +HbbB+ 2tKTH2 Bb M assert!,
assert!(x == 5);
q2 mb2 assert! iQ /2+H`2 i?i bQK2i?BM; Bb i`m2X A7 Bib MQi i`m2- bQK2i?BM; Bb p2`v r`QM;X
q`QM; 2MQm;? i?i r2 +Mi +QMiBMm2 rBi? i?BM;b BM i?2 +m``2Mi bii2X MQi?2` 2tKTH2 Bb mbBM;
i?2 unreachable!() K+`Q,
enum Event {
NewRelease,
}
fn probability(_: &Event) -> f64 {
// real implementation would be more complex, of course
0.95
}
fn descriptive_probability(event: Event) -> &'static str {
match probability(&event) {
1.00 => "certain",
0.00 => "impossible",
0.00 ... 0.25 => "very unlikely",
0.25 ... 0.50 => "unlikely",
0.50 ... 0.75 => "likely",
0.75 ... 1.00 => "very likely",
}
}
fn main() {
std::io::println(descriptive_probability(NewRelease));
}
Ryk
q?BH2 r2 FMQr i?i r2p2 +Qp2`2/ HH TQbbB#H2 +b2b- _mbi +Mi i2HHX Ai /Q2bMi FMQr i?i
T`Q##BHBiv Bb #2ir22M yXy M/ RXyX aQ r2 // MQi?2` +b2,
use Event::NewRelease;
enum Event {
NewRelease,
}
fn probability(_: &Event) -> f64 {
// real implementation would be more complex, of course
0.95
}
fn descriptive_probability(event: Event) -> &'static str {
match probability(&event) {
1.00 => "certain",
0.00 => "impossible",
0.00 ... 0.25 => "very unlikely",
0.25 ... 0.50 => "unlikely",
0.50 ... 0.75 => "likely",
0.75 ... 1.00 => "very likely",
_ => unreachable!()
}
}
fn main() {
println!("{}", descriptive_probability(NewRelease));
}
q2 b?QmH/Mi 2p2` ?Bi i?2 _ +b2- bQ r2 mb2 i?2 unreachable!() K+`Q iQ BM/B+i2 i?BbX
unreachable!() ;Bp2b /Bz2`2Mi FBM/ Q7 2``Q` i?M ResultX _mbi +HHb i?2b2 bQ`ib Q7 2``Q`b TMB+bX
Option
M/
Result
h?2 bBKTH2bi rv iQ BM/B+i2 i?i 7mM+iBQM Kv 7BH Bb iQ mb2 i?2 Option<T> ivT2X 6Q` 2tKTH2i?2 find K2i?Q/ QM bi`BM;b ii2KTib iQ }M/ Tii2`M BM bi`BM;- M/ `2im`Mb M Option,
let s = "foo";
assert_eq!(s.find('f'), Some(0));
assert_eq!(s.find('z'), None);
Ryj
h?Bb Bb TT`QT`Bi2 7Q` i?2 bBKTH2bi Q7 +b2b- #mi /Q2bMi ;Bp2 mb HQi Q7 BM7Q`KiBQM BM i?2 7BHm`2
+b2X q?i B7 r2 rMi2/ iQ FMQr r?v i?2 7mM+iBQM 7BH2/\ 6Q` i?Bb- r2 +M mb2 i?2 Result<T,
E> ivT2X Ai HQQFb HBF2 i?Bb,
enum Result<T, E> {
Ok(T),
Err(E)
}
h?Bb 2MmK Bb T`QpB/2/ #v _mbi Bib2H7- bQ vQm /QMi M22/ iQ /2}M2 Bi iQ mb2 Bi BM vQm` +Q/2X
h?2 Ok(T) p`BMi `2T`2b2Mib bm++2bb- M/ i?2 Err(E) p`BMi `2T`2b2Mib 7BHm`2X _2im`MBM;
Result BMbi2/ Q7 M Option Bb `2+QKK2M/2/ 7Q` HH #mi i?2 KQbi i`BpBH Q7 bBimiBQMbX
>2`2b M 2tKTH2 Q7 mbBM;
Result,
#[derive(Debug)]
enum Version { Version1, Version2 }
#[derive(Debug)]
enum ParseError { InvalidHeaderLength, InvalidVersion }
fn parse_version(header: &[u8]) -> Result<Version, ParseError> {
if header.len() < 1 {
return Err(ParseError::InvalidHeaderLength);
}
match header[0] {
1 => Ok(Version::Version1),
2 => Ok(Version::Version2),
_ => Err(ParseError::InvalidVersion)
}
}
let version = parse_version(&[1, 2, 3, 4]);
match version {
Ok(v) => {
println!("working with version: {:?}", v);
}
Err(e) => {
println!("error parsing header: {:?}", e);
}
}
h?Bb 7mM+iBQM KF2b mb2 Q7 M 2MmK- ParseError- iQ 2MmK2`i2 i?2 p`BQmb 2``Q`b i?i +M Q++m`X
h?2
DebugR9
R9 ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/f7Kifi`BiX.2#m;X?iKH
{:?}
7Q`Ki QT2`iBQMX
Ry9
panic!
panic!
panic!("boom");
;Bp2b
thread '<main>' panicked at 'boom', hello.rs:2
rBHH panic! B7 i?2 Result Bb ErrX h?Bb #bB+HHv bvb :Bp2 K2 i?2 pHm2- M/ B7 bQK2i?BM;
;Q2b r`QM;- Dmbi +`b?X h?Bb Bb H2bb `2HB#H2 i?M Ki+?BM; i?2 2``Q` M/ ii2KTiBM; iQ `2+Qp2`#mi Bb HbQ bB;MB}+MiHv b?Q`i2`X aQK2iBK2b- Dmbi +`b?BM; Bb TT`QT`Bi2X
unwrap()
unwrap(),
+QMp2`ib i?2 Result BMiQ M Option- M/ expect() /Q2b i?2 bK2 i?BM; b unwrap()- #mi
iF2b K2bb;2X h?Bb K2bb;2 Bb Tbb2/ HQM; iQ i?2 mM/2`HvBM; panic!- T`QpB/BM; #2ii2` 2``Q`
K2bb;2 B7 i?2 +Q/2 2``Q`bX
ok()
9XdX8 lbBM;
try!
q?2M r`BiBM; +Q/2 i?i +HHb KMv 7mM+iBQMb i?i `2im`M i?2 Result ivT2- i?2 2``Q` ?M/HBM; +M
#2 i2/BQmbX h?2 try! K+`Q ?B/2b bQK2 Q7 i?2 #QBH2`THi2 Q7 T`QT;iBM; 2``Q`b mT i?2 +HH bi+FX
Ai `2TH+2b i?Bb,
Ry8
use std::fs::File;
use std::io;
use std::io::prelude::*;
struct Info {
name: String,
age: i32,
rating: i32,
}
fn write_info(info: &Info) -> io::Result<()> {
let mut file = File::create("my_best_friends.txt").unwrap();
if let Err(e) = writeln!(&mut file, "name: {}", info.name) {
return Err(e)
}
if let Err(e) = writeln!(&mut file, "age: {}", info.age) {
return Err(e)
}
if let Err(e) = writeln!(&mut file, "rating: {}", info.rating) {
return Err(e)
}
return Ok(());
}
qBi? i?Bb,
use std::fs::File;
use std::io;
use std::io::prelude::*;
struct Info {
name: String,
age: i32,
rating: i32,
}
fn write_info(info: &Info) -> io::Result<()> {
let mut file = try!(File::create("my_best_friends.txt"));
try!(writeln!(&mut file, "name: {}", info.name));
try!(writeln!(&mut file, "age: {}", info.age));
try!(writeln!(&mut file, "rating: {}", info.rating));
return Ok(());
}
q`TTBM; M 2tT`2bbBQM BM try! rBHH `2bmHi BM i?2 mMr`TT2/ bm++2bb UOkV pHm2- mMH2bb i?2 `2bmHi
Rye
Bb
Err-
BM r?B+? +b2
Err
Aib rQ`i? MQiBM; i?i vQm +M QMHv mb2 try! 7`QK 7mM+iBQM i?i `2im`Mb Result- r?B+? K2Mb
i?i vQm +MMQi mb2 try! BMbB/2 Q7 main()- #2+mb2 main() /Q2bMi `2im`M Mvi?BM;X
KF2b mb2 Q7
try!
9X3
From<Error>R8
66A
9X3XR AMi`Q/m+iBQM
h?Bb ;mB/2 rBHH mb2 i?2 bMTTvRe +QKT`2bbBQMf/2+QKT`2bbBQM HB#``v b M BMi`Q/m+iBQM iQ r`BiBM;
#BM/BM;b 7Q` 7Q`2B;M +Q/2X _mbi Bb +m``2MiHv mM#H2 iQ +HH /B`2+iHv BMiQ *YY HB#``v- #mi bMTTv
BM+Hm/2b * BMi2`7+2 U/Q+mK2Mi2/ BM snappy-c.hRd VX
h?2 7QHHQrBM; Bb KBMBKH 2tKTH2 Q7 +HHBM; 7Q`2B;M 7mM+iBQM r?B+? rBHH +QKTBH2 B7 bMTTv Bb
BMbiHH2/,
# #![feature(libc)]
extern crate libc;
use libc::size_t;
#[link(name = "snappy")]
extern {
fn snappy_max_compressed_length(source_length: size_t) -> size_t;
}
fn main() {
let x = unsafe { snappy_max_compressed_length(100) };
println!("max compressed length of a 100 byte buffer: {}", x);
}
h?2 extern #HQ+F Bb HBbi Q7 7mM+iBQM bB;Mim`2b BM 7Q`2B;M HB#``v- BM i?Bb +b2 rBi? i?2 THi7Q`Kb
* "AX h?2 #[link(...)] ii`B#mi2 Bb mb2/ iQ BMbi`m+i i?2 HBMF2` iQ HBMF ;BMbi i?2 bMTTv HB#``v
bQ i?2 bvK#QHb `2 `2bQHp2/X
6Q`2B;M 7mM+iBQMb `2 bbmK2/ iQ #2 mMb72 bQ +HHb iQ i?2K M22/ iQ #2 r`TT2/ rBi? unsafe
{} b T`QKBb2 iQ i?2 +QKTBH2` i?i 2p2`vi?BM; +QMiBM2/ rBi?BM i`mHv Bb b72X * HB#``B2b Q7i2M
2tTQb2 BMi2`7+2b i?i `2Mi i?`2/@b72- M/ HKQbi Mv 7mM+iBQM i?i iF2b TQBMi2` `;mK2Mi
BbMi pHB/ 7Q` HH TQbbB#H2 BMTmib bBM+2 i?2 TQBMi2` +QmH/ #2 /M;HBM;- M/ `r TQBMi2`b 7HH QmibB/2
Q7 _mbib b72 K2KQ`v KQ/2HX
q?2M /2+H`BM; i?2 `;mK2Mi ivT2b iQ 7Q`2B;M 7mM+iBQM- i?2 _mbi +QKTBH2` +M MQi +?2+F B7 i?2
/2+H`iBQM Bb +Q``2+i- bQ bT2+B7vBM; Bi +Q``2+iHv Bb T`i Q7 F22TBM; i?2 #BM/BM; +Q``2+i i `mMiBK2X
h?2
extern
R8 ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/f+QMp2`ifi`BiX6`QKX?iKH
Re ?iiTb,ff;Bi?m#X+QKf;QQ;H2fbMTTv
Rd ?iiTb,ff;Bi?m#X+QKf;QQ;H2fbMTTvf#HQ#fKbi2`fbMTTv@+X?
9X3X 66A
Ryd
# #![feature(libc)]
extern crate libc;
use libc::{c_int, size_t};
#[link(name = "snappy")]
extern {
fn snappy_compress(input: *const u8,
input_length: size_t,
compressed: *mut u8,
compressed_length: *mut size_t) -> c_int;
fn snappy_uncompress(compressed: *const u8,
compressed_length: size_t,
uncompressed: *mut u8,
uncompressed_length: *mut size_t) -> c_int;
fn snappy_max_compressed_length(source_length: size_t) -> size_t;
fn snappy_uncompressed_length(compressed: *const u8,
compressed_length: size_t,
result: *mut size_t) -> c_int;
fn snappy_validate_compressed_buffer(compressed: *const u8,
compressed_length: size_t) -> c_int;
}
# fn main() {}
9X3Xk
h?2 `r * SA M22/b iQ #2 r`TT2/ iQ T`QpB/2 K2KQ`v b72iv M/ KF2 mb2 Q7 ?B;?2`@H2p2H
+QM+2Tib HBF2 p2+iQ`bX HB#``v +M +?QQb2 iQ 2tTQb2 QMHv i?2 b72- ?B;?@H2p2H BMi2`7+2 M/ ?B/2
i?2 mMb72 BMi2`MH /2iBHbX
q`TTBM; i?2 7mM+iBQMb r?B+? 2tT2+i #mz2`b BMpQHp2b mbBM; i?2 slice::raw KQ/mH2 iQ KMBTmHi2
_mbi p2+iQ`b b TQBMi2`b iQ K2KQ`vX _mbib p2+iQ`b `2 ;m`Mi22/ iQ #2 +QMiB;mQmb #HQ+F Q7
K2KQ`vX h?2 H2M;i? Bb MmK#2` Q7 2H2K2Mib +m``2MiHv +QMiBM2/- M/ i?2 +T+Biv Bb i?2 iQiH
bBx2 BM 2H2K2Mib Q7 i?2 HHQ+i2/ K2KQ`vX h?2 H2M;i? Bb H2bb i?M Q` 2[mH iQ i?2 +T+BivX
# #![feature(libc)]
# extern crate libc;
# use libc::{c_int, size_t};
# unsafe fn snappy_validate_compressed_buffer(_: *const u8, _: size_t) -> c_int { 0 }
# fn main() {}
pub fn validate_compressed_buffer(src: &[u8]) -> bool {
unsafe {
snappy_validate_compressed_buffer(src.as_ptr(), src.len() as size_t) == 0
}
}
h?2 validate_compressed_buffer r`TT2` #Qp2 KF2b mb2 Q7 M unsafe #HQ+F- #mi Bi KF2b i?2
;m`Mi22 i?i +HHBM; Bi Bb b72 7Q` HH BMTmib #v H2pBM; Qz unsafe 7`QK i?2 7mM+iBQM bB;Mim`2X
h?2 snappy_compress M/ snappy_uncompress 7mM+iBQMb `2 KQ`2 +QKTH2t- bBM+2 #mz2` ?b iQ
#2 HHQ+i2/ iQ ?QH/ i?2 QmiTmi iQQX
Ry3
h?2 snappy_max_compressed_length 7mM+iBQM +M #2 mb2/ iQ HHQ+i2 p2+iQ` rBi? i?2 KtBKmK
`2[mB`2/ +T+Biv iQ ?QH/ i?2 +QKT`2bb2/ QmiTmiX h?2 p2+iQ` +M i?2M #2 Tbb2/ iQ i?2 snappy_compress 7mM+iBQM b M QmiTmi T`K2i2`X M QmiTmi T`K2i2` Bb HbQ Tbb2/ iQ `2i`B2p2 i?2
i`m2 H2M;i? 7i2` +QKT`2bbBQM 7Q` b2iiBM; i?2 H2M;i?X
# #![feature(libc)]
# extern crate libc;
# use libc::{size_t, c_int};
# unsafe fn snappy_compress(a: *const u8, b: size_t, c: *mut u8,
#
.2+QKT`2bbBQM Bb bBKBH`- #2+mb2 bMTTv biQ`2b i?2 mM+QKT`2bb2/ bBx2 b T`i Q7 i?2 +QKT`2bbBQM
7Q`Ki M/ snappy_uncompressed_length rBHH `2i`B2p2 i?2 2t+i #mz2` bBx2 `2[mB`2/X
# #![feature(libc)]
# extern crate libc;
# use libc::{size_t, c_int};
# unsafe fn snappy_uncompress(compressed: *const u8,
#
compressed_length: size_t,
compressed_length: size_t,
# fn main() {}
pub fn uncompress(src: &[u8]) -> Option<Vec<u8>> {
unsafe {
let srclen = src.len() as size_t;
let psrc = src.as_ptr();
let mut dstlen: size_t = 0;
snappy_uncompressed_length(psrc, srclen, &mut dstlen);
9X3X 66A
RyN
6Q` `272`2M+2- i?2 2tKTH2b mb2/ ?2`2 `2 HbQ pBH#H2 b HB#``v QM :Bi>m#R3 X
9X3Xj
.2bi`m+iQ`b
6Q`2B;M HB#``B2b Q7i2M ?M/ Qz QrM2`b?BT Q7 `2bQm`+2b iQ i?2 +HHBM; +Q/2X q?2M i?Bb Q++m`br2 Kmbi mb2 _mbib /2bi`m+iQ`b iQ T`QpB/2 b72iv M/ ;m`Mi22 i?2 `2H2b2 Q7 i?2b2 `2bQm`+2b
U2bT2+BHHv BM i?2 +b2 Q7 TMB+VX
6Q` KQ`2 #Qmi /2bi`m+iQ`b- b22 i?2 .`QT i`BiRN X
9X3X9
aQK2 2ti2`MH HB#``B2b `2[mB`2 i?2 mb;2 Q7 +HH#+Fb iQ `2TQ`i #+F i?2B` +m``2Mi bii2 Q` BMi2`@
K2/Bi2 /i iQ i?2 +HH2`X Ai Bb TQbbB#H2 iQ Tbb 7mM+iBQMb /2}M2/ BM _mbi iQ M 2ti2`MH HB#``vX
h?2 `2[mB`2K2Mi 7Q` i?Bb Bb i?i i?2 +HH#+F 7mM+iBQM Bb K`F2/ b extern rBi? i?2 +Q``2+i +HHBM;
+QMp2MiBQM iQ KF2 Bi +HH#H2 7`QK * +Q/2X
h?2 +HH#+F 7mM+iBQM +M i?2M #2 b2Mi i?`Qm;? `2;Bbi`iBQM +HH iQ i?2 * HB#``v M/ 7i2`r`/b
#2 BMpQF2/ 7`QK i?2`2X
#bB+ 2tKTH2 Bb,
_mbi +Q/2,
extern fn callback(a: i32) {
println!("I'm called from C with value {0}", a);
}
#[link(name = "extlib")]
extern {
fn register_callback(cb: extern fn(i32)) -> i32;
fn trigger_callback();
}
fn main() {
R3 ?iiTb,ff;Bi?m#X+QKfi?2biBM;2`f`mbi@bMTTv
RN ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fQTbfi`BiX.`QTX?iKH
RRy
* +Q/2,
typedef void (*rust_callback)(int32_t);
rust_callback cb;
int32_t register_callback(rust_callback callback) {
cb = callback;
return 1;
}
void trigger_callback() {
cb(7); // Will call callback(7) in Rust
}
main()
rBHH +HH
trigger_callback()
9X3X 66A
RRR
#[link(name = "extlib")]
extern {
fn register_callback(target: *mut RustObject,
cb: extern fn(*mut RustObject, i32)) -> i32;
fn trigger_callback();
}
fn main() {
// Create the object that will be referenced in the callback
let mut rust_object = Box::new(RustObject { a: 5 });
unsafe {
register_callback(&mut *rust_object, callback);
trigger_callback();
}
}
* +Q/2,
typedef void (*rust_callback)(void*, int32_t);
void* cb_target;
rust_callback cb;
int32_t register_callback(void* callback_target, rust_callback callback) {
cb_target = callback_target;
cb = callback;
return 1;
}
void trigger_callback() {
cb(cb_target, 7); // Will call callback(&rustObject, 7) in Rust
}
bvM+?`QMQmb +HH#+Fb
AM i?2 T`2pBQmbHv ;Bp2M 2tKTH2b i?2 +HH#+Fb `2 BMpQF2/ b /B`2+i `2+iBQM iQ 7mM+iBQM +HH
iQ i?2 2ti2`MH * HB#``vX h?2 +QMi`QH Qp2` i?2 +m``2Mi i?`2/ Bb brBi+?2/ 7`QK _mbi iQ * iQ _mbi
7Q` i?2 2t2+miBQM Q7 i?2 +HH#+F- #mi BM i?2 2M/ i?2 +HH#+F Bb 2t2+mi2/ QM i?2 bK2 i?`2/ i?i
+HH2/ i?2 7mM+iBQM r?B+? i`B;;2`2/ i?2 +HH#+FX
h?BM;b ;2i KQ`2 +QKTHB+i2/ r?2M i?2 2ti2`MH HB#``v bTrMb Bib QrM i?`2/b M/ BMpQF2b
+HH#+Fb 7`QK i?2`2X AM i?2b2 +b2b ++2bb iQ _mbi /i bi`m+im`2b BMbB/2 i?2 +HH#+Fb Bb 2bT2+BHHv
mMb72 M/ T`QT2` bvM+?`QMBxiBQM K2+?MBbKb Kmbi #2 mb2/X "2bB/2b +HbbB+H bvM+?`QMBxiBQM
K2+?MBbKb HBF2 Kmi2t2b- QM2 TQbbB#BHBiv BM _mbi Bb iQ mb2 +?MM2Hb UBM std::commV iQ 7Q`r`/
/i 7`QK i?2 * i?`2/ i?i BMpQF2/ i?2 +HH#+F BMiQ _mbi i?`2/X
A7 M bvM+?`QMQmb +HH#+F i`;2ib bT2+BH Q#D2+i BM i?2 _mbi //`2bb bT+2 Bi Bb HbQ #bQHmi2Hv
M2+2bb`v i?i MQ KQ`2 +HH#+Fb `2 T2`7Q`K2/ #v i?2 * HB#``v 7i2` i?2 `2bT2+iBp2 _mbi Q#D2+i
RRk
;2ib /2bi`Qv2/X h?Bb +M #2 +?B2p2/ #v mM`2;Bbi2`BM; i?2 +HH#+F BM i?2 Q#D2+ib /2bi`m+iQ`
M/ /2bB;MBM; i?2 HB#``v BM rv i?i ;m`Mi22b i?i MQ +HH#+F rBHH #2 T2`7Q`K2/ 7i2`
/2`2;Bbi`iBQMX
9X3X8 GBMFBM;
h?2 link ii`B#mi2 QM extern #HQ+Fb T`QpB/2b i?2 #bB+ #mBH/BM; #HQ+F 7Q` BMbi`m+iBM; `mbi+ ?Qr
Bi rBHH HBMF iQ MiBp2 HB#``B2bX h?2`2 `2 irQ ++2Ti2/ 7Q`Kb Q7 i?2 HBMF ii`B#mi2 iQ/v,
#[link(name = "foo")]
#[link(name = "foo", kind = "bar")]
AM #Qi? Q7 i?2b2 +b2b- foo Bb i?2 MK2 Q7 i?2 MiBp2 HB#``v i?i r2`2 HBMFBM; iQ- M/ BM i?2
b2+QM/ +b2 bar Bb i?2 ivT2 Q7 MiBp2 HB#``v i?i i?2 +QKTBH2` Bb HBMFBM; iQX h?2`2 `2 +m``2MiHv
i?`22 FMQrM ivT2b Q7 MiBp2 HB#``B2b,
.vMKB+ @ #[link(name = "readline")]
aiiB+ @ #[link(name = "my_build_dependency", kind = "static")]
6`K2rQ`Fb @ #[link(name = "CoreFoundation", kind = "framework")]
LQi2 i?i 7`K2rQ`Fb `2 QMHv pBH#H2 QM Pas i`;2ibX
h?2 /Bz2`2Mi kind pHm2b `2 K2Mi iQ /Bz2`2MiBi2 ?Qr i?2 MiBp2 HB#``v T`iB+BTi2b BM HBMF@
;2X 6`QK HBMF;2 T2`bT2+iBp2- i?2 `mbi +QKTBH2` +`2i2b irQ ~pQ`b Q7 `iB7+ib, T`iBH
U`HB#fbiiB+HB#V M/ }MH U/vHB#f#BM`vVX LiBp2 /vMKB+ HB#``B2b M/ 7`K2rQ`Fb `2 T`QT@
;i2/ iQ i?2 }MH `iB7+i #QmM/`v- r?BH2 biiB+ HB#``B2b `2 MQi T`QT;i2/ i HHX
72r 2tKTH2b Q7 ?Qr i?Bb KQ/2H +M #2 mb2/ `2,
MiBp2 #mBH/ /2T2M/2M+vX aQK2iBK2b bQK2 *f*YY ;Hm2 Bb M22/2/ r?2M r`BiBM; bQK2
`mbi +Q/2- #mi /Bbi`B#miBQM Q7 i?2 *f*YY +Q/2 BM HB#``v 7Q`Ki Bb Dmbi #m`/2MX AM
i?Bb +b2- i?2 +Q/2 rBHH #2 `+?Bp2/ BMiQ libfoo.a M/ i?2M i?2 `mbi +`i2 rQmH/ /2+H`2
/2T2M/2M+v pB #[link(name = "foo", kind = "static")]X
_2;`/H2bb Q7 i?2 ~pQ` Q7 QmiTmi 7Q` i?2 +`i2- i?2 MiBp2 biiB+ HB#``v rBHH #2 BM+Hm/2/ BM i?2
QmiTmi- K2MBM; i?i /Bbi`B#miBQM Q7 i?2 MiBp2 biiB+ HB#``v Bb MQi M2+2bb`vX
MQ`KH /vMKB+ /2T2M/2M+vX *QKKQM bvbi2K HB#``B2b UHBF2 readlineV `2 pBH#H2 QM
H`;2 MmK#2` Q7 bvbi2Kb- M/ Q7i2M biiB+ +QTv Q7 i?2b2 HB#``B2b +MMQi #2 7QmM/X q?2M
i?Bb /2T2M/2M+v Bb BM+Hm/2/ BM `mbi +`i2- T`iBH i`;2ib UHBF2 `HB#bV rBHH MQi HBMF iQ i?2
HB#``v- #mi r?2M i?2 `HB# Bb BM+Hm/2/ BM }MH i`;2i UHBF2 #BM`vV- i?2 MiBp2 HB#``v rBHH
#2 HBMF2/ BMX
PM Pas- 7`K2rQ`Fb #2?p2 rBi? i?2 bK2 b2KMiB+b b /vMKB+ HB#``vX
9X3X 66A
9X3Xe
RRj
lMb72 #HQ+Fb
aQK2 QT2`iBQMb- HBF2 /2`272`2M+BM; mMb72 TQBMi2`b Q` +HHBM; 7mM+iBQMb i?i ?p2 #22M K`F2/
mMb72 `2 QMHv HHQr2/ BMbB/2 mMb72 #HQ+FbX lMb72 #HQ+Fb BbQHi2 mMb72iv M/ `2 T`QKBb2
iQ i?2 +QKTBH2` i?i i?2 mMb72iv /Q2b MQi H2F Qmi Q7 i?2 #HQ+FX
lMb72 7mM+iBQMb- QM i?2 Qi?2` ?M/- /p2`iBb2 Bi iQ i?2 rQ`H/X M mMb72 7mM+iBQM Bb r`Bii2M HBF2
i?Bb,
unsafe fn kaboom(ptr: *const i32) -> i32 { *ptr }
9X3Xd
unsafe
#HQ+F Q` MQi?2`
unsafe
7mM+iBQMX
6Q`2B;M SAb Q7i2M 2tTQ`i ;HQ#H p`B#H2 r?B+? +QmH/ /Q bQK2i?BM; HBF2 i`+F ;HQ#H bii2X AM
Q`/2` iQ ++2bb i?2b2 p`B#H2b- vQm /2+H`2 i?2K BM extern #HQ+Fb rBi? i?2 static F2vrQ`/,
# #![feature(libc)]
extern crate libc;
#[link(name = "readline")]
extern {
static rl_readline_version: libc::c_int;
}
fn main() {
println!("You have readline version {} installed.",
rl_readline_version as i32);
}
Hi2`MiBp2Hv- vQm Kv M22/ iQ Hi2` ;HQ#H bii2 T`QpB/2/ #v 7Q`2B;M BMi2`7+2X hQ /Q i?BbbiiB+b +M #2 /2+H`2/ rBi? mut bQ r2 +M Kmii2 i?2KX
# #![feature(libc)]
extern crate libc;
use std::ffi::CString;
use std::ptr;
#[link(name = "readline")]
extern {
static mut rl_prompt: *const libc::c_char;
}
fn main() {
let prompt = CString::new("[my-awesome-shell] $").unwrap();
RR9
LQi2 i?i HH BMi2`+iBQM rBi? static mut Bb mMb72- #Qi? `2/BM; M/ r`BiBM;X .2HBM; rBi?
;HQ#H Kmi#H2 bii2 `2[mB`2b ;`2i /2H Q7 +`2X
extern
stdcall
aapcs
cdecl
fastcall
Rust
rust-intrinsic
system
C
win64
JQbi Q7 i?2 #Bb BM i?Bb HBbi `2 b2H7@2tTHMiQ`v- #mi i?2 system #B Kv b22K HBiiH2 Q//X h?Bb
+QMbi`BMi b2H2+ib r?i2p2` i?2 TT`QT`Bi2 "A Bb 7Q` BMi2`QT2`iBM; rBi? i?2 i`;2ib HB#``B2bX
6Q` 2tKTH2- QM rBMjk rBi? t3e `+?Bi2+im`2- i?Bb K2Mb i?i i?2 #B mb2/ rQmH/ #2 stdcallX
PM t3ene9- ?Qr2p2`- rBM/Qrb mb2b i?2 C +HHBM; +QMp2MiBQM- bQ C rQmH/ #2 mb2/X h?Bb K2Mb
i?i BM Qm` T`2pBQmb 2tKTH2- r2 +QmH/ ?p2 mb2/ extern "system" { ... } iQ /2}M2 #HQ+F 7Q`
HH rBM/Qrb bvbi2Kb- MQi Dmbi t3e QM2bX
9X3X 66A
9X3XN
RR8
_mbi ;m`Mi22b i?i i?2 HvQmi Q7 struct Bb +QKTiB#H2 rBi? i?2 THi7Q`Kb `2T`2b2MiiBQM BM
* QMHv B7 i?2 #[repr(C)] ii`B#mi2 Bb TTHB2/ iQ BiX #[repr(C, packed)] +M #2 mb2/ iQ Hv Qmi
bi`m+i K2K#2`b rBi?Qmi T//BM;X #[repr(C)] +M HbQ #2 TTHB2/ iQ M 2MmKX
_mbib QrM2/ #Qt2b UBox<T>V mb2 MQM@MmHH#H2 TQBMi2`b b ?M/H2b r?B+? TQBMi iQ i?2 +QMiBM2/
Q#D2+iX >Qr2p2`- i?2v b?QmH/ MQi #2 KMmHHv +`2i2/ #2+mb2 i?2v `2 KM;2/ #v BMi2`MH
HHQ+iQ`bX _272`2M+2b +M b72Hv #2 bbmK2/ iQ #2 MQM@MmHH#H2 TQBMi2`b /B`2+iHv iQ i?2 ivT2X
>Qr2p2`- #`2FBM; i?2 #Q``Qr +?2+FBM; Q` Kmi#BHBiv `mH2b Bb MQi ;m`Mi22/ iQ #2 b72- bQ T`272`
mbBM; `r TQBMi2`b U*V B7 i?ib M22/2/ #2+mb2 i?2 +QKTBH2` +Mi KF2 b KMv bbmKTiBQMb
#Qmi i?2KX
o2+iQ`b M/ bi`BM;b b?`2 i?2 bK2 #bB+ K2KQ`v HvQmi- M/ miBHBiB2b `2 pBH#H2 BM i?2 vec
M/ str KQ/mH2b 7Q` rQ`FBM; rBi? * SAbX >Qr2p2`- bi`BM;b `2 MQi i2`KBMi2/ rBi? \0X A7 vQm
M22/ LlG@i2`KBMi2/ bi`BM; 7Q` BMi2`QT2`#BHBiv rBi? *- vQm b?QmH/ mb2 i?2 CString ivT2 BM
i?2 std::ffi KQ/mH2X
h?2 biM/`/ HB#``v BM+Hm/2b ivT2 HBb2b M/ 7mM+iBQM /2}MBiBQMb 7Q` i?2 * biM/`/ HB#``v BM
i?2 libc KQ/mH2- M/ _mbi HBMFb ;BMbi libc M/ libm #v /27mHiX
9X3XRy
*2`iBM ivT2b `2 /2}M2/ iQ MQi #2 nullX h?Bb BM+Hm/2b `272`2M+2b U&T- &mut TV- #Qt2b UBox<T>VM/ 7mM+iBQM TQBMi2`b Uextern "abi" fn()VX q?2M BMi2`7+BM; rBi? *- TQBMi2`b i?i KB;?i #2
MmHH `2 Q7i2M mb2/X b bT2+BH +b2- ;2M2`B+ enum i?i +QMiBMb 2t+iHv irQ p`BMib- QM2
Q7 r?B+? +QMiBMb MQ /i M/ i?2 Qi?2` +QMiBMBM; bBM;H2 }2H/- Bb 2HB;B#H2 7Q` i?2 MmHH#H2
TQBMi2` QTiBKBxiBQMX q?2M bm+? M 2MmK Bb BMbiMiBi2/ rBi? QM2 Q7 i?2 MQM@MmHH#H2 ivT2b- Bi
Bb `2T`2b2Mi2/ b bBM;H2 TQBMi2`- M/ i?2 MQM@/i p`BMi Bb `2T`2b2Mi2/ b i?2 MmHH TQBMi2`X aQ
Option<extern "C" fn(c_int) -> c_int> Bb ?Qr QM2 `2T`2b2Mib MmHH#H2 7mM+iBQM TQBMi2` mbBM;
i?2 * "AX
9X3XRR
uQm Kv rBb? iQ +QKTBH2 _mbi +Q/2 BM rv bQ i?i Bi +M #2 +HH2/ 7`QK *X h?Bb Bb 7B`Hv 2bv#mi `2[mB`2b 72r i?BM;b,
#[no_mangle]
pub extern fn hello_rust() -> *const u8 {
"Hello, world!\0".as_ptr()
}
# fn main() {}
h?2 extern KF2b i?Bb 7mM+iBQM /?2`2 iQ i?2 * +HHBM; +QMp2MiBQM- b /Bb+mbb2/ #Qp2 BM 6Q`2B;M
*HHBM; *QMp2MiBQMbky X h?2 no_mangle ii`B#mi2 im`Mb Qz _mbib MK2 KM;HBM;- bQ i?i Bi Bb
2bB2` iQ HBMF iQX
ky 77BX?iKHO7Q`2B;M@+HHBM;@+QMp2MiBQMb
RRe
9XN
h?2 BorrowkR M/ AsRefkk i`Bib `2 p2`v bBKBH`- #mi /Bz2`2MiX >2`2b [mB+F `27`2b?2` QM r?i
i?2b2 irQ i`Bib K2MX
9XNXR "Q``Qr
h?2 Borrow i`Bi Bb mb2/ r?2M vQm`2 r`BiBM; /ibi`m+im`2- M/ vQm rMi iQ mb2 2Bi?2` M
QrM2/ Q` #Q``Qr2/ ivT2 b bvMQMvKQmb 7Q` bQK2 Tm`TQb2X
6Q` 2tKTH2-
HashMapkj
?b
get
Borrow,
h?2 K T`K2i2` Bb i?2 ivT2 Q7 F2v i?2 HashMap mb2bX aQ- HQQFBM; i i?2 bB;Mim`2 Q7 get() ;BMr2 +M mb2 get() r?2M i?2 F2v BKTH2K2Mib Borrow<Q>X h?i rv- r2 +M KF2 HashMap r?B+?
mb2b String F2vb- #mi mb2 &strb r?2M r2`2 b2`+?BM;,
use std::collections::HashMap;
let mut map = HashMap::new();
map.insert("Foo".to_string(), 42);
assert_eq!(map.get("Foo"), Some(&42));
6Q` KQbi ivT2b- r?2M vQm rMi iQ iF2 M QrM2/ Q` #Q``Qr2/ ivT2- &T Bb 2MQm;?X "mi QM2
`2 r?2`2 Borrow Bb 2z2+iBp2 Bb r?2M i?2`2b KQ`2 i?M QM2 FBM/ Q7 #Q``Qr2/ pHm2X aHB+2b `2
M `2 r?2`2 i?Bb Bb 2bT2+BHHv i`m2, vQm +M ?p2 #Qi? M &[T] Q` &mut [T]X A7 r2 rMi2/ iQ
++2Ti #Qi? Q7 i?2b2 ivT2b- Borrow Bb mT 7Q` Bi,
use std::borrow::Borrow;
use std::fmt::Display;
fn foo<T: Borrow<i32> + Display>(a: T) {
println!("a is borrowed: {}", a);
kR ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/f#Q``Qrfi`BiX"Q``QrX?iKH
kk ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/f+QMp2`ifi`BiXb_27X?iKH
kj ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/f+QHH2+iBQMbfbi`m+iX>b?JTX?iKH
k9 ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/f+QHH2+iBQMbfbi`m+iX>b?JTX?iKHOK2i?Q/X;2i
RRd
}
let mut i = 5;
foo(&i);
foo(&mut i);
9XNXk
a is borrowed: 5
irB+2X
b_27
h?2 AsRef i`Bi Bb +QMp2`bBQM i`BiX Aib mb2/ 7Q` +QMp2`iBM; bQK2 pHm2 iQ `272`2M+2 BM ;2M2`B+
+Q/2X GBF2 i?Bb,
let s = "Hello".to_string();
fn foo<T: AsRef<str>>(s: T) {
let slice = s.as_ref();
}
9XNXj
q2 +M b22 ?Qr i?2v`2 FBM/ Q7 i?2 bK2, i?2v #Qi? /2H rBi? QrM2/ M/ #Q``Qr2/ p2`bBQMb Q7
bQK2 ivT2X >Qr2p2`- i?2v`2 #Bi /Bz2`2MiX
*?QQb2 Borrow r?2M vQm rMi iQ #bi`+i Qp2` /Bz2`2Mi FBM/b Q7 #Q``QrBM;- Q` r?2M vQm`2
#mBH/BM; /ibi`m+im`2 i?i i`2ib QrM2/ M/ #Q``Qr2/ pHm2b BM 2[mBpH2Mi rvb- bm+? b
?b?BM; M/ +QKT`BbQMX
*?QQb2 AsRef r?2M vQm rMi iQ +QMp2`i bQK2i?BM; iQ `272`2M+2 /B`2+iHv- M/ vQm`2 r`BiBM;
;2M2`B+ +Q/2X
9XRy
_2H2b2 *?MM2Hb
h?2 _mbi T`QD2+i mb2b +QM+2Ti +HH2/ `2H2b2 +?MM2Hb iQ KM;2 `2H2b2bX Aib BKTQ`iMi iQ
mM/2`biM/ i?Bb T`Q+2bb iQ +?QQb2 r?B+? p2`bBQM Q7 _mbi vQm` T`QD2+i b?QmH/ mb2X
9XRyXR
Pp2`pB2r
RR3
L2r MB;?iHv `2H2b2b `2 +`2i2/ QM+2 /vX 1p2`v bBt r22Fb- i?2 Hi2bi MB;?iHv `2H2b2 Bb
T`QKQi2/ iQ "2iX i i?i TQBMi- Bi rBHH QMHv `2+2Bp2 Ti+?2b iQ }t b2`BQmb 2``Q`bX aBt r22Fb
Hi2`- i?2 #2i Bb T`QKQi2/ iQ ai#H2- M/ #2+QK2b i?2 M2ti `2H2b2 Q7 1.xX
h?Bb T`Q+2bb ?TT2Mb BM T`HH2HX aQ 2p2`v bBt r22Fb- QM i?2 bK2 /v- MB;?iHv ;Q2b iQ #2i#2i ;Q2b iQ bi#H2X q?2M 1.x Bb `2H2b2/- i i?2 bK2 iBK2- 1.(x + 1)-beta Bb `2H2b2/- M/ i?2
MB;?iHv #2+QK2b i?2 }`bi p2`bBQM Q7 1.(x + 2)-nightlyX
8XR
o`B#H2 "BM/BM;b
oB`imHHv 2p2`v MQM@>2HHQ qQ`H/ _mbi T`Q;`K mb2b p`B#H2 #BM/BM;bX h?2v HQQF HBF2 i?Bb,
fn main() {
let x = 5;
}
SmiiBM; fn main() { BM 2+? 2tKTH2 Bb #Bi i2/BQmb- bQ r2HH H2p2 i?i Qmi BM i?2 7mim`2X A7 vQm`2
7QHHQrBM; HQM;- KF2 bm`2 iQ 2/Bi vQm` main() 7mM+iBQM- `i?2` i?M H2pBM; Bi QzX Pi?2`rBb2vQmHH ;2i M 2``Q`X
AM KMv HM;m;2b- i?Bb Bb +HH2/ p`B#H2- #mi _mbib p`B#H2 #BM/BM;b ?p2 72r i`B+Fb mT
i?2B` bH22p2bX 6Q` 2tKTH2 i?2 H27i@?M/ bB/2 Q7 let 2tT`2bbBQM Bb Tii2`M Ub2+iBQM 8XR8T;2 R8NV- MQi Dmbi p`B#H2 MK2X h?Bb K2Mb r2 +M /Q i?BM;b HBF2,
let (x, y) = (1, 2);
7i2` i?Bb 2tT`2bbBQM Bb 2pHmi2/- x rBHH #2 QM2- M/ y rBHH #2 irQX Sii2`Mb `2 `2HHv TQr2`7mHM/ ?p2 i?2B` QrM b2+iBQM Ub2+iBQM 8XR8- T;2 R8NV BM i?2 #QQFX q2 /QMi M22/ i?Qb2 72im`2b
7Q` MQr- bQ r2HH Dmbi F22T i?Bb BM i?2 #+F Q7 Qm` KBM/b b r2 ;Q 7Q`r`/X
_mbi Bb biiB+HHv ivT2/ HM;m;2- r?B+? K2Mb i?i r2 bT2+B7v Qm` ivT2b mT 7`QMi- M/ i?2v`2
+?2+F2/ i +QKTBH2 iBK2X aQ r?v /Q2b Qm` }`bi 2tKTH2 +QKTBH2\ q2HH- _mbi ?b i?Bb i?BM; +HH2/
Rky
ivT2 BM72`2M+2X A7 Bi +M };m`2 Qmi r?i i?2 ivT2 Q7 bQK2i?BM; Bb- _mbi /Q2bMi `2[mB`2 vQm iQ
+imHHv ivT2 Bi QmiX
q2 +M // i?2 ivT2 B7 r2 rMi iQ- i?Qm;?X hvT2b +QK2 7i2` +QHQM U:V,
let x: i32 = 5;
A7 A bF2/ vQm iQ `2/ i?Bb Qmi HQm/ iQ i?2 `2bi Q7 i?2 +Hbb- vQm/ bv x Bb #BM/BM; rBi? i?2
ivT2 i32 M/ i?2 pHm2 fiveX
AM i?Bb +b2 r2 +?Qb2 iQ `2T`2b2Mi x b jk@#Bi bB;M2/ BMi2;2`X _mbi ?b KMv /Bz2`2Mi T`BKBiBp2
BMi2;2` ivT2bX h?2v #2;BM rBi? i 7Q` bB;M2/ BMi2;2`b M/ u 7Q` mMbB;M2/ BMi2;2`bX h?2 TQbbB#H2
BMi2;2` bBx2b `2 3- Re- jk- M/ e9 #BibX
AM 7mim`2 2tKTH2b- r2 Kv MMQii2 i?2 ivT2 BM +QKK2MiX h?2 2tKTH2b rBHH HQQF HBF2 i?Bb,
fn main() {
let x = 5; // x: i32
}
LQi2 i?2 bBKBH`BiB2b #2ir22M i?Bb MMQiiBQM M/ i?2 bvMit vQm mb2 rBi? letX AM+Hm/BM; i?2b2
FBM/b Q7 +QKK2Mib Bb MQi B/BQKiB+ _mbi- #mi r2HH Q++bBQMHHv BM+Hm/2 i?2K iQ ?2HT vQm mM/2`@
biM/ r?i i?2 ivT2b i?i _mbi BM72`b `2X
"v /27mHi- #BM/BM;b `2 BKKmi#H2X h?Bb +Q/2 rBHH MQi +QKTBH2,
let x = 5;
x = 10;
mut,
h?2`2 Bb MQ bBM;H2 `2bQM i?i #BM/BM;b `2 BKKmi#H2 #v /27mHi- #mi r2 +M i?BMF #Qmi Bi
i?`Qm;? QM2 Q7 _mbib T`BK`v 7Q+mb2b, b72ivX A7 vQm 7Q`;2i iQ bv mut- i?2 +QKTBH2` rBHH +i+?
Bi- M/ H2i vQm FMQr i?i vQm ?p2 Kmii2/ bQK2i?BM; vQm Kv MQi ?p2 BMi2M/2/ iQ Kmii2X
A7 #BM/BM;b r2`2 Kmi#H2 #v /27mHi- i?2 +QKTBH2` rQmH/ MQi #2 #H2 iQ i2HH vQm i?BbX A7 vQm /B/
BMi2M/ KmiiBQM- i?2M i?2 bQHmiBQM Bb [mBi2 2bv, // mutX
h?2`2 `2 Qi?2` ;QQ/ `2bQMb iQ pQB/ Kmi#H2 bii2 r?2M TQbbB#H2- #mi i?2v`2 Qmi Q7 i?2 b+QT2
Q7 i?Bb ;mB/2X AM ;2M2`H- vQm +M Q7i2M pQB/ 2tTHB+Bi KmiiBQM- M/ bQ Bi Bb T`272`#H2 BM _mbiX
h?i bB/- bQK2iBK2b- KmiiBQM Bb r?i vQm M22/- bQ Bib MQi p2`#Qi2MX
RkR
G2ib ;2i #+F iQ #BM/BM;bX _mbi p`B#H2 #BM/BM;b ?p2 QM2 KQ`2 bT2+i i?i /Bz2`b 7`QK Qi?2`
HM;m;2b, #BM/BM;b `2 `2[mB`2/ iQ #2 BMBiBHBx2/ rBi? pHm2 #27Q`2 vQm`2 HHQr2/ iQ mb2 i?2KX
G2ib i`v Bi QmiX *?M;2 vQm`
src/main.rs
fn main() {
let x: i32;
println!("Hello world!");
}
uQm +M mb2 cargo build QM i?2 +QKKM/ HBM2 iQ #mBH/ BiX uQmHH ;2i r`MBM;- #mi Bi rBHH biBHH
T`BMi >2HHQ- rQ`H/5,
Compiling hello_world v0.0.1 (file:///home/you/projects/hello_world)
src/main.rs:2:9: 2:10 warning: unused variable: `x`, #[warn(unused_variable)]
on by default
src/main.rs:2
let x: i32;
^
_mbi r`Mb mb i?i r2 M2p2` mb2 i?2 p`B#H2 #BM/BM;- #mi bBM+2 r2 M2p2` mb2 Bi- MQ ?`K- MQ 7QmHX
h?BM;b +?M;2 B7 r2 i`v iQ +imHHv mb2 i?Bb x- ?Qr2p2`X G2ib /Q i?iX *?M;2 vQm` T`Q;`K iQ
HQQF HBF2 i?Bb,
fn main() {
let x: i32;
println!("The value of x is: {}", x);
}
_mbi rBHH MQi H2i mb mb2 pHm2 i?i ?b MQi #22M BMBiBHBx2/X L2ti- H2ib iHF #Qmi i?Bb bimz
r2p2 //2/ iQ println!X
A7 vQm BM+Hm/2 irQ +m`Hv #`+2b U{}- bQK2 +HH i?2K KQmbi+?2bV BM vQm` bi`BM; iQ T`BMi- _mbi rBHH
BMi2`T`2i i?Bb b `2[m2bi iQ BMi2`TQHi2 bQK2 bQ`i Q7 pHm2X ai`BM; BMi2`TQHiBQM Bb +QKTmi2`
Rkk
b+B2M+2 i2`K i?i K2Mb biB+F BM i?2 KB//H2 Q7 bi`BM;X q2 // +QKK- M/ i?2M x- iQ
BM/B+i2 i?i r2 rMi x iQ #2 i?2 pHm2 r2`2 BMi2`TQHiBM;X h?2 +QKK Bb mb2/ iQ b2T`i2
`;mK2Mib r2 Tbb iQ 7mM+iBQMb M/ K+`Qb- B7 vQm`2 TbbBM; KQ`2 i?M QM2X
q?2M vQm Dmbi mb2 i?2 +m`Hv #`+2b- _mbi rBHH ii2KTi iQ /BbTHv i?2 pHm2 BM K2MBM;7mH rv
#v +?2+FBM; Qmi Bib ivT2X A7 vQm rMi iQ bT2+B7v i?2 7Q`Ki BM KQ`2 /2iBH2/ KMM2`- i?2`2 `2
rB/2 MmK#2` Q7 QTiBQMb pBH#H2R X 6Q` MQr- r2HH Dmbi biB+F iQ i?2 /27mHi, BMi2;2`b `2Mi p2`v
+QKTHB+i2/ iQ T`BMiX
8Xk
6mM+iBQMb
main
7mM+iBQM,
fn main() {
}
h?Bb Bb i?2 bBKTH2bi TQbbB#H2 7mM+iBQM /2+H`iBQMX b r2 K2MiBQM2/ #27Q`2- fn bvb i?Bb Bb
7mM+iBQM- 7QHHQr2/ #v i?2 MK2- bQK2 T`2Mi?2b2b #2+mb2 i?Bb 7mM+iBQM iF2b MQ `;mK2MibM/ i?2M bQK2 +m`Hv #`+2b iQ BM/B+i2 i?2 #Q/vX >2`2b 7mM+iBQM MK2/ foo,
fn foo() {
}
aQ- r?i #Qmi iFBM; `;mK2Mib\ >2`2b 7mM+iBQM i?i T`BMib MmK#2`,
fn print_number(x: i32) {
println!("x is: {}", x);
}
print_number,
fn main() {
print_number(5);
}
fn print_number(x: i32) {
println!("x is: {}", x);
}
let
>2`2b +QKTH2i2 T`Q;`K i?i //b irQ MmK#2`b iQ;2i?2` M/ T`BMib i?2K,
R ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/f7KifBM/2tX?iKH
8XkX 6lL*hAPLa
Rkj
fn main() {
print_sum(5, 6);
}
fn print_sum(x: i32, y: i32) {
println!("sum is: {}", x + y);
}
uQm b2T`i2 `;mK2Mib rBi? +QKK- #Qi? r?2M vQm +HH i?2 7mM+iBQM- b r2HH b r?2M vQm
/2+H`2 BiX
lMHBF2
let-
vQm Kmbi /2+H`2 i?2 ivT2b Q7 7mM+iBQM `;mK2MibX h?Bb /Q2b MQi rQ`F,
fn print_sum(x, y) {
println!("sum is: {}", x + y);
}
h?Bb Bb /2HB#2`i2 /2bB;M /2+BbBQMX q?BH2 7mHH@T`Q;`K BM72`2M+2 Bb TQbbB#H2- HM;m;2b r?B+?
?p2 Bi- HBF2 >bF2HH- Q7i2M bm;;2bi i?i /Q+mK2MiBM; vQm` ivT2b 2tTHB+BiHv Bb #2bi@T`+iB+2X q2
;`22 i?i 7Q`+BM; 7mM+iBQMb iQ /2+H`2 ivT2b r?BH2 HHQrBM; 7Q` BM72`2M+2 BMbB/2 Q7 7mM+iBQM #Q/B2b
Bb rQM/2`7mH br22i bTQi #2ir22M 7mHH BM72`2M+2 M/ MQ BM72`2M+2X
q?i #Qmi `2im`MBM; pHm2\ >2`2b 7mM+iBQM i?i //b QM2 iQ M BMi2;2`,
fn add_one(x: i32) -> i32 {
x + 1
}
_mbi 7mM+iBQMb `2im`M 2t+iHv QM2 pHm2- M/ vQm /2+H`2 i?2 ivT2 7i2` M ``Qr- r?B+? Bb
/b? U-V 7QHHQr2/ #v ;`2i2`@i?M bB;M U>VX h?2 Hbi HBM2 Q7 7mM+iBQM /2i2`KBM2b r?i Bi
`2im`MbX uQmHH MQi2 i?2 H+F Q7 b2KB+QHQM ?2`2X A7 r2 //2/ Bi BM,
fn add_one(x: i32) -> i32 {
x + 1;
}
Rk9
h?Bb `2p2Hb irQ BMi2`2biBM; i?BM;b #Qmi _mbi, Bi Bb M 2tT`2bbBQM@#b2/ HM;m;2- M/ b2KB+QHQMb
`2 /Bz2`2Mi 7`QK b2KB+QHQMb BM Qi?2` +m`Hv #`+2 M/ b2KB+QHQM@#b2/ HM;m;2bX h?2b2 irQ
i?BM;b `2 `2Hi2/X
1tT`2bbBQMb pbX aii2K2Mib
_mbi Bb T`BK`BHv M 2tT`2bbBQM@#b2/ HM;m;2X h?2`2 `2 QMHv irQ FBM/b Q7 bii2K2Mib- M/
2p2`vi?BM; 2Hb2 Bb M 2tT`2bbBQMX
aQ r?ib i?2 /Bz2`2M+2\ 1tT`2bbBQMb `2im`M pHm2- M/ bii2K2Mib /Q MQiX h?ib r?v r2 2M/
mT rBi? MQi HH +QMi`QH Ti?b `2im`M pHm2 ?2`2, i?2 bii2K2Mi x + 1; /Q2bMi `2im`M pHm2X
h?2`2 `2 irQ FBM/b Q7 bii2K2Mib BM _mbi, /2+H`iBQM bii2K2Mib M/ 2tT`2bbBQM bii2K2MibX
1p2`vi?BM; 2Hb2 Bb M 2tT`2bbBQMX G2ib iHF #Qmi /2+H`iBQM bii2K2Mib }`biX
AM bQK2 HM;m;2b- p`B#H2 #BM/BM;b +M #2 r`Bii2M b 2tT`2bbBQMb- MQi Dmbi bii2K2MibX GBF2
_m#v,
x = y = 5
AM _mbi- ?Qr2p2`- mbBM; let iQ BMi`Q/m+2 #BM/BM; Bb MQi M 2tT`2bbBQMX h?2 7QHHQrBM; rBHH
T`Q/m+2 +QKTBH2@iBK2 2``Q`,
let x = (let y = 5); // expected identifier, found keyword `let`
h?2 +QKTBH2` Bb i2HHBM; mb ?2`2 i?i Bi rb 2tT2+iBM; iQ b22 i?2 #2;BMMBM; Q7 M 2tT`2bbBQM- M/
let +M QMHv #2;BM bii2K2Mi- MQi M 2tT`2bbBQMX
LQi2 i?i bbB;MBM; iQ M H`2/v@#QmM/ p`B#H2 U2X;X y = 5V Bb biBHH M 2tT`2bbBQM- Hi?Qm;? Bib
pHm2 Bb MQi T`iB+mH`Hv mb27mHX lMHBF2 Qi?2` HM;m;2b r?2`2 M bbB;MK2Mi 2pHmi2b iQ i?2
bbB;M2/ pHm2 U2X;X 5 BM i?2 T`2pBQmb 2tKTH2V- BM _mbi i?2 pHm2 Q7 M bbB;MK2Mi Bb M 2KTiv
imTH2 (),
let mut y = 5;
let x = (y = 6);
h?2 b2+QM/ FBM/ Q7 bii2K2Mi BM _mbi Bb i?2 2tT`2bbBQM bii2K2MiX Aib Tm`TQb2 Bb iQ im`M Mv
2tT`2bbBQM BMiQ bii2K2MiX AM T`+iB+H i2`Kb- _mbib ;`KK` 2tT2+ib bii2K2Mib iQ 7QHHQr
Qi?2` bii2K2MibX h?Bb K2Mb i?i vQm mb2 b2KB+QHQMb iQ b2T`i2 2tT`2bbBQMb 7`QK 2+? Qi?2`X
h?Bb K2Mb i?i _mbi HQQFb HQi HBF2 KQbi Qi?2` HM;m;2b i?i `2[mB`2 vQm iQ mb2 b2KB+QHQMb
i i?2 2M/ Q7 2p2`v HBM2- M/ vQm rBHH b22 b2KB+QHQMb i i?2 2M/ Q7 HKQbi 2p2`v HBM2 Q7 _mbi +Q/2
vQm b22X
q?i Bb i?Bb 2t+2TiBQM i?i KF2b mb bv HKQbi\ uQm br Bi H`2/v- BM i?Bb +Q/2,
8XkX 6lL*hAPLa
Rk8
Pm` 7mM+iBQM +HBKb iQ `2im`M M i32- #mi rBi? b2KB+QHQM- Bi rQmH/ `2im`M () BMbi2/X _mbi
`2HBx2b i?Bb T`Q##Hv BbMi r?i r2 rMi- M/ bm;;2bib `2KQpBM; i?2 b2KB+QHQM BM i?2 2``Q` r2
br #27Q`2X
1`Hv `2im`Mb
"mi r?i #Qmi 2`Hv `2im`Mb\ _mbi /Q2b ?p2 F2vrQ`/ 7Q` i?i-
return,
lbBM;
return
h?2 T`2pBQmb /2}MBiBQM rBi?Qmi return Kv HQQF #Bi bi`M;2 B7 vQm ?p2Mi rQ`F2/ BM M
2tT`2bbBQM@#b2/ HM;m;2 #27Q`2- #mi Bi #2+QK2b BMimBiBp2 Qp2` iBK2X
.Bp2`;BM; 7mM+iBQMb
_mbi ?b bQK2 bT2+BH bvMit 7Q` /Bp2`;BM; 7mM+iBQMb- r?B+? `2 7mM+iBQMb i?i /Q MQi `2im`M,
fn diverges() -> ! {
panic!("This function never returns!");
}
println!()- panic!()
"2+mb2 i?Bb 7mM+iBQM rBHH +mb2 +`b?- Bi rBHH M2p2` `2im`M- M/ bQ Bi ?b i?2 ivT2 !- r?B+? Bb
`2/ /Bp2`;2bX /Bp2`;BM; 7mM+iBQM +M #2 mb2/ b Mv ivT2,
# fn diverges() -> ! {
#
# }
let x: i32 = diverges();
let x: String = diverges();
Rke
8Xj
S`BKBiBp2 hvT2b
h?2 _mbi HM;m;2 ?b MmK#2` Q7 ivT2b i?i `2 +QMbB/2`2/ T`BKBiBp2X h?Bb K2Mb i?i i?2v`2
#mBHi@BM iQ i?2 HM;m;2X _mbi Bb bi`m+im`2/ BM bm+? rv i?i i?2 biM/`/ HB#``v HbQ T`QpB/2b
MmK#2` Q7 mb27mH ivT2b #mBHi QM iQT Q7 i?2b2 QM2b- b r2HH- #mi i?2b2 `2 i?2 KQbi T`BKBiBp2X
8XjXR "QQH2Mb
_mbi ?b #mBHi BM #QQH2M ivT2- MK2/
boolX
true
M/
false,
let x = true;
let y: bool = false;
if
8XjXk
h?2
U'V
char
boolb
char
charb
let x = 'x';
let two_hearts = '';
charb
char
u16
Bb M mMbB;M2/
>2`2b HBbi Q7 i?2 /Bz2`2Mi MmK2`B+ ivT2b- rBi? HBMFb iQ i?2B` /Q+mK2MiiBQM BM i?2 biM/`/
HB#``v,
k ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fT`BKBiBp2X#QQHX?iKH
j ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fT`BKBiBp2X+?`X?iKH
Rkd
B39
BRe8
Bjke
Be9d
m33
mReN
mjkRy
me9RR
BbBx2Rk
mbBx2Rj
7jkR9
7e9R8
Bb 7Q` BMi2;2`X aQ
u8
Bb
16-
8 ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fT`BKBiBp2XBReX?iKH
e ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fT`BKBiBp2XBjkX?iKH
d ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fT`BKBiBp2XBe9X?iKH
3 ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fT`BKBiBp2Xm3X?iKH
N ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fT`BKBiBp2XmReX?iKH
Ry ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fT`BKBiBp2XmjkX?iKH
RR ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fT`BKBiBp2Xme9X?iKH
Rk ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fT`BKBiBp2XBbBx2X?iKH
Rj ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fT`BKBiBp2XmbBx2X?iKH
R9 ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fT`BKBiBp2X7jkX?iKH
R8 ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fT`BKBiBp2X7e9X?iKH
Rk3
6HQiBM;@TQBMi ivT2b
_mbi HbQ ?b irQ ~QiBM; TQBMi ivT2b,
/Qm#H2 T`2+BbBQM MmK#2`bX
f32
M/
f64X
8XjX9 ``vb
GBF2 KMv T`Q;`KKBM; HM;m;2b- _mbi ?b HBbi ivT2b iQ `2T`2b2Mi b2[m2M+2 Q7 i?BM;bX h?2
KQbi #bB+ Bb i?2 ``v- }t2/@bBx2 HBbi Q7 2H2K2Mib Q7 i?2 bK2 ivT2X "v /27mHi- ``vb `2
BKKmi#H2X
let a = [1, 2, 3]; // a: [i32; 3]
let mut m = [1, 2, 3]; // m: [i32; 3]
``vb ?p2 ivT2 [T; N]X q2HH iHF #Qmi i?Bb T MQiiBQM BM i?2 ;2M2`B+b b2+iBQM Ub2+iBQM 8XRNT;2 RdRVX h?2 N Bb +QKTBH2@iBK2 +QMbiMi- 7Q` i?2 H2M;i? Q7 i?2 ``vX
h?2`2b b?Q`i?M/ 7Q` BMBiBHBxBM; 2+? 2H2K2Mi Q7 M ``v iQ i?2 bK2 pHm2X AM i?Bb 2tKTH22+? 2H2K2Mi Q7 a rBHH #2 BMBiBHBx2/ iQ 0,
let a = [0; 20]; // a: [i32; 20]
rBi?
a.len(),
am#b+`BTib bi`i i x2`Q- HBF2 BM KQbi T`Q;`KKBM; HM;m;2b- bQ i?2 }`bi MK2 Bb names[0] M/
i?2 b2+QM/ MK2 Bb names[1]X h?2 #Qp2 2tKTH2 T`BMib The second name is: BrianX A7 vQm i`v
iQ mb2 bm#b+`BTi i?i Bb MQi BM i?2 ``v- vQm rBHH ;2i M 2``Q`, ``v ++2bb Bb #QmM/b@+?2+F2/ i
`mM@iBK2X am+? 2``Mi ++2bb Bb i?2 bQm`+2 Q7 KMv #m;b BM Qi?2` bvbi2Kb T`Q;`KKBM; HM;m;2bX
uQm +M }M/ KQ`2 /Q+mK2MiiBQM 7Q`
arrayb
8XjX8 aHB+2b
bHB+2 Bb `272`2M+2 iQ UQ` pB2r BMiQV MQi?2` /i bi`m+im`2X h?2v `2 mb27mH 7Q` HHQrBM;
b72- 2{+B2Mi ++2bb iQ TQ`iBQM Q7 M ``v rBi?Qmi +QTvBM;X 6Q` 2tKTH2- vQm KB;?i rMi iQ
`272`2M+2 Dmbi QM2 HBM2 Q7 }H2 `2/ BMiQ K2KQ`vX "v Mim`2- bHB+2 Bb MQi +`2i2/ /B`2+iHv- #mi
Re ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fT`BKBiBp2X``vX?iKH
RkN
7`QK M 2tBbiBM; p`B#H2X aHB+2b ?p2 H2M;i?- +M #2 Kmi#H2 Q` MQi- M/ BM KMv rvb #2?p2
HBF2 ``vb,
let a = [0, 1, 2, 3, 4];
let middle = &a[1..4]; // A slice of a: just the elements 1, 2, and 3
let complete = &a[..]; // A slice containing all of the elements in a
&[T]X
uQm +M }M/ KQ`2 /Q+mK2MiiBQM 7Q` bHB+2b BM i?2 biM/`/ HB#``v /Q+mK2MiiBQMRd X
8XjXe
str
_mbib str ivT2 Bb i?2 KQbi T`BKBiBp2 bi`BM; ivT2X b M mMbBx2/ ivT2 Ub2+iBQM 8Xjk- T;2 kR8VBib MQi p2`v mb27mH #v Bib2H7- #mi #2+QK2b mb27mH r?2M TH+2/ #2?BM/ `272`2M+2- HBF2 &str
Ub2+iBQM 8XR3- T;2 ReNVX b bm+?- r2HH Dmbi H2p2 Bi i i?iX
uQm +M }M/ KQ`2 /Q+mK2MiiBQM 7Q`
8XjXd
str
hmTH2b
h?2 T`2Mi?2b2b M/ +QKKb 7Q`K i?Bb irQ@H2M;i? imTH2X >2`2b i?2 bK2 +Q/2- #mi rBi? i?2
ivT2 MMQii2/,
let x: (i32, &str) = (1, "hello");
b vQm +M b22- i?2 ivT2 Q7 imTH2 HQQFb Dmbi HBF2 i?2 imTH2- #mi rBi? 2+? TQbBiBQM ?pBM;
ivT2 MK2 `i?2` i?M i?2 pHm2X *`27mH `2/2`b rBHH HbQ MQi2 i?i imTH2b `2 ?2i2`Q;2M2Qmb,
r2 ?p2 M i32 M/ &str BM i?Bb imTH2X AM bvbi2Kb T`Q;`KKBM; HM;m;2b- bi`BM;b `2 #Bi
KQ`2 +QKTH2t i?M BM Qi?2` HM;m;2bX 6Q` MQr- Dmbi `2/ &str b bi`BM; bHB+2- M/ r2HH H2`M
KQ`2 bQQMX
uQm +M bbB;M QM2 imTH2 BMiQ MQi?2`- B7 i?2v ?p2 i?2 bK2 +QMiBM2/ ivT2b M/ `BivRN X hmTH2b
?p2 i?2 bK2 `Biv r?2M i?2v ?p2 i?2 bK2 H2M;i?X
let mut x = (1, 2); // x: (i32, i32)
let y = (2, 3); // y: (i32, i32)
x = y;
uQm +M ++2bb i?2 }2H/b BM imTH2 i?`Qm;? /2bi`m+im`BM; H2iX >2`2b M 2tKTH2,
Rd ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fT`BKBiBp2XbHB+2X?iKH
R3 ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fT`BKBiBp2Xbi`X?iKH
RN ;HQbb`vX?iKHO`Biv
Rjy
_2K2K#2` #27Q`2 Ub2+iBQM 8XR- T;2 RRNV r?2M A bB/ i?2 H27i@?M/ bB/2 Q7 let bii2K2Mi rb
KQ`2 TQr2`7mH i?M Dmbi bbB;MBM; #BM/BM;\ >2`2 r2 `2X q2 +M Tmi Tii2`M QM i?2 H27i@?M/
bB/2 Q7 i?2 let- M/ B7 Bi Ki+?2b mT iQ i?2 `B;?i@?M/ bB/2- r2 +M bbB;M KmHiBTH2 #BM/BM;b i
QM+2X AM i?Bb +b2- let /2bi`m+im`2b Q` #`2Fb mT i?2 imTH2- M/ bbB;Mb i?2 #Bib iQ i?`22
#BM/BM;bX
h?Bb Tii2`M Bb p2`v TQr2`7mH- M/ r2HH b22 Bi `2T2i2/ KQ`2 Hi2`X
uQm +M /BbK#B;mi2 bBM;H2@2H2K2Mi imTH2 7`QK pHm2 BM T`2Mi?2b2b rBi? +QKK,
(0,); // single-element tuple
(0); // zero in parentheses
hmTH2 AM/2tBM;
uQm +M HbQ ++2bb }2H/b Q7 imTH2 rBi? BM/2tBM; bvMit,
let tuple = (1, 2, 3);
let x = tuple.0;
let y = tuple.1;
let z = tuple.2;
println!("x is {}", x);
GBF2 ``v BM/2tBM;- Bi bi`ib i x2`Q- #mi mMHBF2 ``v BM/2tBM;- Bi mb2b .- `i?2` i?M
uQm +M }M/ KQ`2 /Q+mK2MiiBQM 7Q` imTH2b BM i?2 biM/`/ HB#``v /Q+mK2MiiBQMky X
8XjX3 6mM+iBQMb
6mM+iBQMb HbQ ?p2 ivT25 h?2v HQQF HBF2 i?Bb,
fn foo(x: i32) -> i32 { x }
let x: fn(i32) -> i32 = foo;
AM i?Bb +b2-
ky ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fT`BKBiBp2XimTH2X?iKH
i32
M/ `2im`Mb M
i32X
[]bX
8X9X *PJJ1Lha
8X9
RjR
*QKK2Mib
LQr i?i r2 ?p2 bQK2 7mM+iBQMb- Bib ;QQ/ B/2 iQ H2`M #Qmi +QKK2MibX *QKK2Mib `2
MQi2b i?i vQm H2p2 iQ Qi?2` T`Q;`KK2`b iQ ?2HT 2tTHBM i?BM;b #Qmi vQm` +Q/2X h?2 +QKTBH2`
KQbiHv B;MQ`2b i?2KX
_mbi ?b irQ FBM/b Q7 +QKK2Mib i?i vQm b?QmH/ +`2 #Qmi, HBM2 +QKK2Mib M/ /Q+ +QKK2MibX
// Line comments are anything after
//
h?2 Qi?2` FBM/ Q7 +QKK2Mi Bb /Q+ +QKK2MiX .Q+ +QKK2Mib mb2 /// BMbi2/ Q7 //- M/ bmTTQ`i
J`F/QrM MQiiBQM BMbB/2,
/// Adds one to the number given.
///
/// # Examples
///
/// ```
/// let five = 5;
///
/// assert_eq!(6, add_one(5));
/// ```
fn add_one(x: i32) -> i32 {
x + 1
}
q?2M r`BiBM; /Q+ +QKK2Mib- T`QpB/BM; bQK2 2tKTH2b Q7 mb;2 Bb p2`v- p2`v ?2HT7mHX uQmHH
MQiB+2 r2p2 mb2/ M2r K+`Q ?2`2, assert_eq!X h?Bb +QKT`2b irQ pHm2b- M/ panic!b B7
i?2v`2 MQi 2[mH iQ 2+? Qi?2`X Aib p2`v ?2HT7mH BM /Q+mK2MiiBQMX h?2`2b MQi?2` K+`Qassert!- r?B+? panic!b B7 i?2 pHm2 Tbb2/ iQ Bi Bb falseX
uQm +M mb2 i?2 rustdoc Ub2+iBQM 9X9- T;2 dNV iQQH iQ ;2M2`i2 >hJG /Q+mK2MiiBQM 7`QK i?2b2
/Q+ +QKK2Mib- M/ HbQ iQ `mM i?2 +Q/2 2tKTH2b b i2bib5
8X8
B7
_mbib iF2 QM if Bb MQi T`iB+mH`Hv +QKTH2t- #mi Bib Km+? KQ`2 HBF2 i?2 if vQmHH }M/ BM
/vMKB+HHv ivT2/ HM;m;2 i?M BM KQ`2 i`/BiBQMH bvbi2Kb HM;m;2X aQ H2ib iHF #Qmi BiiQ KF2 bm`2 vQm ;`bT i?2 MmM+2bX
Bb bT2+B}+ 7Q`K Q7 KQ`2 ;2M2`H +QM+2Ti- i?2 #`M+?X h?2 MK2 +QK2b 7`QK #`M+? BM
i`22, /2+BbBQM TQBMi- r?2`2 /2T2M/BM; QM +?QB+2- KmHiBTH2 Ti?b +M #2 iF2MX
if
Rjk
AM i?2 +b2 Q7
if-
let x = 5;
if x == 5 {
println!("x is five!");
}
A7 r2 +?M;2/ i?2 pHm2 Q7 x iQ bQK2i?BM; 2Hb2- i?Bb HBM2 rQmH/ MQi T`BMiX JQ`2 bT2+B}+HHv- B7 i?2
2tT`2bbBQM 7i2` i?2 if 2pHmi2b iQ true- i?2M i?2 #HQ+F Bb 2t2+mi2/X A7 Bib false- i?2M Bi Bb MQiX
A7 vQm rMi bQK2i?BM; iQ ?TT2M BM i?2
false
+b2- mb2 M
let x = 5;
if x == 5 {
println!("x is five!");
} else {
println!("x is not five :(");
}
else if,
let x = 5;
if x == 5 {
println!("x is five!");
} else if x == 6 {
println!("x is six!");
} else {
println!("x is not five or six :(");
}
else,
Rjj
h?Bb rQ`Fb #2+mb2 if Bb M 2tT`2bbBQMX h?2 pHm2 Q7 i?2 2tT`2bbBQM Bb i?2 pHm2 Q7 i?2 Hbi
2tT`2bbBQM BM r?B+?2p2` #`M+? rb +?Qb2MX M if rBi?Qmi M else Hrvb `2bmHib BM () b i?2
pHm2X
8Xe
7Q` HQQTb
h?2 for HQQT Bb mb2/ iQ HQQT T`iB+mH` MmK#2` Q7 iBK2bX _mbib for HQQTb rQ`F #Bi /Bz2`2MiHv
i?M BM Qi?2` bvbi2Kb HM;m;2b- ?Qr2p2`X _mbib for HQQT /Q2bMi HQQF HBF2 i?Bb *@bivH2 for
HQQT,
for (x = 0; x < 10; x++) {
printf( "%d\n", x );
}
h?2 2tT`2bbBQM Bb M Bi2`iQ` Ub2+iBQM 9X8- T;2 3NVX h?2 Bi2`iQ` ;Bp2b #+F b2`B2b Q7 2H2K2MibX
1+? 2H2K2Mi Bb QM2 Bi2`iBQM Q7 i?2 HQQTX h?i pHm2 Bb i?2M #QmM/ iQ i?2 MK2 var- r?B+? Bb
pHB/ 7Q` i?2 HQQT #Q/vX PM+2 i?2 #Q/v Bb Qp2`- i?2 M2ti pHm2 Bb 72i+?2/ 7`QK i?2 Bi2`iQ`- M/
r2 HQQT MQi?2` iBK2X q?2M i?2`2 `2 MQ KQ`2 pHm2b- i?2 for HQQT Bb Qp2`X
AM Qm` 2tKTH2- 0..10 Bb M 2tT`2bbBQM i?i iF2b bi`i M/ M 2M/ TQbBiBQM- M/ ;Bp2b M Bi2`iQ`
Qp2` i?Qb2 pHm2bX h?2 mTT2` #QmM/ Bb 2t+HmbBp2- i?Qm;?- bQ Qm` HQQT rBHH T`BMi 0 i?`Qm;? 9- MQi
10X
_mbi /Q2b MQi ?p2 i?2 *@bivH2 for HQQT QM Tm`TQb2X JMmHHv +QMi`QHHBM; 2+? 2H2K2Mi Q7 i?2
HQQT Bb +QKTHB+i2/ M/ 2``Q` T`QM2- 2p2M 7Q` 2tT2`B2M+2/ * /2p2HQT2`bX
8Xd
r?BH2 HQQTb
while
Rj9
while !done {
x += x - 3;
println!("{}", x);
if x % 5 == 0 {
done = true;
}
}
while
HQQTb `2 i?2 +Q``2+i +?QB+2 r?2M vQm`2 MQi bm`2 ?Qr KMv iBK2b vQm M22/ iQ HQQTX
loop-
loop {
_mbib +QMi`QH@~Qr MHvbBb i`2ib i?Bb +QMbi`m+i /Bz2`2MiHv i?M while true- bBM+2 r2 FMQr
i?i Bi rBHH Hrvb HQQTX AM ;2M2`H- i?2 KQ`2 BM7Q`KiBQM r2 +M ;Bp2 iQ i?2 +QKTBH2`- i?2 #2ii2`
Bi +M /Q rBi? b72iv M/ +Q/2 ;2M2`iBQM- bQ vQm b?QmH/ Hrvb T`272` loop r?2M vQm THM iQ
HQQT BM}MBi2HvX
1M/BM; Bi2`iBQM 2`Hv
G2ib iF2 HQQF i i?i
while
let mut x = 5;
let mut done = false;
while !done {
x += x - 3;
println!("{}", x);
if x % 5 == 0 {
done = true;
}
}
q2 ?/ iQ F22T /2/B+i2/ mut #QQH2M p`B#H2 #BM/BM;- done- iQ FMQr r?2M r2 b?QmH/ 2tBi Qmi
Q7 i?2 HQQTX _mbi ?b irQ F2vrQ`/b iQ ?2HT mb rBi? KQ/B7vBM; Bi2`iBQM, break M/ continueX
AM i?Bb +b2- r2 +M r`Bi2 i?2 HQQT BM #2ii2` rv rBi?
break,
8X3X PqL1_a>AS
Rj8
let mut x = 5;
loop {
x += x - 3;
println!("{}", x);
if x % 5 == 0 { break; }
}
loop
M/ mb2
break
Bb bBKBH`- #mi BMbi2/ Q7 2M/BM; i?2 HQQT- ;Q2b iQ i?2 M2ti Bi2`iBQMX h?Bb rBHH QMHv
T`BMi i?2 Q// MmK#2`b,
continue
for x in 0..10 {
if x % 2 == 0 { continue; }
println!("{}", x);
}
"Qi?
continue
8X3
M/
break
while
HQQTb M/
for
PrM2`b?BT
h?Bb ;mB/2 Bb QM2 Q7 i?`22 T`2b2MiBM; _mbib QrM2`b?BT bvbi2KX h?Bb Bb QM2 Q7 _mbib KQbi mMB[m2
M/ +QKT2HHBM; 72im`2b- rBi? r?B+? _mbi /2p2HQT2`b b?QmH/ #2+QK2 [mBi2 +[mBMi2/X PrM2`b?BT
Bb ?Qr _mbi +?B2p2b Bib H`;2bi ;QH- K2KQ`v b72ivX h?2`2 `2 72r /BbiBM+i +QM+2Tib- 2+?
rBi? Bib QrM +?Ti2`,
QrM2`b?BT- r?B+? vQm`2 `2/BM; MQr
#Q``QrBM; Ub2+iBQM 8XN- T;2 Rj3V- M/ i?2B` bbQ+Bi2/ 72im`2 `272`2M+2b
HB72iBK2b Ub2+iBQM 8XRy- T;2 R98V- M /pM+2/ +QM+2Ti Q7 #Q``QrBM;
h?2b2 i?`22 +?Ti2`b `2 `2Hi2/- M/ BM Q`/2`X uQmHH M22/ HH i?`22 iQ 7mHHv mM/2`biM/ i?2
QrM2`b?BT bvbi2KX
8X3XR
J2i
"27Q`2 r2 ;2i iQ i?2 /2iBHb- irQ BKTQ`iMi MQi2b #Qmi i?2 QrM2`b?BT bvbi2KX
_mbi ?b 7Q+mb QM b72iv M/ bT22/X Ai ++QKTHBb?2b i?2b2 ;QHb i?`Qm;? KMv x2`Q@+Qbi
#bi`+iBQMb- r?B+? K2Mb i?i BM _mbi- #bi`+iBQMb +Qbi b HBiiH2 b TQbbB#H2 BM Q`/2` iQ KF2
i?2K rQ`FX h?2 QrM2`b?BT bvbi2K Bb T`BK2 2tKTH2 Q7 x2`Q@+Qbi #bi`+iBQMX HH Q7 i?2
MHvbBb r2HH iHF #Qmi BM i?Bb ;mB/2 Bb /QM2 i +QKTBH2 iBK2X uQm /Q MQi Tv Mv `mM@iBK2 +Qbi
7Q` Mv Q7 i?2b2 72im`2bX
Rje
>Qr2p2`- i?Bb bvbi2K /Q2b ?p2 +2`iBM +Qbi, H2`MBM; +m`p2X JMv M2r mb2`b iQ _mbi 2t@
T2`B2M+2 bQK2i?BM; r2 HBF2 iQ +HH };?iBM; rBi? i?2 #Q``Qr +?2+F2`- r?2`2 i?2 _mbi +QKTBH2`
`27mb2b iQ +QKTBH2 T`Q;`K i?i i?2 mi?Q` i?BMFb Bb pHB/X h?Bb Q7i2M ?TT2Mb #2+mb2 i?2
T`Q;`KK2`b K2MiH KQ/2H Q7 ?Qr QrM2`b?BT b?QmH/ rQ`F /Q2bMi Ki+? i?2 +imH `mH2b i?i
_mbi BKTH2K2MibX uQm T`Q##Hv rBHH 2tT2`B2M+2 bBKBH` i?BM;b i }`biX h?2`2 Bb ;QQ/ M2rb?Qr2p2`, KQ`2 2tT2`B2M+2/ _mbi /2p2HQT2`b `2TQ`i i?i QM+2 i?2v rQ`F rBi? i?2 `mH2b Q7 i?2
QrM2`b?BT bvbi2K 7Q` T2`BQ/ Q7 iBK2- i?2v };?i i?2 #Q``Qr +?2+F2` H2bb M/ H2bbX
qBi? i?i BM KBM/- H2ib H2`M #Qmi QrM2`b?BTX
8X3Xk PrM2`b?BT
o`B#H2 #BM/BM;b Ub2+iBQM 8XR- T;2 RRNV ?p2 T`QT2`iv BM _mbi, i?2v ?p2 QrM2`b?BT Q7 r?i
i?2v`2 #QmM/ iQX h?Bb K2Mb i?i r?2M #BM/BM; ;Q2b Qmi Q7 b+QT2- i?2 `2bQm`+2 i?i i?2v`2
#QmM/ iQ `2 7`22/X 6Q` 2tKTH2,
fn foo() {
let v = vec![1, 2, 3];
}
q?2M v +QK2b BMiQ b+QT2- M2r Vec<T>kR Bb +`2i2/X AM i?Bb +b2- i?2 p2+iQ` HbQ HHQ+i2b bT+2
QM i?2 ?2T Ub2+iBQM 9XR- T;2 8NV- 7Q` i?2 i?`22 2H2K2MibX q?2M v ;Q2b Qmi Q7 b+QT2 i i?2 2M/
Q7 foo()- _mbi rBHH +H2M mT 2p2`vi?BM; `2Hi2/ iQ i?2 p2+iQ`- 2p2M i?2 ?2T@HHQ+i2/ K2KQ`vX
h?Bb ?TT2Mb /2i2`KBMBbiB+HHv- i i?2 2M/ Q7 i?2 b+QT2X
8X3X PqL1_a>AS
Rjd
bBKBH` i?BM; ?TT2Mb B7 r2 /2}M2 7mM+iBQM r?B+? iF2b QrM2`b?BT- M/ i`v iQ mb2 bQK2i?BM;
7i2` r2p2 Tbb2/ Bi b M `;mK2Mi,
fn take(v: Vec<i32>) {
// what happens here isnt important.
}
let v = vec![1, 2, 3];
take(v);
println!("v[0] is: {}", v[0]);
aK2 2``Q`, mb2 Q7 KQp2/ pHm2X q?2M r2 i`Mb72` QrM2`b?BT iQ bQK2i?BM; 2Hb2- r2 bv i?i
r2p2 KQp2/ i?2 i?BM; r2 `272` iQX uQm /QMi M22/ bQK2 bQ`i Q7 bT2+BH MMQiiBQM ?2`2- Bib
i?2 /27mHi i?BM; i?i _mbi /Q2bX
h?2 /2iBHb
h?2 `2bQM i?i r2 +MMQi mb2 #BM/BM; 7i2` r2p2 KQp2/ Bi Bb bm#iH2- #mi BKTQ`iMiX q?2M
r2 r`Bi2 +Q/2 HBF2 i?Bb,
let v = vec![1, 2, 3];
let v2 = v;
h?2 }`bi HBM2 HHQ+i2b K2KQ`v 7Q` i?2 p2+iQ` Q#D2+i- v- M/ 7Q` i?2 /i Bi +QMiBMbX h?2 p2+iQ`
Q#D2+i Bb biQ`2/ QM i?2 bi+F Ub2+iBQM 9XR- T;2 8NV M/ +QMiBMb TQBMi2` iQ i?2 +QMi2Mi U[1, 2,
3]V biQ`2/ QM i?2 ?2T Ub2+iBQM 9XR- T;2 8NVX q?2M r2 KQp2 v iQ v2- Bi +`2i2b +QTv Q7 i?i
TQBMi2`- 7Q` v2X q?B+? K2Mb i?i i?2`2 rQmH/ #2 irQ TQBMi2`b iQ i?2 +QMi2Mi Q7 i?2 p2+iQ` QM
i?2 ?2TX Ai rQmH/ pBQHi2 _mbib b72iv ;m`Mi22b #v BMi`Q/m+BM; /i `+2X h?2`27Q`2- _mbi
7Q`#B/b mbBM; v 7i2` r2p2 /QM2 i?2 KQp2X
Aib HbQ BKTQ`iMi iQ MQi2 i?i QTiBKBxiBQMb Kv `2KQp2 i?2 +imH +QTv Q7 i?2 #vi2b QM i?2
bi+F- /2T2M/BM; QM +B`+mKbiM+2bX aQ Bi Kv MQi #2 b BM2{+B2Mi b Bi BMBiBHHv b22KbX
Copy
ivT2b
q2p2 2bi#HBb?2/ i?i r?2M QrM2`b?BT Bb i`Mb72``2/ iQ MQi?2` #BM/BM;- vQm +MMQi mb2 i?2
Q`B;BMH #BM/BM;X >Qr2p2`- i?2`2b i`Bi Ub2+iBQM 8Xky- T;2 RdjV i?i +?M;2b i?Bb #2?pBQ`M/ Bib +HH2/ CopyX q2 ?p2Mi /Bb+mbb2/ i`Bib v2i- #mi 7Q` MQr- vQm +M i?BMF Q7 i?2K b M
MMQiiBQM iQ T`iB+mH` ivT2 i?i //b 2ti` #2?pBQ`X 6Q` 2tKTH2,
let v = 1;
let v2 = v;
println!("v is: {}", v);
Rj3
AM i?Bb +b2- v Bb M i32- r?B+? BKTH2K2Mib i?2 Copy i`BiX h?Bb K2Mb i?i- Dmbi HBF2 KQp2r?2M r2 bbB;M v iQ v2- +QTv Q7 i?2 /i Bb K/2X "mi- mMHBF2 KQp2- r2 +M biBHH mb2 v
7i2`r`/X h?Bb Bb #2+mb2 M i32 ?b MQ TQBMi2`b iQ /i bQK2r?2`2 2Hb2- +QTvBM; Bi Bb 7mHH
+QTvX
q2 rBHH /Bb+mbb ?Qr iQ KF2 vQm` QrM ivT2b
Copy
h?Bb rQmH/ ;2i p2`v i2/BQmbX Ai ;2ib rQ`b2 i?2 KQ`2 i?BM;b r2 rMi iQ iF2 QrM2`b?BT Q7,
fn foo(v1: Vec<i32>, v2: Vec<i32>) -> (Vec<i32>, Vec<i32>, i32) {
// do stuff with v1 and v2
// hand back ownership, and the result of our function
(v1, v2, 42)
}
let v1 = vec![1, 2, 3];
let v2 = vec![1, 2, 3];
let (v1, v2, answer) = foo(v1, v2);
l;?5 h?2 `2im`M ivT2- `2im`M HBM2- M/ +HHBM; i?2 7mM+iBQM ;2ib rv KQ`2 +QKTHB+i2/X
Gm+FBHv- _mbi Qz2`b 72im`2- #Q``QrBM;- r?B+? ?2HTb mb bQHp2 i?Bb T`Q#H2KX Aib i?2 iQTB+ Q7 i?2
M2ti b2+iBQM5
8XN
h?Bb ;mB/2 Bb QM2 Q7 i?`22 T`2b2MiBM; _mbib QrM2`b?BT bvbi2KX h?Bb Bb QM2 Q7 _mbib KQbi mMB[m2
M/ +QKT2HHBM; 72im`2b- rBi? r?B+? _mbi /2p2HQT2`b b?QmH/ #2+QK2 [mBi2 +[mBMi2/X PrM2`b?BT
Bb ?Qr _mbi +?B2p2b Bib H`;2bi ;QH- K2KQ`v b72ivX h?2`2 `2 72r /BbiBM+i +QM+2Tib- 2+?
rBi? Bib QrM +?Ti2`,
QrM2`b?BT Ub2+iBQM 8X3- T;2 Rj8V- i?2 F2v +QM+2Ti
#Q``QrBM;- r?B+? vQm`2 `2/BM; MQr
HB72iBK2b Ub2+iBQM 8XRy- T;2 R98V- M /pM+2/ +QM+2Ti Q7 #Q``QrBM;
RjN
h?2b2 i?`22 +?Ti2`b `2 `2Hi2/- M/ BM Q`/2`X uQmHH M22/ HH i?`22 iQ 7mHHv mM/2`biM/ i?2
QrM2`b?BT bvbi2KX
8XNXR
J2i
"27Q`2 r2 ;2i iQ i?2 /2iBHb- irQ BKTQ`iMi MQi2b #Qmi i?2 QrM2`b?BT bvbi2KX
_mbi ?b 7Q+mb QM b72iv M/ bT22/X Ai ++QKTHBb?2b i?2b2 ;QHb i?`Qm;? KMv x2`Q@+Qbi
#bi`+iBQMb- r?B+? K2Mb i?i BM _mbi- #bi`+iBQMb +Qbi b HBiiH2 b TQbbB#H2 BM Q`/2` iQ KF2
i?2K rQ`FX h?2 QrM2`b?BT bvbi2K Bb T`BK2 2tKTH2 Q7 x2`Q +Qbi #bi`+iBQMX HH Q7 i?2
MHvbBb r2HH iHF #Qmi BM i?Bb ;mB/2 Bb /QM2 i +QKTBH2 iBK2X uQm /Q MQi Tv Mv `mM@iBK2 +Qbi
7Q` Mv Q7 i?2b2 72im`2bX
>Qr2p2`- i?Bb bvbi2K /Q2b ?p2 +2`iBM +Qbi, H2`MBM; +m`p2X JMv M2r mb2`b iQ _mbi 2t@
T2`B2M+2 bQK2i?BM; r2 HBF2 iQ +HH };?iBM; rBi? i?2 #Q``Qr +?2+F2`- r?2`2 i?2 _mbi +QKTBH2`
`27mb2b iQ +QKTBH2 T`Q;`K i?i i?2 mi?Q` i?BMFb Bb pHB/X h?Bb Q7i2M ?TT2Mb #2+mb2 i?2
T`Q;`KK2`b K2MiH KQ/2H Q7 ?Qr QrM2`b?BT b?QmH/ rQ`F /Q2bMi Ki+? i?2 +imH `mH2b i?i
_mbi BKTH2K2MibX uQm T`Q##Hv rBHH 2tT2`B2M+2 bBKBH` i?BM;b i }`biX h?2`2 Bb ;QQ/ M2rb?Qr2p2`, KQ`2 2tT2`B2M+2/ _mbi /2p2HQT2`b `2TQ`i i?i QM+2 i?2v rQ`F rBi? i?2 `mH2b Q7 i?2
QrM2`b?BT bvbi2K 7Q` T2`BQ/ Q7 iBK2- i?2v };?i i?2 #Q``Qr +?2+F2` H2bb M/ H2bbX
qBi? i?i BM KBM/- H2ib H2`M #Qmi #Q``QrBM;X
8XNXk
"Q``QrBM;
i i?2 2M/ Q7 i?2 QrM2`b?BT Ub2+iBQM 8X3- T;2 Rj8V b2+iBQM- r2 ?/ Mbiv 7mM+iBQM i?i HQQF2/
HBF2 i?Bb,
fn foo(v1: Vec<i32>, v2: Vec<i32>) -> (Vec<i32>, Vec<i32>, i32) {
// do stuff with v1 and v2
// hand back ownership, and the result of our function
(v1, v2, 42)
}
let v1 = vec![1, 2, 3];
let v2 = vec![1, 2, 3];
let (v1, v2, answer) = foo(v1, v2);
h?Bb Bb MQi B/BQKiB+ _mbi- ?Qr2p2`- b Bi /Q2bMi iF2 /pMi;2 Q7 #Q``QrBM;X >2`2b i?2 }`bi
bi2T,
fn foo(v1: &Vec<i32>, v2: &Vec<i32>) -> i32 {
// do stuff with v1 and v2
// return the answer
42
R9y
}
let v1 = vec![1, 2, 3];
let v2 = vec![1, 2, 3];
let answer = foo(&v1, &v2);
// we can use v1 and v2 here!
AMbi2/ Q7 iFBM; Vec<i32>b b Qm` `;mK2Mib- r2 iF2 `272`2M+2, &Vec<i32>X M/ BMbi2/ Q7
TbbBM; v1 M/ v2 /B`2+iHv- r2 Tbb &v1 M/ &v2X q2 +HH i?2 &T ivT2 `272`2M+2- M/ `i?2`
i?M QrMBM; i?2 `2bQm`+2- Bi #Q``Qrb QrM2`b?BTX #BM/BM; i?i #Q``Qrb bQK2i?BM; /Q2b MQi
/2HHQ+i2 i?2 `2bQm`+2 r?2M Bi ;Q2b Qmi Q7 b+QT2X h?Bb K2Mb i?i 7i2` i?2 +HH iQ foo()- r2
+M mb2 Qm` Q`B;BMH #BM/BM;b ;BMX
_272`2M+2b `2 BKKmi#H2- Dmbi HBF2 #BM/BM;bX h?Bb K2Mb i?i BMbB/2 Q7
#2 +?M;2/ i HH,
foo()-
fn foo(v: &Vec<i32>) {
v.push(5);
}
let v = vec![];
foo(&v);
2``Q`b rBi?,
error: cannot borrow immutable borrowed content `*v` as mutable
v.push(5);
^
R9R
h?Bb rBHH T`BMi 6X q2 KF2 y Kmi#H2 `272`2M+2 iQ x- i?2M // QM2 iQ i?2 i?BM; y TQBMib iX
uQmHH MQiB+2 i?i x ?/ iQ #2 K`F2/ mut b r2HH- B7 Bi rbMi- r2 +QmH/Mi iF2 Kmi#H2 #Q``Qr
iQ M BKKmi#H2 pHm2X
Pi?2`rBb2- &mut `272`2M+2b `2 Dmbi HBF2 `272`2M+2bX h?2`2 Bb H`;2 /Bz2`2M+2 #2ir22M i?2 irQM/ ?Qr i?2v BMi2`+i- i?Qm;?X uQm +M i2HH bQK2i?BM; Bb }b?v BM i?2 #Qp2 2tKTH2- #2+mb2
r2 M22/ i?i 2ti` b+QT2- rBi? i?2 { M/ }X A7 r2 `2KQp2 i?2K- r2 ;2i M 2``Q`,
error: cannot borrow `x` as immutable because it is also borrowed as mutable
println!("{}", x);
^
note: previous borrow of `x` occurs here; the mutable borrow prevents
subsequent moves, borrows, or modification of `x` until the borrow ends
let y = &mut x;
^
note: previous borrow ends here
fn main() {
}
^
8XNX9
h?2 _mH2b
R9k
h?BMFBM; BM b+QT2b
>2`2b i?2 +Q/2,
let mut x = 5;
let y = &mut x;
*y += 1;
println!("{}", x);
h?Bb Bb #2+mb2 r2p2 pBQHi2/ i?2 `mH2b, r2 ?p2 &mut T TQBMiBM; iQ x- M/ bQ r2 `2Mi HHQr2/
iQ +`2i2 Mv &TbX PM2 Q` i?2 Qi?2`X h?2 MQi2 ?BMib i ?Qr iQ i?BMF #Qmi i?Bb T`Q#H2K,
note: previous borrow ends here
fn main() {
}
^
AM Qi?2` rQ`/b- i?2 Kmi#H2 #Q`Qr Bb ?2H/ i?`Qm;? i?2 `2bi Q7 Qm` 2tKTH2X q?i r2 rMi Bb 7Q`
i?2 Kmi#H2 #Q``Qr iQ 2M/ #27Q`2 r2 i`v iQ +HH println! M/ KF2 M BKKmi#H2 #Q``QrX AM
_mbi- #Q``QrBM; Bb iB2/ iQ i?2 b+QT2 i?i i?2 #Q``Qr Bb pHB/ 7Q`X M/ Qm` b+QT2b HQQF HBF2 i?Bb,
let mut x = 5;
let y = &mut x;
*y += 1;
//
//
&x
r?BH2
Bb BM b+QT2X
//
println!("{}", x);
R9j
h?2`2b MQ T`Q#H2KX Pm` Kmi#H2 #Q``Qr ;Q2b Qmi Q7 b+QT2 #27Q`2 r2 +`2i2 M BKKmi#H2 QM2X
"mi b+QT2 Bb i?2 F2v iQ b22BM; ?Qr HQM; #Q``Qr Hbib 7Q`X
Abbm2b #Q``QrBM; T`2p2Mib
q?v ?p2 i?2b2 `2bi`B+iBp2 `mH2b\ q2HH- b r2 MQi2/- i?2b2 `mH2b T`2p2Mi /i `+2bX q?i FBM/b
Q7 Bbbm2b /Q /i `+2b +mb2\ >2`2b 72rX
Ai2`iQ` BMpHB/iBQM PM2 2tKTH2 Bb Bi2`iQ` BMpHB/iBQM- r?B+? ?TT2Mb r?2M vQm i`v
iQ Kmii2 +QHH2+iBQM i?i vQm`2 Bi2`iBM; Qp2`X _mbib #Q``Qr +?2+F2` T`2p2Mib i?Bb 7`QK
?TT2MBM;,
let mut v = vec![1, 2, 3];
for i in &v {
println!("{}", i);
}
h?Bb T`BMib Qmi QM2 i?`Qm;? i?`22X b r2 Bi2`i2 i?`Qm;? i?2 p2+iQ`b- r2`2 QMHv ;Bp2M `272`2M+2b
iQ i?2 2H2K2MibX M/ v Bb Bib2H7 #Q``Qr2/ b BKKmi#H2- r?B+? K2Mb r2 +Mi +?M;2 Bi r?BH2
r2`2 Bi2`iBM;,
let mut v = vec![1, 2, 3];
for i in &v {
println!("{}", i);
v.push(34);
}
R99
q2 +Mi KQ/B7v
mb2 7i2` 7`22 _272`2M+2b Kmbi HBp2 b HQM; b i?2 `2bQm`+2 i?2v `272` iQX _mbi rBHH +?2+F i?2
b+QT2b Q7 vQm` `272`2M+2b iQ 2Mbm`2 i?i i?Bb Bb i`m2X
A7 _mbi /B/Mi +?2+F i?i i?Bb T`QT2`iv- r2 +QmH/ ++B/2MiHHv mb2 `272`2M+2 r?B+? rb BMpHB/X
6Q` 2tKTH2,
let y: &i32;
{
let x = 5;
y = &x;
}
println!("{}", y);
AM Qi?2` rQ`/b- y Bb QMHv pHB/ 7Q` i?2 b+QT2 r?2`2 x 2tBbibX b bQQM b x ;Q2b rv- Bi #2+QK2b
BMpHB/ iQ `272` iQ BiX b bm+?- i?2 2``Q` bvb i?i i?2 #Q``Qr /Q2bMi HBp2 HQM; 2MQm;? #2+mb2
Bib MQi pHB/ 7Q` i?2 `B;?i KQmMi Q7 iBK2X
h?2 bK2 T`Q#H2K Q++m`b r?2M i?2 `272`2M+2 Bb /2+H`2/ #27Q`2 i?2 p`B#H2 Bi `272`b iQ,
let y: &i32;
let x = 5;
y = &x;
println!("{}", y);
8XRyX GA61hAJ1a
R98
8XRy
GB72iBK2b
h?Bb ;mB/2 Bb QM2 Q7 i?`22 T`2b2MiBM; _mbib QrM2`b?BT bvbi2KX h?Bb Bb QM2 Q7 _mbib KQbi mMB[m2
M/ +QKT2HHBM; 72im`2b- rBi? r?B+? _mbi /2p2HQT2`b b?QmH/ #2+QK2 [mBi2 +[mBMi2/X PrM2`b?BT
Bb ?Qr _mbi +?B2p2b Bib H`;2bi ;QH- K2KQ`v b72ivX h?2`2 `2 72r /BbiBM+i +QM+2Tib- 2+?
rBi? Bib QrM +?Ti2`,
QrM2`b?BT Ub2+iBQM 8X3- T;2 Rj8V- i?2 F2v +QM+2Ti
#Q``QrBM; Ub2+iBQM 8XN- T;2 Rj3V- M/ i?2B` bbQ+Bi2/ 72im`2 `272`2M+2b
HB72iBK2b- r?B+? vQm`2 `2/BM; MQr
h?2b2 i?`22 +?Ti2`b `2 `2Hi2/- M/ BM Q`/2`X uQmHH M22/ HH i?`22 iQ 7mHHv mM/2`biM/ i?2
QrM2`b?BT bvbi2KX
8XRyXR
J2i
"27Q`2 r2 ;2i iQ i?2 /2iBHb- irQ BKTQ`iMi MQi2b #Qmi i?2 QrM2`b?BT bvbi2KX
_mbi ?b 7Q+mb QM b72iv M/ bT22/X Ai ++QKTHBb?2b i?2b2 ;QHb i?`Qm;? KMv x2`Q@+Qbi
#bi`+iBQMb- r?B+? K2Mb i?i BM _mbi- #bi`+iBQMb +Qbi b HBiiH2 b TQbbB#H2 BM Q`/2` iQ KF2
i?2K rQ`FX h?2 QrM2`b?BT bvbi2K Bb T`BK2 2tKTH2 Q7 x2`Q@+Qbi #bi`+iBQMX HH Q7 i?2
MHvbBb r2HH iHF #Qmi BM i?Bb ;mB/2 Bb /QM2 i +QKTBH2 iBK2X uQm /Q MQi Tv Mv `mM@iBK2 +Qbi
7Q` Mv Q7 i?2b2 72im`2bX
>Qr2p2`- i?Bb bvbi2K /Q2b ?p2 +2`iBM +Qbi, H2`MBM; +m`p2X JMv M2r mb2`b iQ _mbi 2t@
T2`B2M+2 bQK2i?BM; r2 HBF2 iQ +HH };?iBM; rBi? i?2 #Q``Qr +?2+F2`- r?2`2 i?2 _mbi +QKTBH2`
`27mb2b iQ +QKTBH2 T`Q;`K i?i i?2 mi?Q` i?BMFb Bb pHB/X h?Bb Q7i2M ?TT2Mb #2+mb2 i?2
R9e
T`Q;`KK2`b K2MiH KQ/2H Q7 ?Qr QrM2`b?BT b?QmH/ rQ`F /Q2bMi Ki+? i?2 +imH `mH2b i?i
_mbi BKTH2K2MibX uQm T`Q##Hv rBHH 2tT2`B2M+2 bBKBH` i?BM;b i }`biX h?2`2 Bb ;QQ/ M2rb?Qr2p2`, KQ`2 2tT2`B2M+2/ _mbi /2p2HQT2`b `2TQ`i i?i QM+2 i?2v rQ`F rBi? i?2 `mH2b Q7 i?2
QrM2`b?BT bvbi2K 7Q` T2`BQ/ Q7 iBK2- i?2v };?i i?2 #Q``Qr +?2+F2` H2bb M/ H2bbX
qBi? i?i BM KBM/- H2ib H2`M #Qmi HB72iBK2bX
8XRyXk GB72iBK2b
G2M/BM; Qmi `272`2M+2 iQ `2bQm`+2 i?i bQK2QM2 2Hb2 QrMb +M #2 +QKTHB+i2/X 6Q` 2tKTH2BK;BM2 i?Bb b2i Q7 QT2`iBQMb,
l? Q?5 uQm` `272`2M+2 Bb TQBMiBM; iQ M BMpHB/ `2bQm`+2X h?Bb Bb +HH2/ /M;HBM; TQBMi2` Q` mb2
7i2` 7`22- r?2M i?2 `2bQm`+2 Bb K2KQ`vX
hQ }t i?Bb- r2 ?p2 iQ KF2 bm`2 i?i bi2T 7Qm` M2p2` ?TT2Mb 7i2` bi2T i?`22X h?2 QrM2`b?BT
bvbi2K BM _mbi /Q2b i?Bb i?`Qm;? +QM+2Ti +HH2/ HB72iBK2b- r?B+? /2b+`B#2 i?2 b+QT2 i?i
`272`2M+2 Bb pHB/ 7Q`X
q?2M r2 ?p2 7mM+iBQM i?i iF2b `272`2M+2 #v `;mK2Mi- r2 +M #2 BKTHB+Bi Q` 2tTHB+Bi #Qmi
i?2 HB72iBK2 Q7 i?2 `272`2M+2,
// implicit
fn foo(x: &i32) {
}
// explicit
fn bar<'a>(x: &'a i32) {
}
h?2 'a `2/b i?2 HB72iBK2 X h2+?MB+HHv- 2p2`v `272`2M+2 ?b bQK2 HB72iBK2 bbQ+Bi2/ rBi? Bi#mi i?2 +QKTBH2` H2ib vQm 2HB/2 i?2K BM +QKKQM +b2bX "27Q`2 r2 ;2i iQ i?i- i?Qm;?- H2ib #`2F
i?2 2tTHB+Bi 2tKTH2 /QrM,
fn bar<'a>(...)
bar
fn bar<'a, 'b>(...)
'aX
8XRyX GA61hAJ1a
R9d
A7 r2 rMi2/ M
&mut
A7 vQm +QKT`2 &mut i32 iQ &'a mut i32- i?2v`2 i?2 bK2- Bib Dmbi i?i i?2 HB72iBK2 'a ?b bMm+F
BM #2ir22M i?2 & M/ i?2 mut i32X q2 `2/ &mut i32 b Kmi#H2 `272`2M+2 iQ M Bjk M/ &'a
mut i32 b Kmi#H2 `272`2M+2 iQ M i32 rBi? i?2 HB72iBK2 'aX
uQmHH HbQ M22/ 2tTHB+Bi HB72iBK2b r?2M rQ`FBM; rBi?
struct
struct Foo<'a> {
x: &'a i32,
}
fn main() {
let y = &5; // this is the same as `let _y = 5; let y = &_y;`
let f = Foo { x: y };
println!("{}", f.x);
}
structb
struct Foo<'a> {
mb2b BiX aQ r?v /Q r2 M22/ HB72iBK2 ?2`2\ q2 M22/ iQ 2Mbm`2 i?i Mv `272`2M+2 iQ Foo +MMQi
QmiHBp2 i?2 `272`2M+2 iQ M i32 Bi +QMiBMbX
h?BMFBM; BM b+QT2b
rv iQ i?BMF #Qmi HB72iBK2b Bb iQ pBbmHBx2 i?2 b+QT2 i?i `272`2M+2 Bb pHB/ 7Q`X 6Q` 2tKTH2,
fn main() {
let y = &5;
// stuff
}
//BM; BM Qm`
//
//
R93
struct Foo<'a> {
x: &'a i32,
}
fn main() {
let y = &5;
Pm`
//
//
HBp2b rBi?BM i?2 b+QT2 Q7 y- bQ 2p2`vi?BM; rQ`FbX q?i B7 Bi /B/Mi\ h?Bb +Q/2 rQMi rQ`F,
struct Foo<'a> {
x: &'a i32,
}
fn main() {
let x;
{
let y = &5;
//
//
//
| | error here
println!("{}", x);
}
//
//
q?2r5 b vQm +M b22 ?2`2- i?2 b+QT2b Q7 f M/ y `2 bKHH2` i?M i?2 b+QT2 Q7 xX "mi r?2M r2
/Q x = &f.x- r2 KF2 x `272`2M+2 iQ bQK2i?BM; i?ib #Qmi iQ ;Q Qmi Q7 b+QT2X
LK2/ HB72iBK2b `2 rv Q7 ;BpBM; i?2b2 b+QT2b MK2X :BpBM; bQK2i?BM; MK2 Bb i?2 }`bi
bi2T iQr`/b #2BM; #H2 iQ iHF #Qmi BiX
biiB+
h?2 HB72iBK2 MK2/ biiB+ Bb bT2+BH HB72iBK2X Ai bB;MHb i?i bQK2i?BM; ?b i?2 HB72iBK2 Q7 i?2
2MiB`2 T`Q;`KX JQbi _mbi T`Q;`KK2`b }`bi +QK2 +`Qbb 'static r?2M /2HBM; rBi? bi`BM;b,
let x: &'static str = "Hello, world.";
ai`BM; HBi2`Hb ?p2 i?2 ivT2 &'static str #2+mb2 i?2 `272`2M+2 Bb Hrvb HBp2, i?2v `2 #F2/
BMiQ i?2 /i b2;K2Mi Q7 i?2 }MH #BM`vX MQi?2` 2tKTH2 `2 ;HQ#Hb,
static FOO: i32 = 5;
let x: &'static i32 = &FOO;
h?Bb //b M
i32
Bb `272`2M+2 iQ BiX
8XRyX GA61hAJ1a
R9N
GB72iBK2 1HBbBQM
_mbi bmTTQ`ib TQr2`7mH HQ+H ivT2 BM72`2M+2 BM 7mM+iBQM #Q/B2b- #mi Bib 7Q`#B//2M BM Bi2K bB;@
Mim`2b iQ HHQr `2bQMBM; #Qmi i?2 ivT2b Dmbi #b2/ BM i?2 Bi2K bB;Mim`2 HQM2X >Qr2p2`7Q` 2`;QMQKB+ `2bQMb p2`v `2bi`B+i2/ b2+QM/`v BM72`2M+2 H;Q`Bi?K +HH2/ HB72iBK2 2HBbBQM
TTHB2b BM 7mM+iBQM bB;Mim`2bX Ai BM72`b QMHv #b2/ QM i?2 bB;Mim`2 +QKTQM2Mib i?2Kb2Hp2b M/
MQi #b2/ QM i?2 #Q/v Q7 i?2 7mM+iBQM- QMHv BM72`b HB72iBK2 T`K2i2`b- M/ /Q2b i?Bb rBi? QMHv
i?`22 2bBHv K2KQ`Bx#H2 M/ mMK#B;mQmb `mH2bX h?Bb KF2b HB72iBK2 2HBbBQM b?Q`i?M/ 7Q`
r`BiBM; M Bi2K bB;Mim`2- r?BH2 MQi ?B/BM; rv i?2 +imH ivT2b BMpQHp2/ b 7mHH HQ+H BM72`2M+2
rQmH/ B7 TTHB2/ iQ BiX
q?2M iHFBM; #Qmi HB72iBK2 2HBbBQM- r2 mb2 i?2 i2`K BMTmi HB72iBK2 M/ QmiTmi HB72iBK2X M BMTmi
HB72iBK2 Bb HB72iBK2 bbQ+Bi2/ rBi? T`K2i2` Q7 7mM+iBQM- M/ M QmiTmi HB72iBK2 Bb HB72iBK2
bbQ+Bi2/ rBi? i?2 `2im`M pHm2 Q7 7mM+iBQMX 6Q` 2tKTH2- i?Bb 7mM+iBQM ?b M BMTmi HB72iBK2,
fn foo<'a>(bar: &'a str)
&self
Q`
&mut
self-
i?2 HB72iBK2
R8y
8XRR
Jmi#BHBiv
Jmi#BHBiv- i?2 #BHBiv iQ +?M;2 bQK2i?BM;- rQ`Fb #Bi /Bz2`2MiHv BM _mbi i?M BM Qi?2` HM@
;m;2bX h?2 }`bi bT2+i Q7 Kmi#BHBiv Bb Bib MQM@/27mHi biimb,
let x = 5;
x = 6; // error!
mut
F2vrQ`/,
let mut x = 5;
x = 6; // no problem!
h?Bb Bb Kmi#H2 p`B#H2 #BM/BM; Ub2+iBQM 8XR- T;2 RRNVX q?2M #BM/BM; Bb Kmi#H2- Bi K2Mb
vQm`2 HHQr2/ iQ +?M;2 r?i i?2 #BM/BM; TQBMib iQX aQ BM i?2 #Qp2 2tKTH2- Bib MQi bQ Km+?
i?i i?2 pHm2 i x Bb +?M;BM;- #mi i?i i?2 #BM/BM; +?M;2/ 7`QK QM2 i32 iQ MQi?2`X
A7 vQm rMi iQ +?M;2 r?i i?2 #BM/BM; TQBMib iQ- vQmHH M22/ Kmi#H2 `272`2M+2 Ub2+iBQM 8XNT;2 Rj3V,
let mut x = 5;
let y = &mut x;
Bb M BKKmi#H2 #BM/BM; iQ Kmi#H2 `272`2M+2- r?B+? K2Mb i?i vQm +Mi #BM/ y iQ bQK2i?BM;
2Hb2 Uy = &mut zV- #mi vQm +M Kmii2 i?2 i?BM; i?ib #QmM/ iQ y U*y = 5VX bm#iH2 /BbiBM+iBQMX
y
8XRRX Jlh"AGAhu
R8R
let mut x = 5;
let mut y = &mut x;
LQr
+M #2 #QmM/ iQ MQi?2` pHm2- M/ i?2 pHm2 Bib `272`2M+BM; +M #2 +?M;2/X
Aib BKTQ`iMi iQ MQi2 i?i mut Bb T`i Q7 Tii2`M Ub2+iBQM 8XR8- T;2 R8NV- bQ vQm +M /Q i?BM;b
HBF2 i?Bb,
let (mut x, y) = (5, 6);
fn foo(mut x: i32) {
8XRRXR
>Qr2p2`- r?2M r2 bv bQK2i?BM; Bb BKKmi#H2 BM _mbi- i?i /Q2bMi K2M i?i Bib MQi #H2 iQ
#2 +?M;2/, q2 K2M bQK2i?BM; ?b 2ti2`BQ` Kmi#BHBivX *QMbB/2`- 7Q` 2tKTH2- Arc<T>kk ,
use std::sync::Arc;
let x = Arc::new(5);
let y = x.clone();
q?2M r2 +HH clone()- i?2 Arc<T> M22/b iQ mT/i2 i?2 `272`2M+2 +QmMiX u2i r2p2 MQi mb2/ Mv
mutb ?2`2- x Bb M BKKmi#H2 #BM/BM;- M/ r2 /B/Mi iF2 &mut 5 Q` Mvi?BM;X aQ r?i ;Bp2b\
hQ mM/2`biM/ i?Bb- r2 ?p2 iQ ;Q #+F iQ i?2 +Q`2 Q7 _mbib ;mB/BM; T?BHQbQT?v- K2KQ`v b72ivM/ i?2 K2+?MBbK #v r?B+? _mbi ;m`Mi22b Bi- i?2 QrM2`b?BT Ub2+iBQM 8X3- T;2 Rj8V bvbi2KM/ KQ`2 bT2+B}+HHv- #Q``QrBM;kj ,
uQm Kv ?p2 QM2 Q` i?2 Qi?2` Q7 i?2b2 irQ FBM/b Q7 #Q``Qrb- #mi MQi #Qi? i i?2
bK2 iBK2,
QM2 Q` KQ`2 `272`2M+2b U&TV iQ `2bQm`+2X
2t+iHv QM2 Kmi#H2 `272`2M+2 U&mut TV
aQ- i?ib i?2 `2H /2}MBiBQM Q7 BKKmi#BHBiv, Bb i?Bb b72 iQ ?p2 irQ TQBMi2`b iQ\ AM Arc<T>b
+b2- v2b, i?2 KmiiBQM Bb 2MiB`2Hv +QMiBM2/ BMbB/2 i?2 bi`m+im`2 Bib2H7X Aib MQi mb2` 7+BM;X 6Q`
i?Bb `2bQM- Bi ?M/b Qmi &T rBi? clone()X A7 Bi ?M/2/ Qmi &mut Tb- i?Qm;?- i?i rQmH/ #2
T`Q#H2KX
Pi?2` ivT2b- HBF2 i?2 QM2b BM i?2 std::cellk9 KQ/mH2- ?p2 i?2 QTTQbBi2, BMi2`BQ` Kmi#BHBivX 6Q`
2tKTH2,
kk ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fbvM+fbi`m+iX`+X?iKH
kj #Q``QrBM;X?iKHOh?2@_mH2b
k9 ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/f+2HHfBM/2tX?iKH
R8k
use std::cell::RefCell;
let x = RefCell::new(42);
let y = x.borrow_mut();
_27*2HH ?M/b Qmi &mut `272`2M+2b iQ r?ib BMbB/2 Q7 Bi rBi? i?2 borrow_mut() K2i?Q/X AbMi i?i
/M;2`Qmb\ q?i B7 r2 /Q,
use std::cell::RefCell;
let x = RefCell::new(42);
let y = x.borrow_mut();
let z = x.borrow_mut();
h?Bb rBHH BM 7+i TMB+- i `mMiBK2X h?Bb Bb r?i RefCell /Q2b, Bi 2M7Q`+2b _mbib #Q``QrBM; `mH2b
i `mMiBK2- M/ panic!b B7 i?2v`2 pBQHi2/X h?Bb HHQrb mb iQ ;2i `QmM/ MQi?2` bT2+i Q7 _mbib
Kmi#BHBiv `mH2bX G2ib iHF #Qmi Bi }`biX
6B2H/@H2p2H Kmi#BHBiv
Jmi#BHBiv Bb T`QT2`iv Q7 2Bi?2` #Q``Qr U&mutV Q` #BM/BM; Ulet mutVX h?Bb K2Mb i?i- 7Q`
2tKTH2- vQm +MMQi ?p2 struct Ub2+iBQM 8XRk- T;2 R8jV rBi? bQK2 }2H/b Kmi#H2 M/ bQK2
BKKmi#H2,
struct Point {
x: i32,
mut y: i32, // nope
}
>Qr2p2`- #v mbBM;
Cell<T>-
8XRkX ah_l*ha
R8j
use std::cell::Cell;
struct Point {
x: i32,
y: Cell<i32>,
}
let point = Point { x: 5, y: Cell::new(6) };
point.y.set(7);
println!("y: {:?}", point.y);
8XRk
y: Cell { value: 7 }X
ai`m+ib
ai`m+ib `2 rv Q7 +`2iBM; KQ`2 +QKTH2t /i ivT2bX 6Q` 2tKTH2- B7 r2 r2`2 /QBM; +H+mHiBQMb
BMpQHpBM; +QQ`/BMi2b BM k. bT+2- r2 rQmH/ M22/ #Qi? M x M/ y pHm2,
let origin_x = 0;
let origin_y = 0;
h?2`2b HQi ;QBM; QM ?2`2- bQ H2ib #`2F Bi /QrMX q2 /2+H`2 struct rBi? i?2 struct F2vrQ`/M/ i?2M rBi? MK2X "v +QMp2MiBQM- structb #2;BM rBi? +TBiH H2ii2` M/ `2 +K2H +b2/,
PointInSpace- MQi Point_In_SpaceX
q2 +M +`2i2 M BMbiM+2 Q7 Qm` bi`m+i pB let- b mbmH- #mi r2 mb2 key: value bivH2 bvMit
iQ b2i 2+? }2H/X h?2 Q`/2` /Q2bMi M22/ iQ #2 i?2 bK2 b BM i?2 Q`B;BMH /2+H`iBQMX
6BMHHv- #2+mb2 }2H/b ?p2 MK2b- r2 +M ++2bb i?2 }2H/ i?`Qm;? /Qi MQiiBQM,
origin.xX
h?2 pHm2b BM bi`m+ib `2 BKKmi#H2 #v /27mHi- HBF2 Qi?2` #BM/BM;b BM _mbiX lb2
i?2K Kmi#H2,
mut
iQ KF2
R89
struct Point {
x: i32,
y: i32,
}
fn main() {
let mut point = Point { x: 0, y: 0 };
point.x = 5;
println!("The point is at ({}, {})", point.x, point.y);
}
_mbi /Q2b MQi bmTTQ`i }2H/ Kmi#BHBiv i i?2 HM;m;2 H2p2H- bQ vQm +MMQi r`Bi2 bQK2i?BM; HBF2
i?Bb,
struct Point {
mut x: i32,
y: i32,
}
Jmi#BHBiv Bb T`QT2`iv Q7 i?2 #BM/BM;- MQi Q7 i?2 bi`m+im`2 Bib2H7X A7 vQm`2 mb2/ iQ }2H/@H2p2H
Kmi#BHBiv- i?Bb Kv b22K bi`M;2 i }`bi- #mi Bi bB;MB}+MiHv bBKTHB}2b i?BM;bX Ai 2p2M H2ib vQm
KF2 i?BM;b Kmi#H2 7Q` b?Q`i iBK2 QMHv,
struct Point {
x: i32,
y: i32,
}
fn main() {
let mut point = Point { x: 0, y: 0 };
point.x = 5;
let point = point; // this new binding cant change now
point.y = 6; // this causes an error
}
8XRkX ah_l*ha
R88
struct Point3d {
x: i32,
y: i32,
z: i32,
}
let mut point = Point3d { x: 0, y: 0, z: 0 };
point = Point3d { y: 1, .. point };
h?Bb ;Bp2b point M2r y- #mi F22Tb i?2 QH/ x M/ z pHm2bX Ai /Q2bMi ?p2 iQ #2 i?2 bK2 struct
2Bi?2`- vQm +M mb2 i?Bb bvMit r?2M KFBM; M2r QM2b- M/ Bi rBHH +QTv i?2 pHm2b vQm /QMi
bT2+B7v,
let origin = Point3d { x: 0, y: 0, z: 0 };
let point = Point3d { z: 1, x: 2, .. origin };
8XRkXk
hmTH2 bi`m+ib
_mbi ?b MQi?2` /i ivT2 i?ib HBF2 ?v#`B/ #2ir22M imTH2k8 M/ bi`m+i- +HH2/ imTH2
bi`m+iX hmTH2 bi`m+ib ?p2 MK2- #mi i?2B` }2H/b /QMi,
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);
h?2b2 irQ rBHH MQi #2 2[mH- 2p2M B7 i?2v ?p2 i?2 bK2 pHm2b,
let black = Color(0, 0, 0);
let origin = Point(0, 0, 0);
Ai Bb HKQbi Hrvb #2ii2` iQ mb2 bi`m+i i?M imTH2 bi`m+iX q2 rQmH/ r`Bi2
HBF2 i?Bb BMbi2/,
struct Color {
red: i32,
blue: i32,
green: i32,
}
struct Point {
x: i32,
y: i32,
z: i32,
}
k8 T`BKBiBp2@ivT2bX?iKHOimTH2b
Color
M/
Point
R8e
LQr- r2 ?p2 +imH MK2b- `i?2` i?M TQbBiBQMbX :QQ/ MK2b `2 BKTQ`iMi- M/ rBi?
bi`m+i- r2 ?p2 +imH MK2bX
h?2`2 Bb QM2 +b2 r?2M imTH2 bi`m+i Bb p2`v mb27mH- i?Qm;?- M/ i?ib imTH2 bi`m+i rBi? QMHv
QM2 2H2K2MiX q2 +HH i?Bb i?2 M2rivT2 Tii2`M- #2+mb2 Bi HHQrb vQm iQ +`2i2 M2r ivT2/BbiBM+i 7`QK i?i Q7 Bib +QMiBM2/ pHm2 M/ 2tT`2bbBM; Bib QrM b2KMiB+ K2MBM;,
struct Inches(i32);
let length = Inches(10);
let Inches(integer_length) = length;
println!("length is {} inches", integer_length);
b vQm +M b22 ?2`2- vQm +M 2ti`+i i?2 BMM2` BMi2;2` ivT2 i?`Qm;? /2bi`m+im`BM; let- Dmbi b
rBi? `2;mH` imTH2bX AM i?Bb +b2- i?2 let Inches(integer_length) bbB;Mb 10 iQ integer_lengthX
am+? bi`m+i Bb +HH2/ mMBi@HBF2 #2+mb2 Bi `2b2K#H2b i?2 2KTiv imTH2mMBiX GBF2 imTH2 bi`m+i- Bi /2}M2b M2r ivT2X
()-
bQK2iBK2b +HH2/
h?Bb Bb ``2Hv mb27mH QM Bib QrM UHi?Qm;? bQK2iBK2b Bi +M b2`p2 b K`F2` ivT2V- #mi BM
+QK#BMiBQM rBi? Qi?2` 72im`2b- Bi +M #2+QK2 mb27mHX 6Q` BMbiM+2- HB#``v Kv bF vQm iQ
+`2i2 bi`m+im`2 i?i BKTH2K2Mib +2`iBM i`Bi Ub2+iBQM 8Xky- T;2 RdjV iQ ?M/H2 2p2MibX A7
vQm /QMi ?p2 Mv /i vQm M22/ iQ biQ`2 BM i?2 bi`m+im`2- vQm +M Dmbi +`2i2 mMBi@HBF2 bi`m+iX
8XRj
M
enum
1MmKb
BM _mbi Bb ivT2 i?i `2T`2b2Mib /i i?i +QmH/ #2 QM2 Q7 b2p2`H TQbbB#H2 p`BMib,
enum Message {
Quit,
ChangeColor(i32, i32, i32),
Move { x: i32, y: i32 },
Write(String),
}
1+? p`BMi +M QTiBQMHHv ?p2 /i bbQ+Bi2/ rBi? BiX h?2 bvMit 7Q` /2}MBM; p`BMib
`2b2K#H2b i?2 bvMit2b mb2/ iQ /2}M2 bi`m+ib, vQm +M ?p2 p`BMib rBi? MQ /i UHBF2 mMBi@HBF2
bi`m+ibV- p`BMib rBi? MK2/ /i- M/ p`BMib rBi? mMMK2/ /i UHBF2 imTH2 bi`m+ibVX lMHBF2
b2T`i2 bi`m+i /2}MBiBQMb- ?Qr2p2`- M enum Bb bBM;H2 ivT2X pHm2 Q7 i?2 2MmK +M Ki+? Mv
8XR9X Jh*>
R8d
Q7 i?2 p`BMibX 6Q` i?Bb `2bQM- M 2MmK Bb bQK2iBK2b +HH2/ bmK ivT2, i?2 b2i Q7 TQbbB#H2
pHm2b Q7 i?2 2MmK Bb i?2 bmK Q7 i?2 b2ib Q7 TQbbB#H2 pHm2b 7Q` 2+? p`BMiX
q2 mb2 i?2 :: bvMit iQ mb2 i?2 MK2 Q7 2+? p`BMi, i?2v`2 b+QT2/ #v i?2 MK2 Q7 i?2
Bib2H7X h?Bb HHQrb #Qi? Q7 i?2b2 iQ rQ`F,
enum
"Qi? p`BMib `2 MK2/ Move- #mi bBM+2 i?2v`2 b+QT2/ iQ i?2 MK2 Q7 i?2 2MmK- i?2v +M #Qi?
#2 mb2/ rBi?Qmi +QM~B+iX
pHm2 Q7 M 2MmK ivT2 +QMiBMb BM7Q`KiBQM #Qmi r?B+? p`BMi Bi Bb- BM //BiBQM iQ Mv /i
bbQ+Bi2/ rBi? i?i p`BMiX h?Bb Bb bQK2iBK2b `272``2/ iQ b i;;2/ mMBQM- bBM+2 i?2 /i
BM+Hm/2b i; BM/B+iBM; r?i ivT2 Bi BbX h?2 +QKTBH2` mb2b i?Bb BM7Q`KiBQM iQ 2M7Q`+2 i?i
vQm`2 ++2bbBM; i?2 /i BM i?2 2MmK b72HvX 6Q` BMbiM+2- vQm +Mi bBKTHv i`v iQ /2bi`m+im`2
pHm2 b B7 Bi r2`2 QM2 Q7 i?2 TQbbB#H2 p`BMib,
fn process_color_change(msg: Message) {
let Message::ChangeColor(r, g, b) = msg; // compile-time error
}
LQi bmTTQ`iBM; i?2b2 QT2`iBQMb Kv b22K `i?2` HBKBiBM;- #mi Bib HBKBiiBQM r?B+? r2 +M
Qp2`+QK2X h?2`2 `2 irQ rvb, #v BKTH2K2MiBM; 2[mHBiv Qm`b2Hp2b- Q` #v Tii2`M Ki+?BM;
p`BMib rBi? match Ub2+iBQM 8XR9- T;2 R8dV 2tT`2bbBQMb- r?B+? vQmHH H2`M BM i?2 M2ti b2+iBQMX
q2 /QMi FMQr 2MQm;? #Qmi _mbi iQ BKTH2K2Mi 2[mHBiv v2i- #mi r2HH }M/ Qmi BM i?2 traits
Ub2+iBQM 8Xky- T;2 RdjV b2+iBQMX
8XR9
Ji+?
P7i2M- bBKTH2 if Ub2+iBQM 8X8- T;2 RjRVfelse BbMi 2MQm;?- #2+mb2 vQm ?p2 KQ`2 i?M irQ
TQbbB#H2 QTiBQMbX HbQ- +QM/BiBQMb +M ;2i [mBi2 +QKTH2tX _mbi ?b F2vrQ`/- match- i?i HHQrb
vQm iQ `2TH+2 +QKTHB+i2/ iffelse ;`QmTBM;b rBi? bQK2i?BM; KQ`2 TQr2`7mHX *?2+F Bi Qmi,
let x = 5;
match x {
1 => println!("one"),
2 => println!("two"),
3 => println!("three"),
4 => println!("four"),
5 => println!("five"),
R83
iF2b M 2tT`2bbBQM M/ i?2M #`M+?2b #b2/ QM Bib pHm2X 1+? `K Q7 i?2 #`M+? Bb Q7
i?2 7Q`K val => expressionX q?2M i?2 pHm2 Ki+?2b- i?i `Kb 2tT`2bbBQM rBHH #2 2pHmi2/X
Aib +HH2/ match #2+mb2 Q7 i?2 i2`K Tii2`M Ki+?BM;- r?B+? match Bb M BKTH2K2MiiBQM Q7X
h?2`2b M 2MiB`2 b2+iBQM QM Tii2`Mb Ub2+iBQM 8XR8- T;2 R8NV i?i +Qp2`b HH i?2 Tii2`Mb i?i
`2 TQbbB#H2 ?2`2X
match
aQ r?ib i?2 #B; /pMi;2\ q2HH- i?2`2 `2 72rX 6B`bi Q7 HH- match 2M7Q`+2b 2t?mbiBp2M2bb
+?2+FBM;X .Q vQm b22 i?i Hbi `K- i?2 QM2 rBi? i?2 mM/2`b+Q`2 U_V\ A7 r2 `2KQp2 i?i `K_mbi rBHH ;Bp2 mb M 2``Q`,
error: non-exhaustive patterns: `_` not covered
AM Qi?2` rQ`/b- _mbi Bb i`vBM; iQ i2HH mb r2 7Q`;Qi pHm2X "2+mb2 x Bb M BMi2;2`- _mbi FMQrb
i?i Bi +M ?p2 MmK#2` Q7 /Bz2`2Mi pHm2b 7Q` 2tKTH2- 6X qBi?Qmi i?2 _- ?Qr2p2`- i?2`2 Bb
MQ `K i?i +QmH/ Ki+?- M/ bQ _mbi `27mb2b iQ +QKTBH2 i?2 +Q/2X _ +ib HBF2 +i+?@HH `KX
A7 MQM2 Q7 i?2 Qi?2` `Kb Ki+?- i?2 `K rBi? _ rBHH- M/ bBM+2 r2 ?p2 i?Bb +i+?@HH `K- r2
MQr ?p2 M `K 7Q` 2p2`v TQbbB#H2 pHm2 Q7 x- M/ bQ Qm` T`Q;`K rBHH +QKTBH2 bm++2bb7mHHvX
Bb HbQ M 2tT`2bbBQM- r?B+? K2Mb r2 +M mb2 Bi QM i?2 `B;?i@?M/ bB/2 Q7
Q` /B`2+iHv r?2`2 M 2tT`2bbBQM Bb mb2/,
match
let
#BM/BM;
let x = 5;
let number = match x {
1 => "one",
2 => "two",
3 => "three",
4 => "four",
5 => "five",
_ => "something else",
};
aQK2iBK2b Bib MB+2 rv Q7 +QMp2`iBM; bQK2i?BM; 7`QK QM2 ivT2 iQ MQi?2`X
match
enum Message {
Quit,
ChangeColor(i32, i32, i32),
Move { x: i32, y: i32 },
Write(String),
}
8XR8X Shh1_La
R8N
fn quit() { /* ... */ }
fn change_color(r: i32, g: i32, b: i32) { /* ... */ }
fn move_cursor(x: i32, y: i32) { /* ... */ }
fn process_message(msg: Message) {
match msg {
Message::Quit => quit(),
Message::ChangeColor(r, g, b) => change_color(r, g, b),
Message::Move { x: x, y: y } => move_cursor(x, y),
Message::Write(s) => println!("{}", s),
};
}
;BM- i?2 _mbi +QKTBH2` +?2+Fb 2t?mbiBp2M2bb- bQ Bi /2KM/b i?i vQm ?p2 Ki+? `K 7Q`
2p2`v p`BMi Q7 i?2 2MmKX A7 vQm H2p2 QM2 Qz- Bi rBHH ;Bp2 vQm +QKTBH2@iBK2 2``Q` mMH2bb vQm
mb2 _X
lMHBF2 i?2 T`2pBQmb mb2b Q7 match- vQm +Mi mb2 i?2 MQ`KH if bii2K2Mi iQ /Q i?BbX uQm +M
mb2 i?2 if let Ub2+iBQM 8Xkk- T;2 R3kV bii2K2Mi- r?B+? +M #2 b22M b M ##`2pBi2/ 7Q`K Q7
matchX
8XR8
Sii2`Mb
Sii2`Mb `2 [mBi2 +QKKQM BM _mbiX q2 mb2 i?2K BM p`B#H2 #BM/BM;b Ub2+iBQM 8XR- T;2 RRNVKi+? bii2K2Mib Ub2+iBQM 8XR9- T;2 R8dV- M/ Qi?2` TH+2b- iQQX G2ib ;Q QM r?B`HrBM/ iQm`
Q7 HH Q7 i?2 i?BM;b Tii2`Mb +M /Q5
[mB+F `27`2b?2`, vQm +M Ki+? ;BMbi HBi2`Hb /B`2+iHv- M/
let x = 1;
match x {
1 => println!("one"),
2 => println!("two"),
3 => println!("three"),
_ => println!("anything"),
}
h?Bb T`BMib
8XR8XR
oneX
JmHiBTH2 Tii2`Mb
Rey
h?Bb T`BMib
one or twoX
8XR8Xk _M;2b
uQm +M Ki+? `M;2 Q7 pHm2b rBi?
...,
let x = 1;
match x {
1 ... 5 => println!("one through five"),
_ => println!("anything"),
}
h?Bb T`BMib
charb,
let x = '';
match x {
'a' ... 'j' => println!("early letter"),
'k' ... 'z' => println!("late letter"),
_ => println!("something else"),
}
h?Bb T`BMib
something elseX
8XR8Xj "BM/BM;b
uQm +M #BM/ pHm2b iQ MK2b rBi? @,
let x = 1;
match x {
e @ 1 ... 5 => println!("got a range element {}", e),
_ => println!("anything"),
}
h?Bb T`BMib got a range element 1X h?Bb Bb mb27mH r?2M vQm rMi iQ /Q +QKTHB+i2/ Ki+? Q7
T`i Q7 /i bi`m+im`2,
8XR8X Shh1_La
ReR
#[derive(Debug)]
struct Person {
name: Option<String>,
}
let name = "Steve".to_string();
let mut x: Option<Person> = Some(Person { name: Some(name) });
match x {
Some(Person { name: ref a @ Some(_), .. }) => println!("{:?}", a),
_ => {}
}
h?Bb T`BMib
A7 vQm mb2
Some("Steve"),
name
iQ aX
rBi? |- vQm M22/ iQ KF2 bm`2 i?2 MK2 Bb #QmM/ BM 2+? T`i Q7 i?2 Tii2`M,
let x = 5;
match x {
e @ 1 ... 5 | e @ 8 ... 10 => println!("got a range element {}", e),
_ => println!("anything"),
}
8XR8X9
A;MQ`BM; p`BMib
h?Bb T`BMib
8XR8X8
Got an int!X
:m`/b
if,
..
Rek
enum OptionalInt {
Value(i32),
Missing,
}
let x = OptionalInt::Value(5);
match x {
OptionalInt::Value(i) if i > 5 => println!("Got an int bigger than five!"),
OptionalInt::Value(..) => println!("Got an int!"),
OptionalInt::Missing => println!("No such luck."),
}
h?Bb T`BMib
Got an int!X
ref
F2vrQ`/,
let x = 5;
match x {
ref r => println!("Got a reference to {}", r),
}
h?Bb T`BMib
Got a reference to 5X
>2`2- i?2 r BMbB/2 i?2 match ?b i?2 ivT2 &i32X AM Qi?2` rQ`/b- i?2 ref F2vrQ`/ +`2i2b
`272`2M+2- 7Q` mb2 BM i?2 Tii2`MX A7 vQm M22/ Kmi#H2 `272`2M+2- ref mut rBHH rQ`F BM i?2 bK2
rv,
let mut x = 5;
match x {
ref mut mr => println!("Got a mutable reference to {}", mr),
}
8XR8Xd .2bi`m+im`BM;
A7 vQm ?p2 +QKTQmM/ /i ivT2- HBF2
BMbB/2 Q7 Tii2`M,
struct Point {
x: i32,
y: i32,
}
struct
8XR8X Shh1_La
Rej
A7 r2 QMHv +`2 #Qmi bQK2 Q7 i?2 pHm2b- r2 /QMi ?p2 iQ ;Bp2 i?2K HH MK2b,
struct Point {
x: i32,
y: i32,
}
let origin = Point { x: 0, y: 0 };
match origin {
Point { x: x, .. } => println!("x is {}", x),
}
h?Bb T`BMib
x is 0X
uQm +M /Q i?Bb FBM/ Q7 Ki+? QM Mv K2K#2`- MQi Dmbi i?2 }`bi,
struct Point {
x: i32,
y: i32,
}
let origin = Point { x: 0, y: 0 };
match origin {
Point { y: y, .. } => println!("y is {}", y),
}
h?Bb T`BMib
y is 0X
h?Bb /2bi`m+im`BM; #2?pBQ` rQ`Fb QM Mv +QKTQmM/ /i ivT2- HBF2 imTH2bke Q` 2MmKb Ub2+@
iBQM 8XRj- T;2 R8eVX
8XR8X3
q?2r5 h?ib HQi Q7 /Bz2`2Mi rvb iQ Ki+? i?BM;b- M/ i?2v +M HH #2 KBt2/ M/ Ki+?2//2T2M/BM; QM r?i vQm`2 /QBM;,
match x {
Foo { x: Some(ref name), y: None } => ...
}
Re9
8XRe
J2i?Q/ avMit
6mM+iBQMb `2 ;`2i- #mi B7 vQm rMi iQ +HH #mM+? Q7 i?2K QM bQK2 /i- Bi +M #2 rFr`/X
*QMbB/2` i?Bb +Q/2,
baz(bar(foo)));
q2 rQmH/ `2/ i?Bb H27i@iQ `B;?i- M/ bQ r2 b22 #x #` 7QQX "mi i?Bb BbMi i?2 Q`/2` i?i i?2
7mM+iBQMb rQmH/ ;2i +HH2/ BM- i?ib BMbB/2@Qmi, 7QQ #` #xX qQmH/Mi Bi #2 MB+2 B7 r2 +QmH/ /Q
i?Bb BMbi2/\
foo.bar().baz();
Gm+FBHv- b vQm Kv ?p2 ;m2bb2/ rBi? i?2 H2/BM; [m2biBQM- vQm +M5 _mbi T`QpB/2b i?2 #BHBiv
iQ mb2 i?Bb K2i?Q/ +HH bvMit pB i?2 impl F2vrQ`/X
12.566371X
impl
J2i?Q/b iF2 bT2+BH }`bi T`K2i2`- Q7 r?B+? i?2`2 `2 i?`22 p`BMib, self- &self- M/ &mut
selfX uQm +M i?BMF Q7 i?Bb }`bi T`K2i2` b #2BM; i?2 foo BM foo.bar()X h?2 i?`22 p`BMib
+Q``2bTQM/ iQ i?2 i?`22 FBM/b Q7 i?BM;b foo +QmH/ #2, self B7 Bib Dmbi pHm2 QM i?2 bi+F- &self B7
Bib `272`2M+2- M/ &mut self B7 Bib Kmi#H2 `272`2M+2X "2+mb2 r2 iQQF i?2 &self T`K2i2`
iQ area- r2 +M mb2 Bi Dmbi HBF2 Mv Qi?2` T`K2i2`X "2+mb2 r2 FMQr Bib Circle- r2 +M
++2bb i?2 radius Dmbi HBF2 r2 rQmH/ rBi? Mv Qi?2` bi`m+iX
Re8
q2 b?QmH/ /27mHi iQ mbBM; &self- b vQm b?QmH/ T`272` #Q``QrBM; Qp2` iFBM; QrM2`b?BT- b r2HH
b iFBM; BKKmi#H2 `272`2M+2b Qp2` Kmi#H2 QM2bX >2`2b M 2tKTH2 Q7 HH i?`22 p`BMib,
struct Circle {
x: f64,
y: f64,
radius: f64,
}
impl Circle {
fn reference(&self) {
println!("taking self by reference!");
}
fn mutable_reference(&mut self) {
println!("taking self by mutable reference!");
}
fn takes_ownership(self) {
println!("taking ownership of self!");
}
}
8XReXk
aQ- MQr r2 FMQr ?Qr iQ +HH K2i?Q/- bm+? b foo.bar()X "mi r?i #Qmi Qm` Q`B;BMH 2tKTH2foo.bar().baz()\ h?Bb Bb +HH2/ K2i?Q/ +?BMBM;- M/ r2 +M /Q Bi #v `2im`MBM; selfX
struct Circle {
x: f64,
y: f64,
radius: f64,
}
impl Circle {
fn area(&self) -> f64 {
std::f64::consts::PI * (self.radius * self.radius)
}
fn grow(&self, increment: f64) -> Circle {
Circle { x: self.x, y: self.y, radius: self.radius + increment }
}
}
fn main() {
let c = Circle { x: 0.0, y: 0.0, radius: 2.0 };
println!("{}", c.area());
Ree
CircleX
self
struct Circle {
x: f64,
y: f64,
radius: f64,
}
impl Circle {
fn new(x: f64, y: f64, radius: f64) -> Circle {
Circle {
x: x,
y: y,
radius: radius,
}
}
}
fn main() {
let c = Circle::new(0.0, 0.0, 2.0);
}
h?Bb bbQ+Bi2/ 7mM+iBQM #mBH/b M2r Circle 7Q` mbX LQi2 i?i bbQ+Bi2/ 7mM+iBQMb `2 +HH2/
rBi? i?2 Struct::function() bvMit- `i?2` i?M i?2 ref.method() bvMitX aQK2 Qi?2` HM;m;2b
+HH bbQ+Bi2/ 7mM+iBQMb biiB+ K2i?Q/bX
Red
rBHH #2 1.0X _mbi /Q2bMi ?p2 K2i?Q/ Qp2`HQ/BM;- MK2/ `;mK2Mib- Q` p`B#H2 `;mK2MibX
q2 2KTHQv i?2 #mBH/2` Tii2`M BMbi2/X Ai HQQFb HBF2 i?Bb,
struct Circle {
x: f64,
y: f64,
radius: f64,
}
impl Circle {
fn area(&self) -> f64 {
std::f64::consts::PI * (self.radius * self.radius)
}
}
struct CircleBuilder {
x: f64,
y: f64,
radius: f64,
}
impl CircleBuilder {
fn new() -> CircleBuilder {
CircleBuilder { x: 0.0, y: 0.0, radius: 1.0, }
}
fn x(&mut self, coordinate: f64) -> &mut CircleBuilder {
self.x = coordinate;
self
}
fn y(&mut self, coordinate: f64) -> &mut CircleBuilder {
self.y = coordinate;
self
}
fn radius(&mut self, radius: f64) -> &mut CircleBuilder {
self.radius = radius;
self
}
fn finalize(&self) -> Circle {
Circle { x: self.x, y: self.y, radius: self.radius }
}
}
fn main() {
let c = CircleBuilder::new()
.x(1.0)
Re3
q?i r2p2 /QM2 ?2`2 Bb KF2 MQi?2` bi`m+i- CircleBuilderX q2p2 /2}M2/ Qm` #mBH/2` K2i?Q/b
QM BiX q2p2 HbQ /2}M2/ Qm` area() K2i?Q/ QM CircleX q2 HbQ K/2 QM2 KQ`2 K2i?Q/ QM
CircleBuilder, finalize()X h?Bb K2i?Q/ +`2i2b Qm` }MH Circle 7`QK i?2 #mBH/2`X LQr- r2p2
mb2/ i?2 ivT2 bvbi2K iQ 2M7Q`+2 Qm` +QM+2`Mb, r2 +M mb2 i?2 K2i?Q/b QM CircleBuilder iQ
+QMbi`BM KFBM; Circleb BM Mv rv r2 +?QQb2X
8XRd
o2+iQ`b
p2+iQ` Bb /vMKB+ Q` ;`Qr#H2 ``v- BKTH2K2Mi2/ b i?2 biM/`/ HB#``v ivT2 Vec<T>kd X
h?2 T K2Mb i?i r2 +M ?p2 p2+iQ`b Q7 Mv ivT2 Ub22 i?2 +?Ti2` QM ;2M2`B+b Ub2+iBQM 8XRNT;2 RdRV 7Q` KQ`2VX o2+iQ`b Hrvb HHQ+i2 i?2B` /i QM i?2 ?2TX uQm +M +`2i2 i?2K rBi?
i?2 vec! K+`Q,
let v = vec![1, 2, 3, 4, 5]; // v: Vec<i32>
ULQiB+2 i?i mMHBF2 i?2 println! K+`Q r2p2 mb2/ BM i?2 Tbi- r2 mb2 b[m`2 #`+F2ib
vec! K+`QX _mbi HHQrb vQm iQ mb2 2Bi?2` BM 2Bi?2` bBimiBQM- i?Bb Bb Dmbi +QMp2MiBQMXV
h?2`2b M Hi2`Mi2 7Q`K Q7
vec!
[]
rBi?
++2bbBM; 2H2K2Mib
hQ ;2i i?2 pHm2 i T`iB+mH` BM/2t BM i?2 p2+iQ`- r2 mb2
[]b,
v[2]X
Ai2`iBM;
PM+2 vQm ?p2 p2+iQ`- vQm +M Bi2`i2 i?`Qm;? Bib 2H2K2Mib rBi?
kd ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fp2+fBM/2tX?iKH
forX
8XR3X ah_AL:a
ReN
o2+iQ`b ?p2 KMv KQ`2 mb27mH K2i?Q/b- r?B+? vQm +M `2/ #Qmi BM i?2B` SA /Q+mK2MiiBQMk3 X
8XR3
ai`BM;b
ai`BM;b `2 M BKTQ`iMi +QM+2Ti 7Q` Mv T`Q;`KK2` iQ Kbi2`X _mbib bi`BM; ?M/HBM; bvbi2K
Bb #Bi /Bz2`2Mi 7`QK Qi?2` HM;m;2b- /m2 iQ Bib bvbi2Kb 7Q+mbX Mv iBK2 vQm ?p2 /i
bi`m+im`2 Q7 p`B#H2 bBx2- i?BM;b +M ;2i i`B+Fv- M/ bi`BM;b `2 `2@bBx#H2 /i bi`m+im`2X h?i
#2BM; bB/- _mbib bi`BM;b HbQ rQ`F /Bz2`2MiHv i?M BM bQK2 Qi?2` bvbi2Kb HM;m;2b- bm+? b *X
G2ib /B; BMiQ i?2 /2iBHbX bi`BM; Bb b2[m2M+2 Q7 lMB+Q/2 b+H` pHm2b 2M+Q/2/ b bi`2K Q7
lh6@3 #vi2bX HH bi`BM;b `2 ;m`Mi22/ iQ #2 pHB/ 2M+Q/BM; Q7 lh6@3 b2[m2M+2bX //BiBQMHHvmMHBF2 bQK2 bvbi2Kb HM;m;2b- bi`BM;b `2 MQi MmHH@i2`KBMi2/ M/ +M +QMiBM MmHH #vi2bX
_mbi ?b irQ KBM ivT2b Q7 bi`BM;b, &str M/ StringX G2ib iHF #Qmi
+HH2/ bi`BM; bHB+2bX ai`BM; HBi2`Hb `2 Q7 i?2 ivT2 &'static str,
&str
h?Bb bi`BM; Bb biiB+HHv HHQ+i2/- K2MBM; i?i Bib bp2/ BMbB/2 Qm` +QKTBH2/ T`Q;`K- M/ 2tBbib
7Q` i?2 2MiB`2 /m`iBQM Bi `mMbX h?2 string #BM/BM; Bb `272`2M+2 iQ i?Bb biiB+HHv HHQ+i2/ bi`BM;X
ai`BM; bHB+2b ?p2 }t2/ bBx2- M/ +MMQi #2 Kmii2/X
String- QM i?2 Qi?2` ?M/- Bb ?2T@HHQ+i2/ bi`BM;X h?Bb bi`BM; Bb ;`Qr#H2- M/ Bb HbQ
;m`Mi22/ iQ #2 lh6@3X Stringb `2 +QKKQMHv +`2i2/ #v +QMp2`iBM; 7`QK bi`BM; bHB+2 mbBM;
i?2 to_string K2i?Q/X
let mut s = "Hello".to_string(); // mut s: String
println!("{}", s);
s.push_str(", world.");
println!("{}", s);
Stringb
&str
rBi? M &,
k3 ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fp2+fBM/2tX?iKH
Rdy
fn takes_slice(slice: &str) {
println!("Got: {}", slice);
}
fn main() {
let s = "Hello".to_string();
takes_slice(&s);
}
&str
iQ
String
BMpQHp2b HHQ+iBM;
AM/2tBM;
"2+mb2 bi`BM;b `2 pHB/ lh6@3- bi`BM;b /Q MQi bmTTQ`i BM/2tBM;,
let s = "hello";
println!("The first letter of s is {}", s[0]); // ERROR!!!
lbmHHv- ++2bb iQ p2+iQ` rBi? [] Bb p2`v 7biX "mi- #2+mb2 2+? +?`+i2` BM lh6@3 2M+Q/2/
bi`BM; +M #2 KmHiBTH2 #vi2b- vQm ?p2 iQ rHF Qp2` i?2 bi`BM; iQ }M/ i?2 M H2ii2` Q7 bi`BM;X h?Bb
Bb bB;MB}+MiHv KQ`2 2tT2MbBp2 QT2`iBQM- M/ r2 /QMi rMi iQ #2 KBbH2/BM;X 6m`i?2`KQ`2H2ii2` BbMi bQK2i?BM; /2}M2/ BM lMB+Q/2- 2t+iHvX q2 +M +?QQb2 iQ HQQF i bi`BM; b BM/BpB/mH
#vi2b- Q` b +Q/2TQBMib,
let hachiko = "
";
for b in hachiko.as_bytes() {
print!("{}, ", b);
}
println!("");
for c in hachiko.chars() {
print!("{}, ", c);
}
println!("");
h?Bb T`BMib,
229, 191, 160, 231, 138, 172, 227, 131, 143, 227, 131, 129, 229, 133, 172,
, , , , ,
charbX
8XRNX :1L1_A*a
RdR
charsX
*QM+i2MiBQM
A7 vQm ?p2
String-
&str
Stringb-
8XRN
&strX
:2M2`B+b
aQK2iBK2b- r?2M r`BiBM; 7mM+iBQM Q` /i ivT2- r2 Kv rMi Bi iQ rQ`F 7Q` KmHiBTH2 ivT2b Q7
`;mK2MibX Gm+FBHv- _mbi ?b 72im`2 i?i ;Bp2b mb #2ii2` rv, ;2M2`B+bX :2M2`B+b `2 +HH2/
T`K2i`B+ TQHvKQ`T?BbK BM ivT2 i?2Q`v- r?B+? K2Mb i?i i?2v `2 ivT2b Q` 7mM+iBQMb i?i
?p2 KmHiBTH2 7Q`Kb UTQHv Bb KmHiBTH2- KQ`T? Bb 7Q`KV Qp2` ;Bp2M T`K2i2` UT`K2i`B+VX
Mvrv- 2MQm;? rBi? ivT2 i?2Q`v- H2ib +?2+F Qmi bQK2 ;2M2`B+ +Q/2X _mbib biM/`/ HB#``v
T`QpB/2b ivT2- Option<T>- i?ib ;2M2`B+,
enum Option<T> {
Some(T),
None,
}
h?2 <T> T`i- r?B+? vQmp2 b22M 72r iBK2b #27Q`2- BM/B+i2b i?i i?Bb Bb ;2M2`B+ /i ivT2X
AMbB/2 i?2 /2+H`iBQM Q7 Qm` 2MmK- r?2`2p2` r2 b22 T- r2 bm#biBimi2 i?i ivT2 7Q` i?2 bK2 ivT2
mb2/ BM i?2 ;2M2`B+X >2`2b M 2tKTH2 Q7 mbBM; Option<T>- rBi? bQK2 2ti` ivT2 MMQiiBQMb,
let x: Option<i32> = Some(5);
Rdk
AM i?2 ivT2 /2+H`iBQM- r2 bv Option<i32>X LQi2 ?Qr bBKBH` i?Bb HQQFb iQ Option<T>X aQ- BM
i?Bb T`iB+mH` Option- T ?b i?2 pHm2 Q7 i32X PM i?2 `B;?i@?M/ bB/2 Q7 i?2 #BM/BM;- r2 /Q KF2
Some(T)- r?2`2 T Bb 5X aBM+2 i?ib M i32- i?2 irQ bB/2b Ki+?- M/ _mbi Bb ?TTvX A7 i?2v
/B/Mi Ki+?- r2/ ;2i M 2``Q`,
let x: Option<f64> = Some(5);
// error: mismatched types: expected `core::option::Option<f64>`,
// found `core::option::Option<_>` (expected f64 but found integral variable)
Option<T>b
i?i ?QH/ M
f645
h?Bb ivT2 Bb ;2M2`B+ Qp2` irQ ivT2b, T M/ EX "v i?2 rv- i?2 +TBiH H2ii2`b +M #2 Mv H2ii2`
vQm/ HBF2X q2 +QmH/ /2}M2 Result<T, E> b,
enum Result<A, Z> {
Ok(A),
Err(Z),
}
B7 r2 rMi2/ iQX *QMp2MiBQM bvb i?i i?2 }`bi ;2M2`B+ T`K2i2` b?QmH/ #2 T- 7Q` ivT2- M/
i?i r2 mb2 E 7Q` 2``Q`X _mbi /Q2bMi +`2- ?Qr2p2`X
h?2 Result<T, E> ivT2 Bb BMi2M/2/ iQ #2 mb2/ iQ `2im`M i?2 `2bmHi Q7 +QKTmiiBQM- M/ iQ ?p2
i?2 #BHBiv iQ `2im`M M 2``Q` B7 Bi /B/Mi rQ`F QmiX
:2M2`B+ 7mM+iBQMb
q2 +M r`Bi2 7mM+iBQMb i?i iF2 ;2M2`B+ ivT2b rBi? bBKBH` bvMit,
fn takes_anything<T>(x: T) {
// do something with x
}
<T>
x: T
8XkyX h_Aha
Rdj
fn takes_two_of_the_same_things<T>(x: T, y: T) {
// ...
}
:2M2`B+ 7mM+iBQMb `2 KQbi mb27mH rBi? i`Bi #QmM/b- r?B+? r2HH +Qp2` BM i?2 b2+iBQM QM i`Bib
Ub2+iBQM 8Xky- T;2 RdjVX
:2M2`B+ bi`m+ib
uQm +M biQ`2 ;2M2`B+ ivT2 BM
struct
b r2HH,
struct Point<T> {
x: T,
y: T,
}
let int_origin = Point { x: 0, y: 0 };
let float_origin = Point { x: 0.0, y: 0.0 };
aBKBH`Hv iQ 7mM+iBQMb- i?2 <T> Bb r?2`2 r2 /2+H`2 i?2 ;2M2`B+ T`K2i2`b- M/ r2 i?2M mb2
BM i?2 ivT2 /2+H`iBQM- iQQX
8Xky
h`Bib
impl
struct Circle {
x: f64,
y: f64,
radius: f64,
}
impl Circle {
fn area(&self) -> f64 {
std::f64::consts::PI * (self.radius * self.radius)
}
}
x: T
Rd9
h`Bib `2 bBKBH`- 2t+2Ti i?i r2 /2}M2 i`Bi rBi? Dmbi i?2 K2i?Q/ bB;Mim`2- i?2M BKTH2K2Mi
i?2 i`Bi 7Q` i?i bi`m+iX GBF2 i?Bb,
struct Circle {
x: f64,
y: f64,
radius: f64,
}
trait HasArea {
fn area(&self) -> f64;
}
impl HasArea for Circle {
fn area(&self) -> f64 {
std::f64::consts::PI * (self.radius * self.radius)
}
}
b vQm +M b22- i?2 trait #HQ+F HQQFb p2`v bBKBH` iQ i?2 impl #HQ+F- #mi r2 /QMi /2}M2 #Q/vDmbi ivT2 bB;Mim`2X q?2M r2 impl i`Bi- r2 mb2 impl Trait for Item- `i?2` i?M Dmbi impl
ItemX
q2 +M mb2 i`Bib iQ +QMbi`BM Qm` ;2M2`B+bX *QMbB/2` i?Bb 7mM+iBQM- r?B+? /Q2b MQi +QKTBH2- M/
;Bp2b mb bBKBH` 2``Q`,
fn print_area<T>(shape: T) {
println!("This shape has an area of {}", shape.area());
}
_mbi +QKTHBMb,
error: type `T` does not implement any method in scope named `area`
area
fn print_area<T: HasArea>(shape: T) {
println!("This shape has an area of {}", shape.area());
}
h?2 bvMit <T: HasArea> K2Mb any type that implements the HasArea traitX "2+mb2 i`Bib
/2}M2 7mM+iBQM ivT2 bB;Mim`2b- r2 +M #2 bm`2 i?i Mv ivT2 r?B+? BKTH2K2Mib HasArea rBHH
?p2 M .area() K2i?Q/X
>2`2b M 2ti2M/2/ 2tKTH2 Q7 ?Qr i?Bb rQ`Fb,
8XkyX h_Aha
trait HasArea {
fn area(&self) -> f64;
}
struct Circle {
x: f64,
y: f64,
radius: f64,
}
impl HasArea for Circle {
fn area(&self) -> f64 {
std::f64::consts::PI * (self.radius * self.radius)
}
}
struct Square {
x: f64,
y: f64,
side: f64,
}
impl HasArea for Square {
fn area(&self) -> f64 {
self.side * self.side
}
}
fn print_area<T: HasArea>(shape: T) {
println!("This shape has an area of {}", shape.area());
}
fn main() {
let c = Circle {
x: 0.0f64,
y: 0.0f64,
radius: 1.0f64,
};
let s = Square {
x: 0.0f64,
y: 0.0f64,
side: 1.0f64,
};
print_area(c);
print_area(s);
}
Rd8
Rde
b vQm +M b22- print_area Bb MQr ;2M2`B+- #mi HbQ 2Mbm`2b i?i r2 ?p2 Tbb2/ BM i?2 +Q``2+i
ivT2bX A7 r2 Tbb BM M BM+Q``2+i ivT2,
print_area(5);
aQ 7`- r2p2 QMHv //2/ i`Bi BKTH2K2MiiBQMb iQ bi`m+ib- #mi vQm +M BKTH2K2Mi i`Bi 7Q` Mv
ivT2X aQ i2+?MB+HHv- r2 +QmH/ BKTH2K2Mi HasArea 7Q` i32,
trait HasArea {
fn area(&self) -> f64;
}
impl HasArea for i32 {
fn area(&self) -> f64 {
println!("this is silly");
*self as f64
}
}
5.area();
Ai Bb +QMbB/2`2/ TQQ` bivH2 iQ BKTH2K2Mi K2i?Q/b QM bm+? T`BKBiBp2 ivT2b- 2p2M i?Qm;? Bi Bb
TQbbB#H2X
h?Bb Kv b22K HBF2 i?2 qBH/ q2bi- #mi i?2`2 `2 irQ Qi?2` `2bi`B+iBQMb `QmM/ BKTH2K2MiBM;
i`Bib i?i T`2p2Mi i?Bb 7`QK ;2iiBM; Qmi Q7 ?M/X h?2 }`bi Bb i?i B7 i?2 i`Bi BbMi /2}M2/ BM vQm`
b+QT2- Bi /Q2bMi TTHvX >2`2b M 2tKTH2, i?2 biM/`/ HB#``v T`QpB/2b WritekN i`Bi r?B+?
//b 2ti` 7mM+iBQMHBiv iQ Fileb- 7Q` /QBM; }H2 AfPX "v /27mHi- File rQMi ?p2 Bib K2i?Q/b,
let mut f = std::fs::File::open("foo.txt").ok().expect("Couldnt open foo.txt");
let result = f.write("whatever".as_bytes());
8XkyX h_Aha
q2 M22/ iQ
use
Rdd
i?2
Write
i`Bi }`bi,
use std::io::Write;
let mut f = std::fs::File::open("foo.txt").ok().expect("Couldnt open foo.txt");
let result = f.write("whatever".as_bytes());
int-
Bi rQMi z2+i
h?2`2b QM2 KQ`2 `2bi`B+iBQM QM BKTH2K2MiBM; i`BibX 1Bi?2` i?2 i`Bi Q` i?2 ivT2 vQm`2 r`BiBM;
i?2 impl 7Q` Kmbi #2 /2}M2/ #v vQmX aQ- r2 +QmH/ BKTH2K2Mi i?2 HasArea ivT2 7Q` i32- #2+mb2
HasArea Bb BM Qm` +Q/2X "mi B7 r2 i`B2/ iQ BKTH2K2Mi Float- i`Bi T`QpB/2/ #v _mbi- 7Q` i32- r2
+QmH/ MQi- #2+mb2 M2Bi?2` i?2 i`Bi MQ` i?2 ivT2 `2 BM Qm` +Q/2X
PM2 Hbi i?BM; #Qmi i`Bib, ;2M2`B+ 7mM+iBQMb rBi? i`Bi #QmM/ mb2 KQMQKQ`T?BxiBQM UKQMQ,
QM2- KQ`T?, 7Q`KV- bQ i?2v `2 biiB+HHv /BbTi+?2/X q?ib i?i K2M\ *?2+F Qmi i?2 +?Ti2`
QM i`Bi Q#D2+ib Ub2+iBQM 8Xkj- T;2 R3jV 7Q` KQ`2 /2iBHbX
8XkyXR
uQmp2 b22M i?i vQm +M #QmM/ ;2M2`B+ ivT2 T`K2i2` rBi? i`Bi,
fn foo<T: Clone>(x: T) {
x.clone();
}
8XkyXk
Clone
b r2HH b
DebugX
q?2`2 +Hmb2
q`BiBM; 7mM+iBQMb rBi? QMHv 72r ;2M2`B+ ivT2b M/ bKHH MmK#2` Q7 i`Bi #QmM/b BbMi iQQ
#/- #mi b i?2 MmK#2` BM+`2b2b- i?2 bvMit ;2ib BM+`2bBM;Hv rFr`/,
use std::fmt::Debug;
fn foo<T: Clone, K: Clone + Debug>(x: T, y: K) {
Rd3
h?2 MK2 Q7 i?2 7mM+iBQM Bb QM i?2 7` H27i- M/ i?2 T`K2i2` HBbi Bb QM i?2 7` `B;?iX h?2 #QmM/b
`2 ;2iiBM; BM i?2 rvX
_mbi ?b bQHmiBQM- M/ Bib +HH2/ where +Hmb2,
use std::fmt::Debug;
fn foo<T: Clone, K: Clone + Debug>(x: T, y: K) {
x.clone();
y.clone();
println!("{:?}", y);
}
fn bar<T, K>(x: T, y: K) where T: Clone, K: Clone + Debug {
x.clone();
y.clone();
println!("{:?}", y);
}
fn main() {
foo("Hello", "world");
bar("Hello", "workd");
}
mb2b i?2 bvMit r2 b?Qr2/ 2`HB2`- M/ bar() mb2b where +Hmb2X HH vQm M22/ iQ /Q Bb
H2p2 Qz i?2 #QmM/b r?2M /2}MBM; vQm` ivT2 T`K2i2`b- M/ i?2M // where 7i2` i?2 T`K2i2`
HBbiX 6Q` HQM;2` HBbib- r?Bi2bT+2 +M #2 //2/,
foo()
use std::fmt::Debug;
fn bar<T, K>(x: T, y: K)
where T: Clone,
K: Clone + Debug {
x.clone();
y.clone();
println!("{:?}", y);
}
8XkyX h_Aha
RdN
trait ConvertTo<Output> {
fn convert(&self) -> Output;
}
impl ConvertTo<i64> for i32 {
fn convert(&self) -> i64 { *self as i64 }
}
// can be called with T == i32
fn normal<T: ConvertTo<i64>>(x: &T) -> i64 {
x.convert()
}
// can be called with T == i64
fn inverse<T>() -> T
// this is using ConvertTo as if it were "ConvertFrom<i32>"
where i32: ConvertTo<T> {
1i32.convert()
}
h?Bb b?Qrb Qz i?2 //BiBQMH 72im`2 Q7 where +Hmb2b, i?2v HHQr #QmM/b r?2`2 i?2 H27i@?M/
bB/2 Bb M `#Bi``v ivT2 Ui32 BM i?Bb +b2V- MQi Dmbi THBM ivT2 T`K2i2` UHBF2 TVX
.27mHi K2i?Q/b
h?2`2b QM2 Hbi 72im`2 Q7 i`Bib r2 b?QmH/ +Qp2`, /27mHi K2i?Q/bX Aib 2bB2bi Dmbi iQ b?Qr M
2tKTH2,
trait Foo {
fn bar(&self);
fn baz(&self) { println!("We called baz."); }
}
AKTH2K2MiQ`b Q7 i?2 Foo i`Bi M22/ iQ BKTH2K2Mi bar()- #mi i?2v /QMi M22/ iQ BKTH2K2Mi baz()X
h?2vHH ;2i i?Bb /27mHi #2?pBQ`X h?2v +M Qp2``B/2 i?2 /27mHi B7 i?2v bQ +?QQb2,
struct UseDefault;
impl Foo for UseDefault {
fn bar(&self) { println!("We called bar."); }
}
struct OverrideDefault;
impl Foo for OverrideDefault {
fn bar(&self) { println!("We called bar."); }
R3y
}
let default = UseDefault;
default.baz(); // prints "We called baz."
let over = OverrideDefault;
over.baz(); // prints "Override baz!"
8XkyXj AM?2`BiM+2
aQK2iBK2b- BKTH2K2MiBM; i`Bi `2[mB`2b BKTH2K2MiBM; MQi?2` i`Bi,
trait Foo {
fn foo(&self);
}
trait FooBar : Foo {
fn foobar(&self);
}
AKTH2K2MiQ`b Q7
FooBar
Foo-
HBF2 i?Bb,
struct Baz;
impl Foo for Baz {
fn foo(&self) { println!("foo"); }
}
impl FooBar for Baz {
fn foobar(&self) { println!("foobar"); }
}
A7 r2 7Q`;2i iQ BKTH2K2Mi
Foo-
error: the trait `main::Foo` is not implemented for the type `main::Baz` [E0277]
8XkR
.`QT
LQr i?i r2p2 /Bb+mbb2/ i`Bib- H2ib iHF #Qmi T`iB+mH` i`Bi T`QpB/2/ #v i?2 _mbi biM/`/
HB#``v- Dropjy X h?2 Drop i`Bi T`QpB/2b rv iQ `mM bQK2 +Q/2 r?2M pHm2 ;Q2b Qmi Q7 b+QT2X
6Q` 2tKTH2,
jy ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fQTbfi`BiX.`QTX?iKH
8XkRX ._PS
R3R
struct HasDrop;
impl Drop for HasDrop {
fn drop(&mut self) {
println!("Dropping!");
}
}
fn main() {
let x = HasDrop;
// do stuff
} // x goes out of scope here
q?2M x ;Q2b Qmi Q7 b+QT2 i i?2 2M/ Q7 main()- i?2 +Q/2 7Q` Drop rBHH `mMX
r?B+? Bb HbQ +HH2/ drop()X Ai iF2b Kmi#H2 `272`2M+2 iQ selfX
Drop
h?ib Bi5 h?2 K2+?MB+b Q7 Drop `2 p2`v bBKTH2- #mi i?2`2 `2 bQK2 bm#iH2iB2bX 6Q` 2tKTH2pHm2b `2 /`QTT2/ BM i?2 QTTQbBi2 Q`/2` i?2v `2 /2+H`2/X >2`2b MQi?2` 2tKTH2,
struct Firework {
strength: i32,
}
impl Drop for Firework {
fn drop(&mut self) {
println!("BOOM times {}!!!", self.strength);
}
}
fn main() {
let firecracker = Firework { strength: 1 };
let tnt = Firework { strength: 100 };
}
h?2 hLh ;Q2b Qz #27Q`2 i?2 }`2+`+F2` /Q2b- #2+mb2 Bi rb /2+H`2/ 7i2`r`/bX Gbi BM- }`bi
QmiX
aQ r?i Bb Drop ;QQ/ 7Q`\ :2M2`HHv- Drop Bb mb2/ iQ +H2M mT Mv `2bQm`+2b bbQ+Bi2/ rBi?
structX 6Q` 2tKTH2- i?2 Arc<T> ivT2jR Bb `272`2M+2@+QmMi2/ ivT2X q?2M Drop Bb +HH2/- Bi rBHH
/2+`2K2Mi i?2 `272`2M+2 +QmMi- M/ B7 i?2 iQiH MmK#2` Q7 `272`2M+2b Bb x2`Q- rBHH +H2M mT i?2
mM/2`HvBM; pHm2X
jR ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fbvM+fbi`m+iX`+X?iKH
R3k
8Xkk
B7 H2i
if
M/
let
6Q` 2tKTH2- H2ib bv r2 ?p2 bQK2 bQ`i Q7 Option<T>X q2 rMi iQ +HH 7mM+iBQM QM Bi B7 Bib
Some<T>- #mi /Q MQi?BM; B7 Bib NoneX h?i HQQFb HBF2 i?Bb,
match option {
Some(x) => { foo(x) },
None => {},
}
match
if,
if option.is_some() {
let x = option.unwrap();
foo(x);
}
if let
A7 Tii2`M Ub2+iBQM 8XR8- T;2 R8NV Ki+?2b bm++2bb7mHHv- Bi #BM/b Mv TT`QT`Bi2 T`ib Q7 i?2
pHm2 iQ i?2 B/2MiB}2`b BM i?2 Tii2`M- i?2M 2pHmi2b i?2 2tT`2bbBQMX A7 i?2 Tii2`M /Q2bMi
Ki+?- MQi?BM; ?TT2MbX
A7 vQm/ `i?2` iQ /Q bQK2i?BM; 2Hb2 r?2M i?2 Tii2`M /Q2b MQi Ki+?- vQm +M mb2
else,
while let
AM bBKBH` 7b?BQM- while let +M #2 mb2/ r?2M vQm rMi iQ +QM/BiBQMHHv HQQT b HQM; b
pHm2 Ki+?2b +2`iBM Tii2`MX Ai im`Mb +Q/2 HBF2 i?Bb,
loop {
match option {
Some(x) => println!("{}", x),
_ => break,
}
}
R3j
8Xkj
h`Bi P#D2+ib
q?2M +Q/2 BMpQHp2b TQHvKQ`T?BbK- i?2`2 M22/b iQ #2 K2+?MBbK iQ /2i2`KBM2 r?B+? bT2+B}+
p2`bBQM Bb +imHHv `mMX h?Bb Bb +HH2/ /BbTi+?X h?2`2 `2 irQ KDQ` 7Q`Kb Q7 /BbTi+?, biiB+
/BbTi+? M/ /vMKB+ /BbTi+?X q?BH2 _mbi 7pQ`b biiB+ /BbTi+?- Bi HbQ bmTTQ`ib /vMKB+
/BbTi+? i?`Qm;? K2+?MBbK +HH2/ i`Bi Q#D2+ibX
"+F;`QmM/
6Q` i?2 `2bi Q7 i?Bb +?Ti2`- r2HH M22/ i`Bi M/ bQK2 BKTH2K2MiiBQMbX G2ib KF2 bBKTH2
QM2- FooX Ai ?b QM2 K2i?Q/ i?i Bb 2tT2+i2/ iQ `2im`M StringX
trait Foo {
fn method(&self) -> String;
}
u8
M/
String,
aiiB+ /BbTi+?
q2 +M mb2 i?Bb i`Bi iQ T2`7Q`K biiB+ /BbTi+? rBi? i`Bi #QmM/b,
fn do_something<T: Foo>(x: T) {
x.method();
}
fn main() {
let x = 5u8;
let y = "Hello".to_string();
do_something(x);
do_something(y);
}
R39
_mbi mb2b KQMQKQ`T?BxiBQM iQ T2`7Q`K biiB+ /BbTi+? ?2`2X h?Bb K2Mb i?i _mbi rBHH +`2i2
bT2+BH p2`bBQM Q7 do_something() 7Q` #Qi? u8 M/ String- M/ i?2M `2TH+2 i?2 +HH bBi2b rBi?
+HHb iQ i?2b2 bT2+BHBx2/ 7mM+iBQMbX AM Qi?2` rQ`/b- _mbi ;2M2`i2b bQK2i?BM; HBF2 i?Bb,
fn do_something_u8(x: u8) {
x.method();
}
fn do_something_string(x: String) {
x.method();
}
fn main() {
let x = 5u8;
let y = "Hello".to_string();
do_something_u8(x);
do_something_string(y);
}
h?Bb ?b ;`2i mTbB/2, biiB+ /BbTi+? HHQrb 7mM+iBQM +HHb iQ #2 BMHBM2/ #2+mb2 i?2 +HH22
Bb FMQrM i +QKTBH2 iBK2- M/ BMHBMBM; Bb i?2 F2v iQ ;QQ/ QTiBKBxiBQMX aiiB+ /BbTi+? Bb 7bi#mi Bi +QK2b i i`/2Qz, +Q/2 #HQi- /m2 iQ KMv +QTB2b Q7 i?2 bK2 7mM+iBQM 2tBbiBM; BM i?2
#BM`v- QM2 7Q` 2+? ivT2X
6m`i?2`KQ`2- +QKTBH2`b `2Mi T2`72+i M/ Kv QTiBKBx2 +Q/2 iQ #2+QK2 bHQr2`X 6Q` 2tKTH27mM+iBQMb BMHBM2/ iQQ 2;2`Hv rBHH #HQi i?2 BMbi`m+iBQM ++?2 U++?2 `mH2b 2p2`vi?BM; `QmM/ mbVX
h?Bb Bb T`i Q7 i?2 `2bQM i?i #[inline] M/ #[inline(always)] b?QmH/ #2 mb2/ +`27mHHv- M/
QM2 `2bQM r?v mbBM; /vMKB+ /BbTi+? Bb bQK2iBK2b KQ`2 2{+B2MiX
>Qr2p2`- i?2 +QKKQM +b2 Bb i?i Bi Bb KQ`2 2{+B2Mi iQ mb2 biiB+ /BbTi+?- M/ QM2 +M Hrvb
?p2 i?BM biiB+HHv@/BbTi+?2/ r`TT2` 7mM+iBQM i?i /Q2b /vMKB+ /BbTi+?- #mi MQi pB+2
p2`b- K2MBM; biiB+ +HHb `2 KQ`2 ~2tB#H2X h?2 biM/`/ HB#``v i`B2b iQ #2 biiB+HHv /BbTi+?2/
r?2`2 TQbbB#H2 7Q` i?Bb `2bQMX
.vMKB+ /BbTi+?
_mbi T`QpB/2b /vMKB+ /BbTi+? i?`Qm;? 72im`2 +HH2/ i`Bi Q#D2+ibX h`Bi Q#D2+ib- HBF2 &Foo
Q` Box<Foo>- `2 MQ`KH pHm2b i?i biQ`2 pHm2 Q7 Mv ivT2 i?i BKTH2K2Mib i?2 ;Bp2M i`Bir?2`2 i?2 T`2+Bb2 ivT2 +M QMHv #2 FMQrM i `mMiBK2X
i`Bi Q#D2+i +M #2 Q#iBM2/ 7`QK TQBMi2` iQ +QM+`2i2 ivT2 i?i BKTH2K2Mib i?2 i`Bi #v
+biBM; Bi U2X;X &x as &FooV Q` +Q2`+BM; Bi U2X;X mbBM; &x b M `;mK2Mi iQ 7mM+iBQM i?i iF2b
&FooVX
h?2b2 i`Bi Q#D2+i +Q2`+BQMb M/ +bib HbQ rQ`F 7Q` TQBMi2`b HBF2 &mut T iQ &mut
iQ Box<Foo>- #mi i?ib HH i i?2 KQK2MiX *Q2`+BQMb M/ +bib `2 B/2MiB+HX
Foo
M/
Box<T>
h?Bb QT2`iBQM +M #2 b22M b 2`bBM; i?2 +QKTBH2`b FMQrH2/;2 #Qmi i?2 bT2+B}+ ivT2 Q7 i?2
TQBMi2`- M/ ?2M+2 i`Bi Q#D2+ib `2 bQK2iBK2b `272``2/ iQ b ivT2 2`bm`2X
R38
*QKBM; #+F iQ i?2 2tKTH2 #Qp2- r2 +M mb2 i?2 bK2 i`Bi iQ T2`7Q`K /vMKB+ /BbTi+? rBi?
i`Bi Q#D2+ib #v +biBM;,
fn do_something(x: &Foo) {
x.method();
}
fn main() {
let x = 5u8;
do_something(&x as &Foo);
}
Q` #v +Q2`+BM;,
fn do_something(x: &Foo) {
x.method();
}
fn main() {
let x = "Hello".to_string();
do_something(&x);
}
7mM+iBQM i?i iF2b i`Bi Q#D2+i Bb MQi bT2+BHBx2/ iQ 2+? Q7 i?2 ivT2b i?i BKTH2K2Mib Foo,
QMHv QM2 +QTv Bb ;2M2`i2/- Q7i2M U#mi MQi HrvbV `2bmHiBM; BM H2bb +Q/2 #HQiX >Qr2p2`- i?Bb
+QK2b i i?2 +Qbi Q7 `2[mB`BM; bHQr2` pB`imH 7mM+iBQM +HHb- M/ 2z2+iBp2Hv BM?B#BiBM; Mv +?M+2
Q7 BMHBMBM; M/ `2Hi2/ QTiBKBxiBQMb 7`QK Q++m``BM;X
q?v TQBMi2`b\ _mbi /Q2b MQi Tmi i?BM;b #2?BM/ TQBMi2` #v /27mHi- mMHBF2 KMv KM;2/
HM;m;2b- bQ ivT2b +M ?p2 /Bz2`2Mi bBx2bX EMQrBM; i?2 bBx2 Q7 i?2 pHm2 i +QKTBH2 iBK2 Bb
BKTQ`iMi 7Q` i?BM;b HBF2 TbbBM; Bi b M `;mK2Mi iQ 7mM+iBQM- KQpBM; Bi #Qmi QM i?2 bi+F
M/ HHQ+iBM; UM/ /2HHQ+iBM;V bT+2 QM i?2 ?2T iQ biQ`2 BiX
6Q` Foo- r2 rQmH/ M22/ iQ ?p2 pHm2 i?i +QmH/ #2 i H2bi 2Bi?2` String Uk9 #vi2bV Q` u8
UR #vi2V- b r2HH b Mv Qi?2` ivT2 7Q` r?B+? /2T2M/2Mi +`i2b Kv BKTH2K2Mi Foo UMv MmK#2`
Q7 #vi2b i HHVX h?2`2b MQ rv iQ ;m`Mi22 i?i i?Bb Hbi TQBMi +M rQ`F B7 i?2 pHm2b `2 biQ`2/
rBi?Qmi TQBMi2`- #2+mb2 i?Qb2 Qi?2` ivT2b +M #2 `#Bi``BHv H`;2X
SmiiBM; i?2 pHm2 #2?BM/ TQBMi2` K2Mb i?2 bBx2 Q7 i?2 pHm2 Bb MQi `2H2pMi r?2M r2 `2 iQbbBM;
i`Bi Q#D2+i `QmM/- QMHv i?2 bBx2 Q7 i?2 TQBMi2` Bib2H7X
_2T`2b2MiiBQM h?2 K2i?Q/b Q7 i?2 i`Bi +M #2 +HH2/ QM i`Bi Q#D2+i pB bT2+BH `2+Q`/
Q7 7mM+iBQM TQBMi2`b i`/BiBQMHHv +HH2/ pi#H2 U+`2i2/ M/ KM;2/ #v i?2 +QKTBH2`VX
h`Bi Q#D2+ib `2 #Qi? bBKTH2 M/ +QKTHB+i2/, i?2B` +Q`2 `2T`2b2MiiBQM M/ HvQmi Bb [mBi2
bi`B;?i@7Q`r`/- #mi i?2`2 `2 bQK2 +m`Hv 2``Q` K2bb;2b M/ bm`T`BbBM; #2?pBQ`b iQ /Bb+Qp2`X
R3e
G2ib bi`i bBKTH2- rBi? i?2 `mMiBK2 `2T`2b2MiiBQM Q7 i`Bi Q#D2+iX h?2 std::raw KQ/mH2
+QMiBMb bi`m+ib rBi? HvQmib i?i `2 i?2 bK2 b i?2 +QKTHB+i2/ #mBHi@BM ivT2b- BM+Hm/BM; i`Bi
Q#D2+ibjk ,
pub struct TraitObject {
pub data: *mut (),
pub vtable: *mut (),
}
&Foo
h?2 /i TQBMi2` //`2bb2b i?2 /i UQ7 bQK2 mMFMQrM ivT2 TV i?i i?2 i`Bi Q#D2+i Bb biQ`@
BM;- M/ i?2 pi#H2 TQBMi2` TQBMib iQ i?2 pi#H2 UpB`imH K2i?Q/ i#H2V +Q``2bTQM/BM; iQ i?2
BKTH2K2MiiBQM Q7 Foo 7Q` TX
pi#H2 Bb 2bb2MiBHHv bi`m+i Q7 7mM+iBQM TQBMi2`b- TQBMiBM; iQ i?2 +QM+`2i2 TB2+2 Q7 K+?BM2
+Q/2 7Q` 2+? K2i?Q/ BM i?2 BKTH2K2MiiBQMX K2i?Q/ +HH HBF2 trait_object.method() rBHH
`2i`B2p2 i?2 +Q``2+i TQBMi2` Qmi Q7 i?2 pi#H2 M/ i?2M /Q /vMKB+ +HH Q7 BiX 6Q` 2tKTH2,
struct FooVtable {
destructor: fn(*mut ()),
size: usize,
align: usize,
method: fn(*const ()) -> String,
}
// u8:
fn call_method_on_u8(x: *const ()) -> String {
// the compiler guarantees that this function is only called
// with `x` pointing to a u8
let byte: &u8 = unsafe { &*(x as *const u8) };
byte.method()
}
static Foo_for_u8_vtable: FooVtable = FooVtable {
destructor: /* compiler magic */,
size: 1,
align: 1,
// cast to a function pointer
method: call_method_on_u8 as fn(*const ()) -> String,
};
// String:
jk ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/f`rfbi`m+iXh`BiP#D2+iX?iKH
R3d
h?2 destructor }2H/ BM 2+? pi#H2 TQBMib iQ 7mM+iBQM i?i rBHH +H2M mT Mv `2bQm`+2b Q7 i?2
pi#H2b ivT2- 7Q` u8 Bi Bb i`BpBH- #mi 7Q` String Bi rBHH 7`22 i?2 K2KQ`vX h?Bb Bb M2+2bb`v 7Q`
QrMBM; i`Bi Q#D2+ib HBF2 Box<Foo>- r?B+? M22/ iQ +H2M@mT #Qi? i?2 Box HHQ+iBQM b r2HH b
i?2 BMi2`MH ivT2 r?2M i?2v ;Q Qmi Q7 b+QT2X h?2 size M/ align }2H/b biQ`2 i?2 bBx2 Q7 i?2
2`b2/ ivT2- M/ Bib HB;MK2Mi `2[mB`2K2Mibc i?2b2 `2 2bb2MiBHHv mMmb2/ i i?2 KQK2Mi bBM+2
i?2 BM7Q`KiBQM Bb 2K#2//2/ BM i?2 /2bi`m+iQ`- #mi rBHH #2 mb2/ BM i?2 7mim`2- b i`Bi Q#D2+ib
`2 T`Q;`2bbBp2Hv K/2 KQ`2 ~2tB#H2X
amTTQb2 r2p2 ;Qi bQK2 pHm2b i?i BKTH2K2Mi Foo- i?2M i?2 2tTHB+Bi 7Q`K Q7 +QMbi`m+iBQM M/
mb2 Q7 Foo i`Bi Q#D2+ib KB;?i HQQF #Bi HBF2 UB;MQ`BM; i?2 ivT2 KBbKi+?2b, i?2v`2 HH Dmbi
TQBMi2`b MvrvV,
let a: String = "foo".to_string();
let x: u8 = 1;
// let b: &Foo = &a;
let b = TraitObject {
// store the data
data: &a,
// store the methods
vtable: &Foo_for_String_vtable
};
// let y: &Foo = x;
let y = TraitObject {
// store the data
data: &x,
// store the methods
vtable: &Foo_for_u8_vtable
};
// b.method();
R33
(b.vtable.method)(b.data);
// y.method();
(y.vtable.method)(y.data);
8Xk9
(b.vtable.destructor)(b.data)
*HQbm`2b
_mbi MQi QMHv ?b MK2/ 7mM+iBQMb- #mi MQMvKQmb 7mM+iBQMb b r2HHX MQMvKQmb 7mM+iBQMb i?i
?p2 M bbQ+Bi2/ 2MpB`QMK2Mi `2 +HH2/ +HQbm`2b- #2+mb2 i?2v +HQb2 Qp2` M 2MpB`QMK2MiX
_mbi ?b `2HHv ;`2i BKTH2K2MiiBQM Q7 i?2K- b r2HH b22X
8Xk9XR avMit
*HQbm`2b HQQF HBF2 i?Bb,
let plus_one = |x: i32| x + 1;
assert_eq!(2, plus_one(1));
q2 +`2i2 #BM/BM;- plus_one- M/ bbB;M Bi iQ +HQbm`2X h?2 +HQbm`2b `;mK2Mib ;Q #2ir22M
i?2 TBT2b U|V- M/ i?2 #Q/v Bb M 2tT`2bbBQM- BM i?Bb +b2- x + 1X _2K2K#2` i?i { } Bb M
2tT`2bbBQM- bQ r2 +M ?p2 KmHiB@HBM2 +HQbm`2b iQQ,
let plus_two = |x| {
let mut result: i32 = x;
result += 1;
result += 1;
result
};
assert_eq!(4, plus_two(2));
uQmHH MQiB+2 72r i?BM;b #Qmi +HQbm`2b i?i `2 #Bi /Bz2`2Mi i?M `2;mH` 7mM+iBQMb /2}M2/
rBi? fnX h?2 }`bi Q7 r?B+? Bb i?i r2 /B/ MQi M22/ iQ MMQii2 i?2 ivT2b Q7 `;mK2Mib i?2 +HQbm`2
iF2b Q` i?2 pHm2b Bi `2im`MbX q2 +M,
let plus_one = |x: i32| -> i32 { x + 1 };
assert_eq!(2, plus_one(1));
8Xk9X *GPal_1a
R3N
"mi r2 /QMi ?p2 iQX q?v Bb i?Bb\ "bB+HHv- Bi rb +?Qb2M 7Q` 2`;QMQKB+ `2bQMbX q?BH2
bT2+B7vBM; i?2 7mHH ivT2 7Q` MK2/ 7mM+iBQMb Bb ?2HT7mH rBi? i?BM;b HBF2 /Q+mK2MiiBQM M/ ivT2
BM72`2M+2- i?2 ivT2b Q7 +HQbm`2b `2 ``2Hv /Q+mK2Mi2/ bBM+2 i?2v`2 MQMvKQmb- M/ i?2v /QMi
+mb2 i?2 FBM/b Q7 2``Q`@i@@/BbiM+2 i?i BM72``BM; MK2/ 7mM+iBQM ivT2b +MX
h?2 b2+QM/ Bb i?i i?2 bvMit Bb bBKBH`- #mi #Bi /Bz2`2MiX Ap2 //2/ bT+2b ?2`2 iQ KF2 i?2K
HQQF HBiiH2 +HQb2`,
fn
plus_one_v1
x + 1
8Xk9Xk
*HQbm`2b `2 +HH2/ bm+? #2+mb2 i?2v +HQb2 Qp2` i?2B` 2MpB`QMK2MiX Ai HQQFb HBF2 i?Bb,
let num = 5;
let plus_num = |x: i32| x + num;
assert_eq!(10, plus_num(5));
h?Bb +HQbm`2- plus_num- `272`b iQ let #BM/BM; BM Bib b+QT2, numX JQ`2 bT2+B}+HHv- Bi #Q``Qrb i?2
#BM/BM;X A7 r2 /Q bQK2i?BM; i?i rQmH/ +QM~B+i rBi? i?i #BM/BM;- r2 ;2i M 2``Q`X GBF2 i?Bb
QM2,
let mut num = 5;
let plus_num = |x: i32| x + num;
let y = &mut num;
RNy
}
^
p2`#Qb2 v2i ?2HT7mH 2``Q` K2bb;25 b Bi bvb- r2 +Mi iF2 Kmi#H2 #Q``Qr QM
i?2 +HQbm`2 Bb H`2/v #Q``QrBM; BiX A7 r2 H2i i?2 +HQbm`2 ;Q Qmi Q7 b+QT2- r2 +M,
num
#2+mb2
A7 vQm` +HQbm`2 `2[mB`2b Bi- ?Qr2p2`- _mbi rBHH iF2 QrM2`b?BT M/ KQp2 i?2 2MpB`QMK2Mi BMbi2/,
let nums = vec![1, 2, 3];
let takes_nums = || nums;
println!("{:?}", nums);
?b QrM2`b?BT Qp2` Bib +QMi2Mib- M/ i?2`27Q`2- r?2M r2 `272` iQ Bi BM Qm` +HQbm`2- r2 ?p2
iQ iF2 QrM2`b?BT Q7 numsX Aib i?2 bK2 b B7 r2/ Tbb2/ nums iQ 7mM+iBQM i?i iQQF QrM2`b?BT
Q7 BiX
Vec<T>
move
+HQbm`2b
q2 +M 7Q`+2 Qm` +HQbm`2 iQ iF2 QrM2`b?BT Q7 Bib 2MpB`QMK2Mi rBi? i?2
move
F2vrQ`/,
let num = 5;
let owns_num = move |x: i32| x + num;
LQr- 2p2M i?Qm;? i?2 F2vrQ`/ Bb move- i?2 p`B#H2b 7QHHQr MQ`KH KQp2 b2KMiB+bX AM i?Bb +b25 BKTH2K2Mib Copy- M/ bQ owns_num iF2b QrM2`b?BT Q7 +QTv Q7 numX aQ r?ib i?2 /Bz2`2M+2\
8Xk9X *GPal_1a
RNR
aQ BM i?Bb +b2- Qm` +HQbm`2 iQQF Kmi#H2 `272`2M+2 iQ num- M/ i?2M r?2M r2 +HH2/ add_numBi Kmii2/ i?2 mM/2`HvBM; pHm2- b r2/ 2tT2+iX q2 HbQ M22/2/ iQ /2+H`2 add_num b mut iQQ#2+mb2 r2`2 KmiiBM; Bib 2MpB`QMK2MiX
A7 r2 +?M;2 iQ
move
num-
r2 iQQF QrM2`b?BT Q7
MQi?2` rv iQ i?BMF #Qmi move +HQbm`2b, i?2v ;Bp2 +HQbm`2 Bib QrM bi+F 7`K2X qBi?Qmi move +HQbm`2 Kv #2 iB2/ iQ i?2 bi+F 7`K2 i?i +`2i2/ Bi- r?BH2 move +HQbm`2 Bb b2H7@+QMiBM2/X
h?Bb K2Mb i?i vQm +MMQi ;2M2`HHv `2im`M MQM@move +HQbm`2 7`QK 7mM+iBQM- 7Q` 2tKTH2X
"mi #27Q`2 r2 iHF #Qmi iFBM; M/ `2im`MBM; +HQbm`2b- r2 b?QmH/ iHF bQK2 KQ`2 #Qmi i?2
rv i?i +HQbm`2b `2 BKTH2K2Mi2/X b bvbi2Kb HM;m;2- _mbi ;Bp2b vQm iQMb Q7 +QMi`QH Qp2`
r?i vQm` +Q/2 /Q2b- M/ +HQbm`2b `2 MQ /Bz2`2MiX
8Xk9Xj
*HQbm`2 BKTH2K2MiiBQM
_mbib BKTH2K2MiiBQM Q7 +HQbm`2b Bb #Bi /Bz2`2Mi i?M Qi?2` HM;m;2bX h?2v `2 2z2+iBp2Hv
bvMit bm;` 7Q` i`BibX uQmHH rMi iQ KF2 bm`2 iQ ?p2 `2/ i?2 i`Bib +?Ti2` Ub2+iBQM 8XkyT;2 RdjV #27Q`2 i?Bb QM2- b r2HH b i?2 +?Ti2` QM i`Bi Q#D2+ib Ub2+iBQM 8Xkj- T;2 R3jVX
:Qi HH i?i\ :QQ/X
h?2 F2v iQ mM/2`biM/BM; ?Qr +HQbm`2b rQ`F mM/2` i?2 ?QQ/ Bb bQK2i?BM; #Bi bi`M;2, lbBM;
iQ +HH 7mM+iBQM- HBF2 foo()- Bb M Qp2`HQ/#H2 QT2`iQ`X 6`QK i?Bb- 2p2`vi?BM; 2Hb2 +HB+Fb BMiQ
TH+2X AM _mbi- r2 mb2 i?2 i`Bi bvbi2K iQ Qp2`HQ/ QT2`iQ`bX *HHBM; 7mM+iBQMb Bb MQ /Bz2`2MiX
q2 ?p2 i?`22 b2T`i2 i`Bib iQ Qp2`HQ/ rBi?,
()
RNk
uQmHH MQiB+2 72r /Bz2`2M+2b #2ir22M i?2b2 i`Bib- #mi #B; QM2 Bb self, Fn iF2b &self- FnMut
iF2b &mut self- M/ FnOnce iF2b selfX h?Bb +Qp2`b HH i?`22 FBM/b Q7 self pB i?2 mbmH K2i?Q/
+HH bvMitX "mi r2p2 bTHBi i?2K mT BMiQ i?`22 i`Bib- `i?2` i?M ?pBM; bBM;H2 QM2X h?Bb
;Bp2b mb H`;2 KQmMi Q7 +QMi`QH Qp2` r?i FBM/ Q7 +HQbm`2b r2 +M iF2X
h?2 || {} bvMit 7Q` +HQbm`2b Bb bm;` 7Q` i?2b2 i?`22 i`BibX _mbi rBHH ;2M2`i2 bi`m+i 7Q` i?2
2MpB`QMK2Mi- impl i?2 TT`QT`Bi2 i`Bi- M/ i?2M mb2 BiX
call_with_oneX
call_with_one
BM KQ`2 /2Ti?,
i32X
8Xk9X *GPal_1a
RNj
"2+mb2 Fn Bb i`Bi- r2 +M #QmM/ Qm` ;2M2`B+ rBi? BiX AM i?Bb +b2- Qm` +HQbm`2 iF2b
M `;mK2Mi M/ `2im`Mb M i32- M/ bQ i?2 ;2M2`B+ #QmM/ r2 mb2 Bb Fn(i32) -> i32X
i32
b
h?2`2b QM2 Qi?2` F2v TQBMi ?2`2, #2+mb2 r2`2 #QmM/BM; ;2M2`B+ rBi? i`Bi- i?Bb rBHH ;2i
KQMQKQ`T?Bx2/- M/ i?2`27Q`2- r2HH #2 /QBM; biiB+ /BbTi+? BMiQ i?2 +HQbm`2X h?ib T`2iiv
M2iX AM KMv HM;m;2b- +HQbm`2b `2 BM?2`2MiHv ?2T HHQ+i2/- M/ rBHH Hrvb BMpQHp2 /vMKB+
/BbTi+?X AM _mbi- r2 +M bi+F HHQ+i2 Qm` +HQbm`2 2MpB`QMK2Mi- M/ biiB+HHv /BbTi+? i?2
+HHX h?Bb ?TT2Mb [mBi2 Q7i2M rBi? Bi2`iQ`b M/ i?2B` /Ti2`b- r?B+? Q7i2M iF2 +HQbm`2b b
`;mK2MibX
P7 +Qm`b2- B7 r2 rMi /vMKB+ /BbTi+?- r2 +M ;2i i?i iQQX i`Bi Q#D2+i ?M/H2b i?Bb +b2b mbmH,
fn call_with_one(some_closure: &Fn(i32) -> i32) -> i32 {
some_closure(1)
}
let answer = call_with_one(&|x| x + 2);
assert_eq!(3, answer);
LQr r2 iF2 i`Bi Q#D2+i- &FnX M/ r2 ?p2 iQ KF2 `272`2M+2 iQ Qm` +HQbm`2 r?2M r2 Tbb
Bi iQ call_with_one- bQ r2 mb2 &||X
8Xk9X8
_2im`MBM; +HQbm`2b
Aib p2`v +QKKQM 7Q` 7mM+iBQMH@bivH2 +Q/2 iQ `2im`M +HQbm`2b BM p`BQmb bBimiBQMbX A7 vQm i`v iQ
`2im`M +HQbm`2- vQm Kv `mM BMiQ M 2``Q`X i }`bi- Bi Kv b22K bi`M;2- #mi r2HH };m`2 Bi QmiX
>2`2b ?Qr vQm/ T`Q##Hv i`v iQ `2im`M +HQbm`2 7`QK 7mM+iBQM,
fn factory() -> (Fn(i32) -> Vec<i32>) {
let vec = vec![1, 2, 3];
|n| vec.push(n)
}
let f = factory();
let answer = f(4);
assert_eq!(vec![1, 2, 3, 4], answer);
RN9
f = factory();
^
note: `core::ops::Fn(i32) -> collections::vec::Vec<i32>` does not have a
constant size known at compile-time
f = factory();
^
error: the trait `core::marker::Sized` is not implemented for the type
`core::ops::Fn(i32) -> collections::vec::Vec<i32>` [E0277]
factory() -> (Fn(i32) -> Vec<i32>) {
^~~~~~~~~~~~~~~~~~~~~
note: `core::ops::Fn(i32) -> collections::vec::Vec<i32>` does not have a constant size
known at compile-time
fa ctory() -> (Fn(i32) -> Vec<i32>) {
^~~~~~~~~~~~~~~~~~~~~
AM Q`/2` iQ `2im`M bQK2i?BM; 7`QK 7mM+iBQM- _mbi M22/b iQ FMQr r?i bBx2 i?2 `2im`M ivT2
BbX "mi bBM+2 Fn Bb i`Bi- Bi +QmH/ #2 p`BQmb i?BM;b Q7 p`BQmb bBx2b, KMv /Bz2`2Mi ivT2b +M
BKTH2K2Mi FnX M 2bv rv iQ ;Bp2 bQK2i?BM; bBx2 Bb iQ iF2 `272`2M+2 iQ Bi- b `272`2M+2b
?p2 FMQrM bBx2X aQ r2/ r`Bi2 i?Bb,
fn factory() -> &(Fn(i32) -> Vec<i32>) {
let vec = vec![1, 2, 3];
|n| vec.push(n)
}
let f = factory();
let answer = f(4);
assert_eq!(vec![1, 2, 3, 4], answer);
_B;?iX "2+mb2 r2 ?p2 `272`2M+2- r2 M22/ iQ ;Bp2 Bi HB72iBK2X "mi Qm` factory() 7mM+iBQM
iF2b MQ `;mK2Mib- bQ 2HBbBQM /Q2bMi FB+F BM ?2`2X q?i HB72iBK2 +M r2 +?QQb2\ 'static,
fn factory() -> &'static (Fn(i32) -> i32) {
let num = 5;
|x| x + num
}
let f = factory();
8Xk9X *GPal_1a
RN8
r2 ?p2
[closure
"2+mb2 2+? +HQbm`2 ;2M2`i2b Bib QrM 2MpB`QMK2Mi struct M/ BKTH2K2MiiBQM Q7 Fn M/ 7`B2M/bi?2b2 ivT2b `2 MQMvKQmbX h?2v 2tBbi Dmbi bQH2Hv 7Q` i?Bb +HQbm`2X aQ _mbi b?Qrb i?2K b closure
<anon>- `i?2` i?M bQK2 miQ;2M2`i2/ MK2X
"mi r?v /Q2bMi Qm` +HQbm`2 BKTH2K2Mi &'static Fn\ q2HH- b r2 /Bb+mbb2/ #27Q`2- +HQbm`2b
#Q``Qr i?2B` 2MpB`QMK2MiX M/ BM i?Bb +b2- Qm` 2MpB`QMK2Mi Bb #b2/ QM bi+F@HHQ+i2/ 5i?2 num p`B#H2 #BM/BM;X aQ i?2 #Q``Qr ?b HB72iBK2 Q7 i?2 bi+F 7`K2X aQ B7 r2 `2im`M2/
i?Bb +HQbm`2- i?2 7mM+iBQM +HH rQmH/ #2 Qp2`- i?2 bi+F 7`K2 rQmH/ ;Q rv- M/ Qm` +HQbm`2 Bb
+Tim`BM; M 2MpB`QMK2Mi Q7 ;`#;2 K2KQ`v5
aQ r?i iQ /Q\ h?Bb HKQbi rQ`Fb,
fn factory() -> Box<Fn(i32) -> i32> {
let num = 5;
Box::new(|x| x + num)
}
let f = factory();
let answer = f(1);
assert_eq!(6, answer);
BoxBM;
mT i?2
FnX
q2 biBHH ?p2 `272`2M+2 iQ i?2 T`2Mi bi+F 7`K2X qBi? QM2 Hbi }t- r2 +M KF2 i?Bb rQ`F,
RNe
"v KFBM; i?2 BMM2` +HQbm`2 move Fn- r2 +`2i2 M2r bi+F 7`K2 7Q` Qm` +HQbm`2X "v
Bi mT- r2p2 ;Bp2M Bi FMQrM bBx2- M/ HHQrBM; Bi iQ 2b+T2 Qm` bi+F 7`K2X
8Xk8
aQK2iBK2b- 7mM+iBQMb +M ?p2 i?2 bK2 MK2bX *QMbB/2` i?Bb +Q/2,
trait Foo {
fn f(&self);
}
trait Bar {
fn f(&self);
}
struct Baz;
impl Foo for Baz {
fn f(&self) { println!("Bazs impl of Foo"); }
}
impl Bar for Baz {
fn f(&self) { println!("Bazs impl of Bar"); }
}
let b = Baz;
b.f()-
BoxBM;
RNd
note: candidate #2 is defined in an impl of the trait `main::Bar` for the type
`main::Baz`
fn f(&self) { println!("Bazs impl of Bar"); }
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
q2 M22/ rv iQ /BbK#B;mi2 r?B+? K2i?Q/ r2 M22/X h?Bb 72im`2 Bb +HH2/ mMBp2`bH 7mM+iBQM
+HH bvMit- M/ Bi HQQFb HBF2 i?Bb,
Foo::f(&b);
Bar::f(&b);
h?2b2 ?Hp2b Q7 i?2 BMpQ+iBQM `2 i?2 ivT2b Q7 i?2 irQ i`Bib, Foo M/ BarX h?Bb Bb r?i 2M/b
mT +imHHv /QBM; i?2 /BbK#B;miBQM #2ir22M i?2 irQ, _mbi +HHb i?2 QM2 7`QK i?2 i`Bi MK2
vQm mb2X
f(&b)
q?2M r2 +HH K2i?Q/ HBF2 b.f() mbBM; K2i?Q/ bvMit Ub2+iBQM 8XRe- T;2 Re9V- _mbi rBHH
miQKiB+HHv #Q``Qr b B7 f() iF2b &selfX AM i?Bb +b2- _mbi rBHH MQi- M/ bQ r2 M22/ iQ Tbb M
2tTHB+Bi &bX
8Xk8XR
M;H2@#`+F2i 6Q`K
h?2 <>:: bvMit Bb K2Mb Q7 T`QpB/BM; ivT2 ?BMiX h?2 ivT2 ;Q2b BMbB/2 i?2 <>bX AM i?Bb +b2i?2 ivT2 Bb Type as Trait- BM/B+iBM; i?i r2 rMi Traitb p2`bBQM Q7 method iQ #2 +HH2/ ?2`2X
h?2 as Trait T`i Bb QTiBQMH B7 Bib MQi K#B;mQmbX aK2 rBi? i?2 M;H2 #`+F2ib- ?2M+2 i?2
b?Q`i2` 7Q`KX
>2`2b M 2tKTH2 Q7 mbBM; i?2 HQM;2` 7Q`KX
trait Foo {
fn clone(&self);
}
RN3
#[derive(Clone)]
struct Bar;
impl Foo for Bar {
fn clone(&self) {
println!("Making a clone of Bar");
<Bar as Clone>::clone(self);
}
}
8Xke
Clone
i`Bib
clone()
FoobX
q?2M T`QD2+i bi`ib ;2iiBM; H`;2- Bib +QMbB/2`2/ ;QQ/ bQ7ir`2 2M;BM22`BM; T`+iB+2 iQ bTHBi
Bi mT BMiQ #mM+? Q7 bKHH2` TB2+2b- M/ i?2M }i i?2K iQ;2i?2`X Aib HbQ BKTQ`iMi iQ ?p2
r2HH@/2}M2/ BMi2`7+2- bQ i?i bQK2 Q7 vQm` 7mM+iBQMHBiv Bb T`Bpi2- M/ bQK2 Bb Tm#HB+X hQ
7+BHBii2 i?2b2 FBM/b Q7 i?BM;b- _mbi ?b KQ/mH2 bvbi2KX
+-----------+
+---------+
+-----------+
+---| farewells |
+-----------+
| phrases |---+
+---------+
+-----------+
+---| greetings |
+----------+
RNN
|
+-----------+
|
|
+-----------+
+---| farewells |
+-----------+
AM i?Bb 2tKTH2- phrases Bb i?2 MK2 Q7 Qm` +`i2X HH Q7 i?2 `2bi `2 KQ/mH2bX uQm +M b22 i?i
i?2v 7Q`K i`22- #`M+?BM; Qmi 7`QK i?2 +`i2 `QQi- r?B+? Bb i?2 `QQi Q7 i?2 i`22, phrases Bib2H7X
LQr i?i r2 ?p2 THM- H2ib /2}M2 i?2b2 KQ/mH2b BM +Q/2X hQ bi`i- ;2M2`i2 M2r +`i2 rBi?
*`;Q,
$ cargo new phrases
$ cd phrases
8XkeXk
phrases
.2}MBM; JQ/mH2b
hQ /2}M2 2+? Q7 Qm` KQ/mH2b- r2 mb2 i?2 mod F2vrQ`/X G2ib KF2 Qm` src/lib.rs HQQF HBF2 i?Bb,
mod english {
mod greetings {
}
mod farewells {
}
}
mod japanese {
mod greetings {
}
mod farewells {
}
}
kyy
7i2` i?2 mod F2vrQ`/- vQm ;Bp2 i?2 MK2 Q7 i?2 KQ/mH2X JQ/mH2 MK2b 7QHHQr i?2 +QMp2MiBQMb
7Q` Qi?2` _mbi B/2MiB}2`b, lower_snake_caseX h?2 +QMi2Mib Q7 2+? KQ/mH2 `2 rBi?BM +m`Hv #`+2b
U{}VX
qBi?BM ;Bp2M mod- vQm +M /2+H`2 bm#@modbX q2 +M `272` iQ bm#@KQ/mH2b rBi? /Qm#H2@
+QHQM U::V MQiiBQM, Qm` 7Qm` M2bi2/ KQ/mH2b `2 english::greetings- english::farewellsjapanese::greetings- M/ japanese::farewellsX "2+mb2 i?2b2 bm#@KQ/mH2b `2 MK2bT+2/ mM@
/2` i?2B` T`2Mi KQ/mH2- i?2 MK2b /QMi +QM~B+i, english::greetings M/ japanese::greetings
`2 /BbiBM+i- 2p2M i?Qm;? i?2B` MK2b `2 #Qi? greetingsX
"2+mb2 i?Bb +`i2 /Q2b MQi ?p2
+`i2 b HB#``v,
main()
lib.rs-
$ cargo build
Compiling phrases v0.0.1 (file:///home/you/projects/phrases)
$ ls target/debug
build
deps
examples
libphrases-a7448e02a0468eaa.rlib
native
Bb i?2 +QKTBH2/ +`i2X "27Q`2 r2 b22 ?Qr iQ mb2 i?Bb +`i2 7`QK MQi?2`
+`i2- H2ib #`2F Bi mT BMiQ KmHiBTH2 }H2bX
libphrase-hash.rlib
english.rs
}H2- Q`
english/mod.rs
LQi2 i?i BM i?2b2 }H2b- vQm /QMi M22/ iQ `2@/2+H`2 i?2 KQ/mH2, i?ib H`2/v #22M /QM2 rBi?
i?2 BMBiBH mod /2+H`iBQMX
lbBM; i?2b2 irQ i2+?MB[m2b- r2 +M #`2F mT Qm` +`i2 BMiQ irQ /B`2+iQ`B2b M/ b2p2M }H2b,
$ tree .
.
Cargo.lock
Cargo.toml
src
kyR
english
farewells.rs
greetings.rs
mod.rs
japanese
farewells.rs
greetings.rs
mod.rs
lib.rs
target
debug
build
deps
examples
libphrases-a7448e02a0468eaa.rlib
native
src/lib.rs
mod english;
mod japanese;
h?2b2 irQ /2+H`iBQMb i2HH _mbi iQ HQQF 7Q` 2Bi?2` src/english.rs M/ src/japanese.rs- Q`
src/english/mod.rs M/ src/japanese/mod.rs- /2T2M/BM; QM Qm` T`272`2M+2X AM i?Bb +b2- #2@
+mb2 Qm` KQ/mH2b ?p2 bm#@KQ/mH2b- r2p2 +?Qb2M i?2 b2+QM/X "Qi? src/english/mod.rs M/
src/japanese/mod.rs HQQF HBF2 i?Bb,
mod greetings;
mod farewells;
;BM- i?2b2 /2+H`iBQMb i2HH _mbi iQ HQQF 7Q` 2Bi?2` src/english/greetings.rs M/
src/japanese/greetings.rs Q` src/english/farewells/mod.rs M/ src/japanese/farewells/mod.rsX
"2+mb2 i?2b2 bm#@KQ/mH2b /QMi ?p2 i?2B` QrM bm#@KQ/mH2b- r2p2 +?Qb2M iQ KF2 i?2K
src/english/greetings.rs M/ src/japanese/farewells.rsX q?2r5
h?2 +QMi2Mib Q7 src/english/greetings.rs M/
i?2 KQK2MiX G2ib // bQK2 7mM+iBQMbX
Smi i?Bb BM
src/english/greetings.rs,
Smi i?Bb BM
src/english/farewells.rs,
src/japanese/farewells.rs
kyk
Smi i?Bb BM
src/japanese/greetings.rs,
".to_string()
P7 +Qm`b2- vQm +M +QTv M/ Tbi2 i?Bb 7`QK i?Bb r2# T;2- Q` Dmbi ivT2 bQK2i?BM; 2Hb2X Aib MQi
BKTQ`iMi i?i vQm +imHHv Tmi FQMMB+?Br iQ H2`M #Qmi i?2 KQ/mH2 bvbi2KX
Smi i?Bb BM
src/japanese/farewells.rs,
".to_string()
src/main.rs
h?2 extern crate /2+H`iBQM i2HHb _mbi i?i r2 M22/ iQ +QKTBH2 M/ HBMF iQ i?2 phrases +`i2X
q2 +M i?2M mb2 phrases KQ/mH2b BM i?Bb QM2X b r2 K2MiBQM2/ 2`HB2`- vQm +M mb2 /Qm#H2
+QHQMb iQ `272` iQ bm#@KQ/mH2b M/ i?2 7mM+iBQMb BMbB/2 Q7 i?2KX
HbQ- *`;Q bbmK2b i?i src/main.rs Bb i?2 +`i2 `QQi Q7 #BM`v +`i2- `i?2` i?M HB#``v
+`i2X Pm` T+F;2 MQr ?b irQ +`i2b, src/lib.rs M/ src/main.rsX h?Bb Tii2`M Bb [mBi2
+QKKQM 7Q` 2t2+mi#H2 +`i2b, KQbi 7mM+iBQMHBiv Bb BM HB#``v +`i2- M/ i?2 2t2+mi#H2 +`i2
mb2b i?i HB#``vX h?Bb rv- Qi?2` T`Q;`Kb +M HbQ mb2 i?2 HB#``v +`i2- M/ Bib HbQ MB+2
b2T`iBQM Q7 +QM+2`MbX
h?Bb /Q2bMi [mBi2 rQ`F v2i- i?Qm;?X q2 ;2i 7Qm` 2``Q`b i?i HQQF bBKBH` iQ i?Bb,
$ cargo build
Compiling phrases v0.0.1 (file:///home/you/projects/phrases)
src/main.rs:4:38: 4:72 error: function `hello` is private
kyj
);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
note: in expansion of format_args!
<std macros>:2:25: 2:58 note: expansion site
<std macros>:1:1: 2:62 note: in expansion of print!
<std macros>:3:1: 3:54 note: expansion site
<std macros>:1:1: 3:58 note: in expansion of println!
phrases/src/main.rs:4:5: 4:76 note: expansion site
"v /27mHi- 2p2`vi?BM; Bb T`Bpi2 BM _mbiX G2ib iHF #Qmi i?Bb BM bQK2 KQ`2 /2Ti?X
8XkeX8
_mbi HHQrb vQm iQ T`2+Bb2Hv +QMi`QH r?B+? bT2+ib Q7 vQm` BMi2`7+2 `2 Tm#HB+- M/ bQ T`Bpi2 Bb
i?2 /27mHiX hQ KF2 i?BM;b Tm#HB+- vQm mb2 i?2 pub F2vrQ`/X G2ib 7Q+mb QM i?2 english KQ/mH2
}`bi- bQ H2ib `2/m+2 Qm` src/main.rs iQ Dmbi i?Bb,
extern crate phrases;
fn main() {
println!("Hello in English: {}", phrases::english::greetings::hello());
println!("Goodbye in English: {}", phrases::english::farewells::goodbye());
}
AM Qm`
src/lib.rs-
H2ib //
pub
iQ i?2
english
KQ/mH2 /2+H`iBQM,
M/ BM Qm`
src/english/mod.rs-
pub,
AM Qm`
src/english/greetings.rs-
H2ib //
pub
iQ Qm`
fn
/2+H`iBQM,
M/ HbQ BM
src/english/farewells.rs,
LQr- Qm` +`i2 +QKTBH2b- H#2Bi rBi? r`MBM;b #Qmi MQi mbBM; i?2
japanese
7mM+iBQMb,
ky9
$ cargo run
Compiling phrases v0.0.1 (file:///home/you/projects/phrases)
src/japanese/greetings.rs:1:1: 3:2 warning: function is never used: `hello`, #[warn(dea
d_code)] on by default
src/japanese/greetings.rs:1 fn hello() -> String {
src/japanese/greetings.rs:2
"".to_string()
src/japanese/greetings.rs:3 }
src/japanese/farewells.rs:1:1: 3:2 warning: function is never used: `goodbye`, #[warn(d
ead_code)] on by default
src/japanese/farewells.rs:1 fn goodbye() -> String {
src/japanese/farewells.rs:2
"".to_string()
src/japanese/farewells.rs:3 }
Running `target/debug/phrases`
Hello in English: Hello!
Goodbye in English: Goodbye.
use
F2vrQ`/- r?B+? HHQrb mb iQ BKTQ`i MK2b BMiQ Qm` HQ+H b+QT2X G2ib +?M;2 Qm`
iQ HQQF HBF2 i?Bb,
use
src/main.rs
h?2 irQ use HBM2b BKTQ`i 2+? KQ/mH2 BMiQ i?2 HQ+H b+QT2- bQ r2 +M `272` iQ i?2 7mM+iBQMb #v
Km+? b?Q`i2` MK2X "v +QMp2MiBQM- r?2M BKTQ`iBM; 7mM+iBQMb- Bib +QMbB/2`2/ #2bi T`+iB+2 iQ
BKTQ`i i?2 KQ/mH2- `i?2` i?M i?2 7mM+iBQM /B`2+iHvX AM Qi?2` rQ`/b- vQm +M /Q i?Bb,
extern crate phrases;
use phrases::english::greetings::hello;
use phrases::english::farewells::goodbye;
fn main() {
println!("Hello in English: {}", hello());
println!("Goodbye in English: {}", goodbye());
}
ky8
"mi Bi Bb MQi B/BQKiB+X h?Bb Bb bB;MB}+MiHv KQ`2 HBF2Hv iQ BMi`Q/m+2 MKBM; +QM~B+iX AM Qm`
b?Q`i T`Q;`K- Bib MQi #B; /2H- #mi b Bi ;`Qrb- Bi #2+QK2b T`Q#H2KX A7 r2 ?p2 +QM~B+iBM;
MK2b- _mbi rBHH ;Bp2 +QKTBHiBQM 2``Q`X 6Q` 2tKTH2- B7 r2 K/2 i?2 japanese 7mM+iBQMb Tm#HB+M/ i`B2/ iQ /Q i?Bb,
extern crate phrases;
use phrases::english::greetings::hello;
use phrases::japanese::greetings::hello;
fn main() {
println!("Hello in English: {}", hello());
println!("Hello in Japanese: {}", hello());
}
A7 r2`2 BKTQ`iBM; KmHiBTH2 MK2b 7`QK i?2 bK2 KQ/mH2- r2 /QMi ?p2 iQ ivT2 Bi Qmi irB+2X
AMbi2/ Q7 i?Bb,
use phrases::english::greetings;
use phrases::english::farewells;
_2@2tTQ`iBM; rBi?
pub use
uQm /QMi Dmbi mb2 use iQ b?Q`i2M B/2MiB}2`bX uQm +M HbQ mb2 Bi BMbB/2 Q7 vQm` +`i2 iQ `2@2tTQ`i
7mM+iBQM BMbB/2 MQi?2` KQ/mH2X h?Bb HHQrb vQm iQ T`2b2Mi M 2ti2`MH BMi2`7+2 i?i Kv MQi
/B`2+iHv KT iQ vQm` BMi2`MH +Q/2 Q`;MBxiBQMX
G2ib HQQF i M 2tKTH2X JQ/B7v vQm`
src/main.rs
kye
fn main() {
println!("Hello in English: {}", greetings::hello());
println!("Goodbye in English: {}", farewells::goodbye());
println!("Hello in Japanese: {}", japanese::hello());
println!("Goodbye in Japanese: {}", japanese::goodbye());
}
src/lib.rs
iQ KF2 i?2
japanese
KQ/ Tm#HB+,
src/japanese/greetings.rs,
".to_string()
M/ i?2M BM
src/japanese/farewells.rs,
".to_string()
src/japanese/mod.rs
h?2 pub use /2+H`iBQM #`BM;b i?2 7mM+iBQM BMiQ b+QT2 i i?Bb T`i Q7 Qm` KQ/mH2 ?B@
2``+?vX
"2+mb2 r2p2 pub use/ i?Bb BMbB/2 Q7 Qm` japanese KQ/mH2- r2 MQr ?p2
phrases::japanese::hello() 7mM+iBQM M/ phrases::japanese::goodbye() 7mM+iBQM2p2M i?Qm;? i?2 +Q/2 7Q` i?2K HBp2b BM phrases::japanese::greetings::hello() M/
phrases::japanese::farewells::goodbye()X
Pm` BMi2`MH Q`;MBxiBQM /Q2bMi /2}M2 Qm`
2ti2`MH BMi2`7+2X
>2`2 r2 ?p2 pub use 7Q` 2+? 7mM+iBQM r2 rMi iQ #`BM; BMiQ i?2 japanese b+QT2X q2 +QmH/
Hi2`MiBp2Hv mb2 i?2 rBH/+`/ bvMit iQ BM+Hm/2 2p2`vi?BM; 7`QK greetings BMiQ i?2 +m``2Mi b+QT2,
pub use self::greetings::*X
q?i #Qmi i?2 self\ q2HH- #v /27mHi- use /2+H`iBQMb `2 #bQHmi2 Ti?b- bi`iBM; 7`QK vQm`
+`i2 `QQiX self KF2b i?i Ti? `2HiBp2 iQ vQm` +m``2Mi TH+2 BM i?2 ?B2``+?v BMbi2/X h?2`2b
QM2 KQ`2 bT2+BH 7Q`K Q7 use, vQm +M use super:: iQ `2+? QM2 H2p2H mT i?2 i`22 7`QK vQm`
8XkdX
CONST
L.
kyd
STATIC
super
b
..-
PmibB/2 Q7 use- Ti?b `2 `2HiBp2, foo::bar() `272`b iQ 7mM+iBQM BMbB/2 Q7 foo `2HiBp2 iQ r?2`2
r2 `2X A7 i?ib T`2}t2/ rBi? ::- b BM ::foo::bar()- Bi `272`b iQ /Bz2`2Mi foo- M #bQHmi2
Ti? 7`QK vQm` +`i2 `QQiX
HbQ- MQi2 i?i r2
}`biX
pub use/
modbX
use
/2+H`iBQMb ;Q
Goodbye in Japanese:
8Xkd
const
M/
static
const
F2vrQ`/,
const N: i32 = 5;
lMHBF2
let
Ub2+iBQM 8XR- T;2 RRNV #BM/BM;b- vQm Kmbi MMQii2 i?2 ivT2 Q7
constX
*QMbiMib HBp2 7Q` i?2 2MiB`2 HB72iBK2 Q7 T`Q;`KX JQ`2 bT2+B}+HHv- +QMbiMib BM _mbi ?p2 MQ
}t2/ //`2bb BM K2KQ`vX h?Bb Bb #2+mb2 i?2v`2 2z2+iBp2Hv BMHBM2/ iQ 2+? TH+2 i?i i?2v`2
mb2/X _272`2M+2b iQ i?2 bK2 +QMbiMi `2 MQi M2+2bb`BHv ;m`Mi22/ iQ `272` iQ i?2 bK2 K2KQ`v
//`2bb 7Q` i?Bb `2bQMX
8XkdXR
static
_mbi T`QpB/2b ;HQ#H p`B#H2 bQ`i Q7 7+BHBiv BM biiB+ Bi2KbX h?2v`2 bBKBH` iQ +QMbiMib- #mi
biiB+ Bi2Kb `2Mi BMHBM2/ mTQM mb2X h?Bb K2Mb i?i i?2`2 Bb QMHv QM2 BMbiM+2 7Q` 2+? pHm2M/ Bib i }t2/ HQ+iBQM BM K2KQ`vX
>2`2b M 2tKTH2,
static N: i32 = 5;
lMHBF2
let
Ub2+iBQM 8XR- T;2 RRNV #BM/BM;b- vQm Kmbi MMQii2 i?2 ivT2 Q7
staticX
aiiB+b HBp2 7Q` i?2 2MiB`2 HB72iBK2 Q7 T`Q;`K- M/ i?2`27Q`2 Mv `272`2M+2 biQ`2/ BM +QMbiMi
?b 'static HB72iBK2 Ub2+iBQM 8XRy- T;2 R98V,
ky3
Jmi#BHBiv
uQm +M BMi`Q/m+2 Kmi#BHBiv rBi? i?2
mut
F2vrQ`/,
"2+mb2 i?Bb Bb Kmi#H2- QM2 i?`2/ +QmH/ #2 mT/iBM; N r?BH2 MQi?2` Bb `2/BM; Bi- +mbBM;
K2KQ`v mMb72ivX b bm+? #Qi? ++2bbBM; M/ KmiiBM; static mut Bb unsafe Ub2+iBQM 8XjdT;2 kj8V- M/ bQ Kmbi #2 /QM2 BM M unsafe #HQ+F,
unsafe {
N += 1;
println!("N: {}", N);
}
static
Kmbi #2
SyncX
8XkdXk AMBiBHBxBM;
"Qi? const M/ static ?p2 `2[mB`2K2Mib 7Q` ;BpBM; i?2K pHm2X h?2v Kv QMHv #2 ;Bp2M
pHm2 i?ib +QMbiMi 2tT`2bbBQMX AM Qi?2` rQ`/b- vQm +MMQi mb2 i?2 `2bmHi Q7 7mM+iBQM +HH
Q` Mvi?BM; bBKBH`Hv +QKTH2t Q` i `mMiBK2X
8Xk3
ii`B#mi2b
.2+H`iBQMb +M #2 MMQii2/ rBi? ii`B#mi2b BM _mbiX h?2v HQQF HBF2 i?Bb,
#[test]
Q` HBF2 i?Bb,
8XkNX
TYPE
GAa1a
kyN
#![test]
h?2 /Bz2`2M+2 #2ir22M i?2 irQ Bb i?2 !- r?B+? +?M;2b r?i i?2 ii`B#mi2 TTHB2b iQ,
#[foo]
struct Foo;
mod bar {
#![bar]
}
h?2 #[foo] ii`B#mi2 TTHB2b iQ i?2 M2ti Bi2K- r?B+? Bb i?2 struct /2+H`iBQMX h?2 #![bar]
ii`B#mi2 TTHB2b iQ i?2 Bi2K 2M+HQbBM; Bi- r?B+? Bb i?2 mod /2+H`iBQMX Pi?2`rBb2- i?2v`2 i?2
bK2X "Qi? +?M;2 i?2 K2MBM; Q7 i?2 Bi2K i?2v`2 ii+?2/ iQ bQK2?QrX
6Q` 2tKTH2- +QMbB/2` 7mM+iBQM HBF2 i?Bb,
#[test]
fn check() {
assert_eq!(2, 1 + 1);
}
Ai Bb K`F2/ rBi? #[test]X h?Bb K2Mb Bib bT2+BH, r?2M vQm `mM i2bib Ub2+iBQM 9Xk- T;2 dyVi?Bb 7mM+iBQM rBHH 2t2+mi2X q?2M vQm +QKTBH2 b mbmH- Bi rQMi 2p2M #2 BM+Hm/2/X h?Bb 7mM+iBQM
Bb MQr i2bi 7mM+iBQMX
ii`B#mi2b Kv HbQ ?p2 //BiBQMH /i,
#[inline(always)]
fn super_fast_fn() {
_mbi ii`B#mi2b `2 mb2/ 7Q` MmK#2` Q7 /Bz2`2Mi i?BM;bX h?2`2 Bb 7mHH HBbi Q7 ii`B#mi2b BM
i?2 `272`2M+2jj X *m``2MiHv- vQm `2 MQi HHQr2/ iQ +`2i2 vQm` QrM ii`B#mi2b- i?2 _mbi +QKTBH2`
/2}M2b i?2KX
8XkN
type
h?2
type
HBb2b
jj ?iiT,ff/Q+X`mbi@HM;XQ`;f`272`2M+2X?iKHOii`B#mi2b
kRy
LQi2- ?Qr2p2`- i?i i?Bb Bb M HBb- MQi M2r ivT2 2MiB`2HvX AM Qi?2` rQ`/b- #2+mb2 _mbi Bb
bi`QM;Hv ivT2/- vQm/ 2tT2+i +QKT`BbQM #2ir22M irQ /Bz2`2Mi ivT2b iQ 7BH,
let x: i32 = 5;
let y: i64 = 5;
if x == y {
// ...
}
i?Bb ;Bp2b
error: mismatched types:
expected `i32`,
found `i64`
(expected i32,
found i64) [E0308]
if x == y {
^
Num
i32-
BM 2p2`v
kRR
Foo,
Bar,
}
type Result<T> = result::Result<T, ConcreteError>;
h?Bb +`2i2b bT2+BHBx2/ p2`bBQM Q7 i?2 Result ivT2- r?B+? Hrvb ?b ConcreteError 7Q` i?2
E T`i Q7 Result<T, E>X h?Bb Bb +QKKQMHv mb2/ BM i?2 biM/`/ HB#``v iQ +`2i2 +mbiQK 2``Q`b
7Q` 2+? bm#b2+iBQMX 6Q` 2tKTH2- BQ,,_2bmHij9 X
8Xjy
_mbi- rBi? Bib 7Q+mb QM b72iv- T`QpB/2b irQ /Bz2`2Mi rvb Q7 +biBM; /Bz2`2Mi ivT2b #2ir22M 2+?
Qi?2`X h?2 }`bi- as- Bb 7Q` b72 +bibX AM +QMi`bi- transmute HHQrb 7Q` `#Bi``v +biBM;- M/ Bb
QM2 Q7 i?2 KQbi /M;2`Qmb 72im`2b Q7 _mbi5
8XjyXR
h?2
as
as
let x: i32 = 5;
let y = x as i64;
Aib MQM@b+H` +bi #2+mb2 r2 ?p2 KmHiBTH2 pHm2b ?2`2, i?2 7Qm` 2H2K2Mib Q7 i?2 ``vX
h?2b2 FBM/b Q7 +bib `2 p2`v /M;2`Qmb- #2+mb2 i?2v KF2 bbmKTiBQMb #Qmi i?2 rv i?i
KmHiBTH2 mM/2`HvBM; bi`m+im`2b `2 BKTH2K2Mi2/X 6Q` i?Bb- r2 M22/ bQK2i?BM; KQ`2 /M;2`QmbX
j9 ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fBQfivT2X_2bmHiX?iKH
kRk
8XjyXk
transmute
h?2 transmute 7mM+iBQM Bb T`QpB/2/ #v +QKTBH2` BMi`BMbB+ Ub2+iBQM eX9- T;2 k8RV- M/ r?i Bi
/Q2b Bb p2`v bBKTH2- #mi p2`v b+`vX Ai i2HHb _mbi iQ i`2i pHm2 Q7 QM2 ivT2 b i?Qm;? Bi r2`2
MQi?2` ivT2X Ai /Q2b i?Bb `2;`/H2bb Q7 i?2 ivT2+?2+FBM; bvbi2K- M/ Dmbi +QKTH2i2Hv i`mbib vQmX
AM Qm` T`2pBQmb 2tKTH2- r2 FMQr i?i M ``v Q7 7Qm` u8b `2T`2b2Mib
rMi iQ /Q i?2 +biX lbBM; transmute BMbi2/ Q7 as- _mbi H2ib mb,
u32
T`QT2`Hv- M/ bQ r2
use std::mem;
unsafe {
let a = [0u8, 0u8, 0u8, 0u8];
let b = mem::transmute::<[u8; 4], u32>(a);
}
q2 ?p2 iQ r`T i?2 QT2`iBQM BM M unsafe #HQ+F 7Q` i?Bb iQ +QKTBH2 bm++2bb7mHHvX h2+?MB+HHvQMHv i?2 mem::transmute +HH Bib2H7 M22/b iQ #2 BM i?2 #HQ+F- #mi Bib MB+2 BM i?Bb +b2 iQ 2M+HQb2
2p2`vi?BM; `2Hi2/- bQ vQm FMQr r?2`2 iQ HQQFX AM i?Bb +b2- i?2 /2iBHb #Qmi a `2 HbQ BKTQ`iMiM/ bQ i?2v`2 BM i?2 #HQ+FX uQmHH b22 +Q/2 BM 2Bi?2` bivH2- bQK2iBK2b i?2 +QMi2ti Bb iQQ 7` rvM/ r`TTBM; HH Q7 i?2 +Q/2 BM unsafe BbMi ;`2i B/2X
q?BH2 transmute /Q2b p2`v HBiiH2 +?2+FBM;- Bi rBHH i H2bi KF2 bm`2 i?i i?2 ivT2b `2 i?2 bK2
bBx2X h?Bb 2``Q`b,
use std::mem;
unsafe {
let a = [0u8, 0u8, 0u8, 0u8];
let b = mem::transmute::<[u8; 4], u64>(a);
}
rBi?,
error: transmute called on types with different sizes: [u8; 4] (32 bits) to u64
(64 bits)
8XjR
bbQ+Bi2/ hvT2b
bbQ+Bi2/ ivT2b `2 TQr2`7mH T`i Q7 _mbib ivT2 bvbi2KX h?2v`2 `2Hi2/ iQ i?2 B/2 Q7 ivT2
7KBHv- BM Qi?2` rQ`/b- ;`QmTBM; KmHiBTH2 ivT2b iQ;2i?2`X h?i /2b+`BTiBQM Bb #Bi #bi`+i- bQ
H2ib /Bp2 `B;?i BMiQ M 2tKTH2X A7 vQm rMi iQ r`Bi2 Graph i`Bi- vQm ?p2 irQ ivT2b iQ #2
;2M2`B+ Qp2`, i?2 MQ/2 ivT2 M/ i?2 2/;2 ivT2X aQ vQm KB;?i r`Bi2 i`Bi- Graph<N, E>- i?i
HQQFb HBF2 i?Bb,
kRj
q?BH2 i?Bb bQ`i Q7 rQ`Fb- Bi 2M/b mT #2BM; rFr`/X 6Q` 2tKTH2- Mv 7mM+iBQM i?i rMib iQ
iF2 Graph b T`K2i2` MQr HbQ M22/b iQ #2 ;2M2`B+ Qp2` i?2 NQ/2 M/ E/;2 ivT2b iQQ,
fn distance<N, E, G: Graph<N, E>>(graph: &G, start: &N, end: &N) -> u32 { ... }
Edge
ivT2- bQ i?2
q?i r2 `2HHv rMi iQ bv Bb i?i +2`iBM E/;2 M/ NQ/2 ivT2 +QK2 iQ;2i?2` iQ 7Q`K 2+?
FBM/ Q7 GraphX q2 +M /Q i?i rBi? bbQ+Bi2/ ivT2b,
trait Graph {
type N;
type E;
fn has_edge(&self, &Self::N, &Self::N) -> bool;
fn edges(&self, &Self::N) -> Vec<Self::E>;
// etc
}
Graph,
fn distance<G: Graph>(graph: &G, start: &G::N, end: &G::N) -> uint { ... }
Graph
trait Graph {
type N;
type E;
fn has_edge(&self, &Self::N, &Self::N) -> bool;
fn edges(&self, &Self::N) -> Vec<Self::E>;
}
aBKTH2 2MQm;?X bbQ+Bi2/ ivT2b mb2 i?2 type F2vrQ`/- M/ ;Q BMbB/2 i?2 #Q/v Q7 i?2 i`Bi- rBi?
i?2 7mM+iBQMbX
kR9
h?2b2 type /2+H`iBQMb +M ?p2 HH i?2 bK2 i?BM; b 7mM+iBQMb /QX 6Q` 2tKTH2- B7 r2 rMi2/
Qm` N ivT2 iQ BKTH2K2Mi Display- bQ r2 +M T`BMi i?2 MQ/2b Qmi- r2 +QmH/ /Q i?Bb,
use std::fmt;
trait Graph {
type N: fmt::Display;
type E;
fn has_edge(&self, &Self::N, &Self::N) -> bool;
fn edges(&self, &Self::N) -> Vec<Self::E>;
}
impl
struct Node;
struct Edge;
struct MyGraph;
impl Graph for MyGraph {
type N = Node;
type E = Edge;
fn has_edge(&self, n1: &Node, n2: &Node) -> bool {
true
}
fn edges(&self, n: &Node) -> Vec<Edge> {
Vec::new()
}
}
h?Bb bBHHv BKTH2K2MiiBQM Hrvb `2im`Mb true M/ M 2KTiv Vec<Edge>- #mi Bi ;Bp2b vQm M B/2
Q7 ?Qr iQ BKTH2K2Mi i?Bb FBM/ Q7 i?BM;X q2 }`bi M22/ i?`22 structb- QM2 7Q` i?2 ;`T?- QM2 7Q`
i?2 MQ/2- M/ QM2 7Q` i?2 2/;2X A7 Bi K/2 KQ`2 b2Mb2 iQ mb2 /Bz2`2Mi ivT2- i?i rQmH/ rQ`F
b r2HH- r2`2 Dmbi ;QBM; iQ mb2 structb 7Q` HH i?`22 ?2`2X
L2ti Bb i?2
impl
6`QK ?2`2- r2 mb2 = iQ /2}M2 Qm` bbQ+Bi2/ ivT2bX h?2 MK2 i?2 i`Bi mb2b ;Q2b QM i?2 H27i Q7
i?2 =- M/ i?2 +QM+`2i2 ivT2 r2`2 impl2K2MiBM; i?Bb 7Q` ;Q2b QM i?2 `B;?iX 6BMHHv- r2 mb2 i?2
+QM+`2i2 ivT2b BM Qm` 7mM+iBQM /2+H`iBQMbX
kR8
q2 +Mi +`2i2 i`Bi Q#D2+i HBF2 i?Bb- #2+mb2 r2 /QMi FMQr i?2 bbQ+Bi2/ ivT2bX AMbi2/- r2
+M r`Bi2 i?Bb,
let graph = MyGraph;
let obj = Box::new(graph) as Box<Graph<N=Node, E=Edge>>;
h?2 N=Node bvMit HHQrb mb iQ T`QpB/2 +QM+`2i2 ivT2- Node- 7Q` i?2 N ivT2 T`K2i2`X aK2
rBi? E=EdgeX A7 r2 /B/Mi T`QpB/2 i?Bb +QMbi`BMi- r2 +QmH/Mi #2 bm`2 r?B+? impl iQ Ki+? i?Bb
i`Bi Q#D2+i iQX
8Xjk
lMbBx2/ hvT2b
JQbi ivT2b ?p2 T`iB+mH` bBx2- BM #vi2b- i?i Bb FMQr#H2 i +QKTBH2 iBK2X 6Q` 2tKTH2M i32 Bb i?B`iv@irQ #Bib #B;- Q` 7Qm` #vi2bX >Qr2p2`- i?2`2 `2 bQK2 ivT2b r?B+? `2 mb27mH iQ
2tT`2bb- #mi /Q MQi ?p2 /2}M2/ bBx2X h?2b2 `2 +HH2/ mMbBx2/ Q` /vMKB+HHv bBx2/ ivT2bX
PM2 2tKTH2 Bb [T]X h?Bb ivT2 `2T`2b2Mib +2`iBM MmK#2` Q7 T BM b2[m2M+2X "mi r2 /QMi FMQr
?Qr KMv i?2`2 `2- bQ i?2 bBx2 Bb MQi FMQrMX
_mbi mM/2`biM/b 72r Q7 i?2b2 ivT2b- #mi i?2v ?p2 bQK2 `2bi`B+iBQMbX h?2`2 `2 i?`22,
RX q2 +M QMHv KMBTmHi2 M BMbiM+2 Q7 M mMbBx2/ ivT2 pB TQBMi2`X M &[T] rQ`Fb Dmbi
}M2- #mi [T] /Q2b MQiX
kX o`B#H2b M/ `;mK2Mib +MMQi ?p2 /vMKB+HHv bBx2/ ivT2bX
jX PMHv i?2 Hbi }2H/ BM struct Kv ?p2 /vMKB+HHv bBx2/ ivT2c i?2 Qi?2` }2H/b Kmbi
MQiX 1MmK p`BMib Kmbi MQi ?p2 /vMKB+HHv bBx2/ ivT2b b /iX
aQ r?v #Qi?2`\ q2HH- #2+mb2 [T] +M QMHv #2 mb2/ #2?BM/ TQBMi2`- B7 r2 /B/Mi ?p2 HM;m;2
bmTTQ`i 7Q` mMbBx2/ ivT2b- Bi rQmH/ #2 BKTQbbB#H2 iQ r`Bi2 i?Bb,
kRe
Q`
impl<T> Foo for [T] {
J2MBM;- i?Bb BKTH2K2MiiBQM rQmH/ QMHv rQ`F 7Q` `272`2M+2b Ub2+iBQM 8XN- T;2 Rj3V- M/ MQi
Qi?2` ivT2b Q7 TQBMi2`bX qBi? i?2 impl for str- HH TQBMi2`b- BM+Hm/BM; Ui bQK2 TQBMi- i?2`2 `2
bQK2 #m;b iQ }t }`biV mb2`@/2}M2/ +mbiQK bK`i TQBMi2`b- +M mb2 i?Bb implX
8XjkXR \aBx2/
A7 vQm rMi iQ r`Bi2 7mM+iBQM i?i ++2Tib /vMKB+HHv bBx2/ ivT2- vQm +M mb2 i?2 bT2+BH
#QmM/- ?Sized,
struct Foo<T: ?Sized> {
f: T,
}
h?Bb ?- `2/ b h Kv #2 Sized- K2Mb i?i i?Bb #QmM/ Bb bT2+BH, Bi H2ib mb Ki+? KQ`2 FBM/bMQi H2bbX Aib HKQbi HBF2 2p2`v T BKTHB+BiHv ?b T: Sized- M/ i?2 ? mM/Q2b i?Bb /27mHiX
8Xjj
_mbi HHQrb 7Q` HBKBi2/ 7Q`K Q7 QT2`iQ` Qp2`HQ/BM;X h?2`2 `2 +2`iBM QT2`iQ`b i?i `2 #H2
iQ #2 Qp2`HQ/2/X hQ bmTTQ`i T`iB+mH` QT2`iQ` #2ir22M ivT2b- i?2`2b bT2+B}+ i`Bi i?i
vQm +M BKTH2K2Mi- r?B+? i?2M Qp2`HQ/b i?2 QT2`iQ`X
6Q` 2tKTH2- i?2
use std::ops::Add;
#[derive(Debug)]
struct Point {
x: i32,
y: i32,
}
impl Add for Point {
type Output = Point;
Add
i`Bi,
kRd
AM
main-
r2 +M mb2
QM Qm` irQ
Pointb-
Add<Output=Point>
7Q`
PointX
h?2`2 `2 MmK#2` Q7 QT2`iQ`b i?i +M #2 Qp2`HQ/2/ i?Bb rv- M/ HH Q7 i?2B` bbQ+Bi2/
i`Bib HBp2 BM i?2 std::opsj8 KQ/mH2X *?2+F Qmi Bib /Q+mK2MiiBQM 7Q` i?2 7mHH HBbiX
AKTH2K2MiBM; i?2b2 i`Bib 7QHHQrb Tii2`MX G2ib HQQF i
Addje
BM KQ`2 /2iBH,
h?2`2b i?`22 ivT2b BM iQiH BMpQHp2/ ?2`2, i?2 ivT2 vQm impl Add 7Q`- RHS- r?B+? /27mHib iQ SelfM/ OutputX 6Q` M 2tT`2bbBQM let z = x + y- x Bb i?2 Self ivT2- y Bb i?2 _>a- M/ z Bb i?2
Self::Output ivT2X
impl Add<i32> for Point {
type Output = f64;
fn add(self, rhs: i32) -> f64 {
// add an i32 to a Point and get an f64
}
}
je ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fQTbfi`BiX//X?iKH
kR3
8Xj9
.2`27 +Q2`+BQMb
Derefjd X
use std::ops::Deref;
struct DerefExample<T> {
value: T,
}
impl<T> Deref for DerefExample<T> {
type Target = T;
fn deref(&self) -> &T {
&self.value
}
}
fn main() {
let x = DerefExample { value: 'a' };
assert_eq!('a', *x);
}
h?Bb Bb mb27mH 7Q` r`BiBM; +mbiQK TQBMi2` ivT2bX >Qr2p2`- i?2`2b HM;m;2 72im`2 `2Hi2/ iQ
Deref, /2`27 +Q2`+BQMbX >2`2b i?2 `mH2, A7 vQm ?p2 ivT2 U- M/ Bi BKTH2K2Mib Deref<Target=T>pHm2b Q7 &U rBHH miQKiB+HHv +Q2`+2 iQ &TX >2`2b M 2tKTH2,
fn foo(s: &str) {
// borrow a string for a second
}
// String implements Deref<Target=str>
let owned = "Hello".to_string();
// therefore, this works:
foo(&owned);
lbBM; M KT2`bM/ BM 7`QMi Q7 pHm2 iF2b `272`2M+2 iQ BiX aQ owned Bb String- &owned Bb M
&String- M/ bBM+2 impl Deref<Target=str> for String- &String rBHH /2`27 iQ &str- r?B+? foo()
iF2bX
h?ib BiX h?Bb `mH2 Bb QM2 Q7 i?2 QMHv TH+2b BM r?B+? _mbi /Q2b M miQKiB+ +QMp2`bBQM 7Q`
vQm- #mi Bi //b HQi Q7 ~2tB#BHBivX 6Q` 2tKTH2- i?2 Rc<T> ivT2 BKTH2K2Mib Deref<Target=T>- bQ
i?Bb rQ`Fb,
jd ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fQTbfi`BiX.2`27X?iKH
kRN
use std::rc::Rc;
fn foo(s: &str) {
// borrow a string for a second
}
// String implements Deref<Target=str>
let owned = "Hello".to_string();
let counted = Rc::new(owned);
// therefore, this works:
foo(&counted);
HH r2p2 /QM2 Bb r`T Qm` String BM M Rc<T>X "mi r2 +M MQr Tbb i?2 Rc<String> `QmM/
Mvr?2`2 r2/ ?p2 StringX h?2 bB;Mim`2 Q7 foo /B/Mi +?M;2- #mi rQ`Fb Dmbi b r2HH rBi?
2Bi?2` ivT2X h?Bb 2tKTH2 ?b irQ +QMp2`bBQMb, Rc<String> iQ String M/ i?2M String iQ &strX
_mbi rBHH /Q i?Bb b KMv iBK2b b TQbbB#H2 mMiBH i?2 ivT2b Ki+?X
MQi?2` p2`v +QKKQM BKTH2K2MiiBQM T`QpB/2/ #v i?2 biM/`/ HB#``v Bb,
fn foo(s: &[i32]) {
// borrow a slice for a second
}
// Vec<T> implements Deref<Target=[T]>
let owned = vec![1, 2, 3];
foo(&owned);
o2+iQ`b +M
Deref
iQ bHB+2X
_mbi,
rBHH HbQ FB+F BM r?2M +HHBM; K2i?Q/X AM Qi?2` rQ`/b- i?2b2 `2 i?2 bK2 irQ i?BM;b BM
struct Foo;
impl Foo {
fn foo(&self) { println!("Foo"); }
}
let f = Foo;
f.foo();
1p2M i?Qm;? f BbMi `272`2M+2- M/ foo iF2b &self- i?Bb rQ`FbX h?ib #2+mb2 i?2b2 i?BM;b `2
i?2 bK2,
kky
f.foo();
(&f).foo();
(&&f).foo();
(&&&&&&&&f).foo();
pHm2 Q7 ivT2 &&&&&&&&&&&&&&&&Foo +M biBHH ?p2 K2i?Q/b /2}M2/ QM Foo +HH2/- #2+mb2 i?2
+QKTBH2` rBHH BMb2`i b KMv QT2`iBQMb b M2+2bb`v iQ ;2i Bi `B;?iX M/ bBM+2 Bib BMb2`iBM; *bi?i mb2b DerefX
8Xj8
J+`Qb
"v MQr vQmp2 H2`M2/ #Qmi KMv Q7 i?2 iQQHb _mbi T`QpB/2b 7Q` #bi`+iBM; M/ `2mbBM; +Q/2X
h?2b2 mMBib Q7 +Q/2 `2mb2 ?p2 `B+? b2KMiB+ bi`m+im`2X 6Q` 2tKTH2- 7mM+iBQMb ?p2 ivT2 bB;@
Mim`2- ivT2 T`K2i2`b ?p2 i`Bi #QmM/b- M/ Qp2`HQ/2/ 7mM+iBQMb Kmbi #2HQM; iQ T`iB+mH`
i`BiX
h?Bb bi`m+im`2 K2Mb i?i _mbib +Q`2 #bi`+iBQMb ?p2 TQr2`7mH +QKTBH2@iBK2 +Q``2+iM2bb +?2+F@
BM;X "mi i?Bb +QK2b i i?2 T`B+2 Q7 `2/m+2/ ~2tB#BHBivX A7 vQm pBbmHHv B/2MiB7v Tii2`M Q7 `2T2i2/
+Q/2- vQm Kv }M/ Bib /B{+mHi Q` +mK#2`bQK2 iQ 2tT`2bb i?i Tii2`M b ;2M2`B+ 7mM+iBQM-
i`Bi- Q` Mvi?BM; 2Hb2 rBi?BM _mbib b2KMiB+bX
J+`Qb HHQr mb iQ #bi`+i i bvMi+iB+ H2p2HX K+`Q BMpQ+iBQM Bb b?Q`i?M/ 7Q` M 2t@
TM/2/ bvMi+iB+ 7Q`KX h?Bb 2tTMbBQM ?TT2Mb 2`Hv BM +QKTBHiBQM- #27Q`2 Mv biiB+ +?2+FBM;X
b `2bmHi- K+`Qb +M +Tim`2 KMv Tii2`Mb Q7 +Q/2 `2mb2 i?i _mbib +Q`2 #bi`+iBQMb +MMQiX
h?2 /`r#+F Bb i?i K+`Q@#b2/ +Q/2 +M #2 ?`/2` iQ mM/2`biM/- #2+mb2 72r2` Q7 i?2 #mBHi@BM
`mH2b TTHvX GBF2 M Q`/BM`v 7mM+iBQM- r2HH@#2?p2/ K+`Q +M #2 mb2/ rBi?Qmi mM/2`biM/BM;
Bib BKTH2K2MiiBQMX >Qr2p2`- Bi +M #2 /B{+mHi iQ /2bB;M r2HH@#2?p2/ K+`Q5 //BiBQMHHv+QKTBH2` 2``Q`b BM K+`Q +Q/2 `2 ?`/2` iQ BMi2`T`2i- #2+mb2 i?2v /2b+`B#2 T`Q#H2Kb BM i?2
2tTM/2/ +Q/2- MQi i?2 bQm`+2@H2p2H 7Q`K i?i /2p2HQT2`b mb2X
h?2b2 /`r#+Fb KF2 K+`Qb bQK2i?BM; Q7 72im`2 Q7 Hbi `2bQ`iX h?ib MQi iQ bv i?i
K+`Qb `2 #/c i?2v `2 T`i Q7 _mbi #2+mb2 bQK2iBK2b i?2v`2 M22/2/ 7Q` i`mHv +QM+Bb2- r2HH@
#bi`+i2/ +Q/2X Cmbi F22T i?Bb i`/2Qz BM KBM/X
vec!
K+`Q- mb2/ iQ BMBiBHBx2 p2+iQ` Ub2+iBQM 8XRd- T;2 Re3V rBi? Mv
h?Bb +Mi #2 M Q`/BM`v 7mM+iBQM- #2+mb2 Bi iF2b Mv MmK#2` Q7 `;mK2MibX "mi r2 +M
BK;BM2 Bi b bvMi+iB+ b?Q`i?M/ 7Q`
let x: Vec<u32> = {
let mut temp_vec = Vec::new();
temp_vec.push(1);
8Xj8X J*_Pa
kkR
temp_vec.push(2);
temp_vec.push(3);
temp_vec
};
j3
macro_rules! vec {
( $( $x:expr ),* ) => {
{
let mut temp_vec = Vec::new();
$(
temp_vec.push($x);
)*
temp_vec
}
};
}
h?Bb bvb r2`2 /2}MBM; K+`Q MK2/ vec- Km+? b fn vec rQmH/ /2}M2 7mM+iBQM MK2/
vecX AM T`Qb2- r2 BM7Q`KHHv r`Bi2 K+`Qb MK2 rBi? M 2t+HKiBQM TQBMi- 2X;X vec!X h?2
2t+HKiBQM TQBMi Bb T`i Q7 i?2 BMpQ+iBQM bvMit M/ b2`p2b iQ /BbiBM;mBb? K+`Q 7`QK M
Q`/BM`v 7mM+iBQMX
Ji+?BM;
h?2 K+`Q Bb /2}M2/ i?`Qm;? b2`B2b Q7 `mH2b- r?B+? `2 Tii2`M@Ki+?BM; +b2bX #Qp2- r2 ?/
( $( $x:expr ),* ) => { ... };
h?Bb Bb HBF2 match 2tT`2bbBQM `K- #mi i?2 Ki+?BM; ?TT2Mb QM _mbi bvMit i`22b- i +QKTBH2
iBK2X h?2 b2KB+QHQM Bb QTiBQMH QM i?2 Hbi U?2`2- QMHvV +b2X h?2 Tii2`M QM i?2 H27i@?M/
bB/2 Q7 => Bb FMQrM b Ki+?2`X h?2b2 ?p2 i?2B` QrM HBiiH2 ;`KK`jN rBi?BM i?2 HM;m;2X
h?2 Ki+?2` $x:expr rBHH Ki+? Mv _mbi 2tT`2bbBQM- #BM/BM; i?i bvMit i`22 iQ i?2 K2ip`B@
#H2 $xX h?2 B/2MiB}2` expr Bb 7`;K2Mi bT2+B}2`c i?2 7mHH TQbbB#BHBiB2b `2 2MmK2`i2/ Hi2`
BM i?Bb +?Ti2`X am``QmM/BM; i?2 Ki+?2` rBi? $(...),* rBHH Ki+? x2`Q Q` KQ`2 2tT`2bbBQMbb2T`i2/ #v +QKKbX
bB/2 7`QK i?2 bT2+BH Ki+?2` bvMit- Mv _mbi iQF2Mb i?i TT2` BM Ki+?2` Kmbi Ki+?
2t+iHvX 6Q` 2tKTH2j3 h?2 +imH /2}MBiBQM Q7 vec! BM HB#+QHH2+iBQMb /Bz2`b 7`QK i?2 QM2 T`2b2Mi2/ ?2`2- 7Q` `2bQMb Q7 2{+B2M+v M/
`2mb#BHBivX
jN ?iiT,ff/Q+X`mbi@HM;XQ`;f`272`2M+2X?iKHOK+`Qb
kkk
macro_rules! foo {
(x => $e:expr) => (println!("mode X: {}", $e));
(y => $e:expr) => (println!("mode Y: {}", $e));
}
fn main() {
foo!(y => 3);
}
rBHH T`BMi
mode Y: 3
qBi?
foo!(z => 3);
1tTMbBQM
h?2 `B;?i@?M/ bB/2 Q7 K+`Q `mH2 Bb Q`/BM`v _mbi bvMit- 7Q` i?2 KQbi T`iX "mi r2 +M bTHB+2
BM #Bib Q7 bvMit +Tim`2/ #v i?2 Ki+?2`X 6`QK i?2 Q`B;BMH 2tKTH2,
$(
temp_vec.push($x);
)*
1+? Ki+?2/ 2tT`2bbBQM $x rBHH T`Q/m+2 bBM;H2 push bii2K2Mi BM i?2 K+`Q 2tTMbBQMX h?2
`2T2iBiBQM BM i?2 2tTMbBQM T`Q+22/b BM HQ+Fbi2T rBi? `2T2iBiBQM BM i?2 Ki+?2` UKQ`2 QM i?Bb
BM KQK2MiVX
"2+mb2 $x rb H`2/v /2+H`2/ b Ki+?BM; M 2tT`2bbBQM- r2 /QMi `2T2i :expr QM i?2 `B;?i@
?M/ bB/2X HbQ- r2 /QMi BM+Hm/2 b2T`iBM; +QKK b T`i Q7 i?2 `2T2iBiBQM QT2`iQ`X AMbi2/r2 ?p2 i2`KBMiBM; b2KB+QHQM rBi?BM i?2 `2T2i2/ #HQ+FX
MQi?2` /2iBH, i?2
+QK#BM2/ HBF2 bQ,
macro_rules! foo {
() => {{
...
}}
}
vec!
K+`Q ?b irQ TB`b Q7 #`+2b QM i?2 `B;?i@?M/ bB/2X h?2v `2 Q7i2M
8Xj8X J*_Pa
h?2 Qmi2` #`+2b `2 T`i Q7 i?2 bvMit Q7 macro_rules!X AM 7+i- vQm +M mb2
h?2v bBKTHv /2HBKBi i?2 `B;?i@?M/ bB/2 b r?QH2X
kkj
()
Q`
[]
BMbi2/X
h?2 BMM2` #`+2b `2 T`i Q7 i?2 2tTM/2/ bvMitX _2K2K#2`- i?2 vec! K+`Q Bb mb2/ BM M
2tT`2bbBQM +QMi2tiX hQ r`Bi2 M 2tT`2bbBQM rBi? KmHiBTH2 bii2K2Mib- BM+Hm/BM; let@#BM/BM;b- r2
mb2 #HQ+FX A7 vQm` K+`Q 2tTM/b iQ bBM;H2 2tT`2bbBQM- vQm /QMi M22/ i?Bb 2ti` Hv2` Q7
#`+2bX
LQi2 i?i r2 M2p2` /2+H`2/ i?i i?2 K+`Q T`Q/m+2b M 2tT`2bbBQMX AM 7+i- i?Bb Bb MQi /2i2`KBM2/
mMiBH r2 mb2 i?2 K+`Q b M 2tT`2bbBQMX qBi? +`2- vQm +M r`Bi2 K+`Q r?Qb2 2tTMbBQM
rQ`Fb BM b2p2`H +QMi2tibX 6Q` 2tKTH2- b?Q`i?M/ 7Q` /i ivT2 +QmH/ #2 pHB/ b 2Bi?2` M
2tT`2bbBQM Q` Tii2`MX
_2T2iBiBQM
h?2 `2T2iBiBQM QT2`iQ` 7QHHQrb irQ T`BM+BTH `mH2b,
RX
h?ib KQbi Q7 i?2 Ki+?2` bvMitX h?2b2 2tKTH2b mb2 $(...)*- r?B+? Bb x2`Q Q` KQ`2
Ki+?X Hi2`MiBp2Hv vQm +M r`Bi2 $(...)+ 7Q` QM2 Q` KQ`2 Ki+?X "Qi? 7Q`Kb QTiBQMHHv
BM+Hm/2 b2T`iQ`- r?B+? +M #2 Mv iQF2M 2t+2Ti + Q` *X
h?Bb bvbi2K Bb #b2/ QM J+`Q@#v@1tKTH29y US.6 HBMFVX
9y ?iiT,ffrrrX+bXBM/BMX2/mf7iTfi2+?`2TQ`ibfh_kyeXT/7
kk9
8Xj8Xk >v;B2M2
aQK2 HM;m;2b BKTH2K2Mi K+`Qb mbBM; bBKTH2 i2ti bm#biBimiBQM- r?B+? H2/b iQ p`BQmb T`Q#@
H2KbX 6Q` 2tKTH2- i?Bb * T`Q;`K T`BMib 13 BMbi2/ Q7 i?2 2tT2+i2/ 25X
#define FIVE_TIMES(x) 5 * x
int main() {
printf("%d\n", FIVE_TIMES(2 + 3));
return 0;
}
7i2` 2tTMbBQM r2 ?p2 5 * 2 + 3- M/ KmHiBTHB+iBQM ?b ;`2i2` T`2+2/2M+2 i?M //BiBQMX A7
vQmp2 mb2/ * K+`Qb HQi- vQm T`Q##Hv FMQr i?2 biM/`/ B/BQKb 7Q` pQB/BM; i?Bb T`Q#H2Kb r2HH b }p2 Q` bBt Qi?2`bX AM _mbi- r2 /QMi ?p2 iQ rQ``v #Qmi BiX
macro_rules! five_times {
($x:expr) => (5 * $x);
}
fn main() {
assert_eq!(25, five_times!(2 + 3));
}
h?2 K2ip`B#H2 $x Bb T`b2/ b bBM;H2 2tT`2bbBQM MQ/2- M/ F22Tb Bib TH+2 BM i?2 bvMit i`22
2p2M 7i2` bm#biBimiBQMX
MQi?2` +QKKQM T`Q#H2K BM K+`Q bvbi2Kb Bb p`B#H2 +Tim`2X >2`2b * K+`Q- mbBM; :Ll
* 2ti2MbBQM9R iQ 2KmHi2 _mbib 2tT`2bbBQM #HQ+FbX
#define LOG(msg) ({ \
int state = get_log_state(); \
if (state > 0) { \
printf("log(%d): %s\n", state, msg); \
} \
})
h?Bb 2tTM/b iQ
const char *state = "reticulating splines";
int state = get_log_state();
if (state > 0) {
printf("log(%d): %s\n", state, state);
}
9R ?iiTb,ff;++X;MmXQ`;fQMHBM2/Q+bf;++faii2K2Mi@1tT`bX?iKH
8Xj8X J*_Pa
kk8
h?2 b2+QM/ p`B#H2 MK2/ state b?/Qrb i?2 }`bi QM2X h?Bb Bb T`Q#H2K #2+mb2 i?2 T`BMi
bii2K2Mi b?QmH/ `272` iQ #Qi? Q7 i?2KX
h?2 2[mBpH2Mi _mbi K+`Q ?b i?2 /2bB`2/ #2?pBQ`X
macro_rules! log {
($msg:expr) => {{
let state: i32 = get_log_state();
if state > 0 {
println!("log({}): {}", state, $msg);
}
}};
}
fn main() {
let state: &str = "reticulating splines";
log!(state);
}
h?Bb rQ`Fb #2+mb2 _mbi ?b ?v;B2MB+ K+`Q bvbi2K9k X 1+? K+`Q 2tTMbBQM ?TT2Mb BM
/BbiBM+i bvMit +QMi2ti- M/ 2+? p`B#H2 Bb i;;2/ rBi? i?2 bvMit +QMi2ti r?2`2 Bi rb
BMi`Q/m+2/X Aib b i?Qm;? i?2 p`B#H2 state BMbB/2 main Bb TBMi2/ /Bz2`2Mi +QHQ` 7`QK i?2
p`B#H2 state BMbB/2 i?2 K+`Q- M/ i?2`27Q`2 i?2v /QMi +QM~B+iX
h?Bb HbQ `2bi`B+ib i?2 #BHBiv Q7 K+`Qb iQ BMi`Q/m+2 M2r #BM/BM;b i i?2 BMpQ+iBQM bBi2X *Q/2
bm+? b i?2 7QHHQrBM; rBHH MQi rQ`F,
macro_rules! foo {
() => (let x = 3);
}
fn main() {
foo!();
println!("{}", x);
}
AMbi2/ vQm M22/ iQ Tbb i?2 p`B#H2 MK2 BMiQ i?2 BMpQ+iBQM- bQ Bib i;;2/ rBi? i?2 `B;?i
bvMit +QMi2tiX
macro_rules! foo {
($v:ident) => (let $v = 3);
}
fn main() {
foo!(x);
println!("{}", x);
}
9k ?iiT,ff2MXrBFBT2/BXQ`;frBFBf>v;B2MB+nK+`Q
kke
let
#BM/BM;b M/ HQQT H#2Hb- #mi MQi 7Q` Bi2Kb9j X aQ i?2 7QHHQrBM; +Q/2 /Q2b
macro_rules! foo {
() => (fn x() { });
}
fn main() {
foo!();
x();
}
8Xj8X J*_Pa
8Xj8X9
kkd
hQ b22 i?2 `2bmHib Q7 2tTM/BM; K+`Qb- `mM rustc --pretty expandedX h?2 QmiTmi `2T`2b2Mib
r?QH2 +`i2- bQ vQm +M HbQ 722/ Bi #+F BM iQ rustc- r?B+? rBHH bQK2iBK2b T`Q/m+2 #2ii2` 2``Q`
K2bb;2b i?M i?2 Q`B;BMH +QKTBHiBQMX LQi2 i?i i?2 --pretty expanded QmiTmi Kv ?p2
/Bz2`2Mi K2MBM; B7 KmHiBTH2 p`B#H2b Q7 i?2 bK2 MK2 U#mi /Bz2`2Mi bvMit +QMi2tibV `2 BM
THv BM i?2 bK2 b+QT2X AM i?Bb +b2 --pretty expanded,hygiene rBHH i2HH vQm #Qmi i?2 bvMit
+QMi2tibX
T`QpB/2b irQ bvMit 2ti2MbBQMb i?i ?2HT rBi? K+`Q /2#m;;BM;X 6Q` MQr- i?2v `2 mMbi#H2
M/ `2[mB`2 72im`2 ;i2bX
rustc
log_syntax!(...)
trace_macros!(true)
TM/ iQ MQi?BM;X
rBHH T`BMi Bib `;mK2Mib iQ biM/`/ QmiTmi- i +QKTBH2 iBK2- M/ 2t@
rBHH 2M#H2 +QKTBH2` K2bb;2 2p2`v iBK2 K+`Q Bb 2tTM/2/X lb2
Hi2` BM 2tTMbBQM iQ im`M Bi QzX
trace_macros!(false)
8Xj8X8
avMi+iB+ `2[mB`2K2Mib
1p2M r?2M _mbi +Q/2 +QMiBMb mM@2tTM/2/ K+`Qb- Bi +M #2 T`b2/ b 7mHH bvMit i`2299 X
h?Bb T`QT2`iv +M #2 p2`v mb27mH 7Q` 2/BiQ`b M/ Qi?2` iQQHb i?i T`Q+2bb +Q/2X Ai HbQ ?b 72r
+QMb2[m2M+2b 7Q` i?2 /2bB;M Q7 _mbib K+`Q bvbi2KX
PM2 +QMb2[m2M+2 Bb i?i _mbi Kmbi /2i2`KBM2- r?2M Bi T`b2b K+`Q BMpQ+iBQM- r?2i?2` i?2
K+`Q biM/b BM 7Q`
K+`Q BMpQ+iBQM rBi?BM #HQ+F +QmH/ biM/ 7Q` bQK2 Bi2Kb- Q` 7Q` M 2tT`2bbBQM f bii2K2MiX
_mbi mb2b bBKTH2 `mH2 iQ `2bQHp2 i?Bb K#B;mBivX K+`Q BMpQ+iBQM i?i biM/b 7Q` Bi2Kb Kmbi
#2 2Bi?2`
/2HBKBi2/ #v +m`Hv #`+2b- 2X;X foo! { ... }- Q`
i2`KBMi2/ #v b2KB+QHQM- 2X;X foo!(...);
MQi?2` +QMb2[m2M+2 Q7 T`2@2tTMbBQM T`bBM; Bb i?i i?2 K+`Q BMpQ+iBQM Kmbi +QMbBbi Q7 pHB/
_mbi iQF2MbX 6m`i?2`KQ`2- T`2Mi?2b2b- #`+F2ib- M/ #`+2b Kmbi #2 #HM+2/ rBi?BM K+`Q
BMpQ+iBQMX 6Q` 2tKTH2- foo!([) Bb 7Q`#B//2MX h?Bb HHQrb _mbi iQ FMQr r?2`2 i?2 K+`Q
BMpQ+iBQM 2M/bX
JQ`2 7Q`KHHv- i?2 K+`Q BMpQ+iBQM #Q/v Kmbi #2 b2[m2M+2 Q7 iQF2M i`22bX iQF2M i`22 Bb
/2}M2/ `2+m`bBp2Hv b 2Bi?2`
99 ;HQbb`vX?iKHO#bi`+i@bvMit@i`22
kk3
()- []-
Q`
{}-
Q`
qBi?BM Ki+?2`- 2+? K2ip`B#H2 ?b 7`;K2Mi bT2+B}2`- B/2MiB7vBM; r?B+? bvMi+iB+ 7Q`K
Bi Ki+?2bX
ident,
h?2`2 `2 //BiBQMH `mH2b `2;`/BM; i?2 M2ti iQF2M 7i2` K2ip`B#H2,
expr p`B#H2b Kmbi #2 7QHHQr2/ #v QM2 Q7, => , ;
ty M/ path p`B#H2b Kmbi #2 7QHHQr2/ #v QM2 Q7,
pat p`B#H2b Kmbi #2 7QHHQr2/ #v QM2 Q7, => , =
Pi?2` p`B#H2b Kv #2 7QHHQr2/ #v Mv iQF2MX
=> , : = > as
h?2b2 `mH2b T`QpB/2 bQK2 ~2tB#BHBiv 7Q` _mbib bvMit iQ 2pQHp2 rBi?Qmi #`2FBM; 2tBbiBM; K+`QbX
h?2 K+`Q bvbi2K /Q2b MQi /2H rBi? T`b2 K#B;mBiv i HHX 6Q` 2tKTH2- i?2 ;`KK` $($t:ty)*
$e:expr rBHH Hrvb 7BH iQ T`b2- #2+mb2 i?2 T`b2` rQmH/ #2 7Q`+2/ iQ +?QQb2 #2ir22M T`bBM;
$t M/ T`bBM; $eX *?M;BM; i?2 BMpQ+iBQM bvMit iQ Tmi /BbiBM+iBp2 iQF2M BM 7`QMi +M bQHp2
i?2 T`Q#H2KX AM i?Bb +b2- vQm +M r`Bi2 $(T $t:ty)* E $e:expX
fn-
A7 KQ/mH2 ?b i?2 macro_use ii`B#mi2- Bib K+`Qb `2 HbQ pBbB#H2 BM Bib T`2Mi KQ/mH2 7i2`
i?2 +?BH/b mod Bi2KX A7 i?2 T`2Mi HbQ ?b macro_use i?2M i?2 K+`Qb rBHH #2 pBbB#H2 BM i?2
;`M/T`2Mi 7i2` i?2 T`2Mib mod Bi2K- M/ bQ 7Q`i?X
98 ?iiT,ff/Q+X`mbi@HM;XQ`;f`272`2M+2X?iKHOBi2Kb
8Xj8X J*_Pa
kkN
crateX
#[macro_use(foo, bar)]
extern crate baz;
A7 i?2 ii`B#mi2 Bb ;Bp2M bBKTHv b #[macro_use]- HH K+`Qb `2 HQ/2/X A7 i?2`2 Bb MQ #[macro_use]
ii`B#mi2 i?2M MQ K+`Qb `2 HQ/2/X PMHv K+`Qb /2}M2/ rBi? i?2 #[macro_export] ii`B#mi2
Kv #2 HQ/2/X
hQ HQ/ +`i2b K+`Qb rBi?Qmi HBMFBM; Bi BMiQ i?2 QmiTmi- mb2
#[no_link]
b r2HHX
M 2tKTH2,
macro_rules! m1 { () => (()) }
// visible here: m1
mod foo {
// visible here: m1
#[macro_export]
macro_rules! m2 { () => (()) }
// visible here: m1, m2
}
// visible here: m1
macro_rules! m3 { () => (()) }
// visible here: m1, m3
#[macro_use]
mod bar {
// visible here: m1, m3
macro_rules! m4 { () => (()) }
// visible here: m1, m3, m4
}
// visible here: m1, m3, m4
QMHv
m2
rBHH #2 BKTQ`i2/X
kjy
$crate
7m`i?2` /B{+mHiv Q++m`b r?2M K+`Q Bb mb2/ BM KmHiBTH2 +`i2bX av i?i
mylib
/2}M2b
inc_b
_mbi /Q2b MQi Uv2iV ?p2 ?v;B2M2 bvbi2K 7Q` +`i2 `272`2M+2b- #mi Bi /Q2b T`QpB/2 bBKTH2
rQ`F`QmM/ 7Q` i?Bb T`Q#H2KX qBi?BM K+`Q BKTQ`i2/ 7`QK +`i2 MK2/ foo- i?2 bT2+BH
K+`Q p`B#H2 $crate rBHH 2tTM/ iQ ::fooX "v +QMi`bi- r?2M K+`Q Bb /2}M2/ M/ i?2M mb2/
BM i?2 bK2 +`i2- $crate rBHH 2tTM/ iQ MQi?BM;X h?Bb K2Mb r2 +M r`Bi2
#[macro_export]
macro_rules! inc {
($x:expr) => ( $crate::increment($x) )
}
iQ /2}M2 bBM;H2 K+`Q i?i rQ`Fb #Qi? BMbB/2 M/ QmibB/2 Qm` HB#``vX h?2 7mM+iBQM MK2 rBHH
2tTM/ iQ 2Bi?2` ::increment Q` ::mylib::incrementX
hQ F22T i?Bb bvbi2K bBKTH2 M/ +Q``2+i- #[macro_use] extern crate ... Kv QMHv TT2` i i?2
`QQi Q7 vQm` +`i2- MQi BMbB/2 modX h?Bb 2Mbm`2b i?i $crate Bb bBM;H2 B/2MiB}2`X
8Xj8X J*_Pa
kjR
macro_rules! bct {
// cmd 0:
8Xj8XN
bct!
K+`QX
*QKKQM K+`Qb
p2+5
h?2
K+`Q Bb mb2/ i?`Qm;?Qmi i?2 #QQF- bQ vQmp2 T`Q##Hv b22M Bi H`2/vX Ai +`2i2b
rBi? 2b2,
vec!
Vec<T>b
Ai HbQ H2ib vQm KF2 p2+iQ`b rBi? `2T2iBM; pHm2bX 6Q` 2tKTH2- ?mM/`2/ x2`Q2b,
let v = vec![0; 100];
kjk
assert_eq!
// A-ok!
assert!(true);
assert_eq!(5, 3 + 2);
// nope :(
assert!(5 < 3);
assert_eq!(5, 3);
i`v5
Bb mb2/ 7Q` 2``Q` ?M/HBM;X Ai iF2b bQK2i?BM; i?i +M `2im`M
B7 Bib Ok<T>- M/ returnb rBi? i?2 Err(E) B7 Bib i?iX GBF2 i?Bb,
try!
use std::fs::File;
fn foo() -> std::io::Result<()> {
let f = try!(File::create("foo.txt"));
Ok(())
}
mM`2+?#H25
h?Bb K+`Q Bb mb2/ r?2M vQm i?BMF bQK2 +Q/2 b?QmH/ M2p2` 2t2+mi2,
Result<T, E>-
M/ ;Bp2b
kjj
if false {
unreachable!();
}
aQK2iBK2b- i?2 +QKTBH2` Kv KF2 vQm ?p2 /Bz2`2Mi #`M+? i?i vQm FMQr rBHH M2p2`- 2p2`
`mMX AM i?2b2 +b2b- mb2 i?Bb K+`Q- bQ i?i B7 vQm 2M/ mT r`QM;- vQmHH ;2i panic! #Qmi BiX
let x: Option<i32> = None;
match x {
Some(_) => unreachable!(),
None => println!("I know x is None!"),
}
mMBKTH2K2Mi2/5
h?2 unimplemented! K+`Q +M #2 mb2/ r?2M vQm`2 i`vBM; iQ ;2i vQm` 7mM+iBQMb iQ ivT2+?2+FM/ /QMi rMi iQ rQ``v #Qmi r`BiBM; Qmi i?2 #Q/v Q7 i?2 7mM+iBQMX PM2 2tKTH2 Q7 i?Bb
bBimiBQM Bb BKTH2K2MiBM; i`Bi rBi? KmHiBTH2 `2[mB`2/ K2i?Q/b- r?2`2 vQm rMi iQ i+FH2 QM2
i iBK2X .2}M2 i?2 Qi?2`b b unimplemented! mMiBH vQm`2 `2/v iQ r`Bi2 i?2KX
8Xj8XRy
S`Q+2/m`H K+`Qb
A7 _mbib K+`Q bvbi2K +Mi /Q r?i vQm M22/- vQm Kv rMi iQ r`Bi2 +QKTBH2` THm;BM
Ub2+iBQM eXR- T;2 k9RV BMbi2/X *QKT`2/ iQ macro_rules! K+`Qb- i?Bb Bb bB;MB}+MiHv KQ`2
rQ`F- i?2 BMi2`7+2b `2 Km+? H2bb bi#H2- M/ #m;b +M #2 Km+? ?`/2` iQ i`+F /QrMX AM
2t+?M;2 vQm ;2i i?2 ~2tB#BHBiv Q7 `mMMBM; `#Bi``v _mbi +Q/2 rBi?BM i?2 +QKTBH2`X avMit
2ti2MbBQM THm;BMb `2 bQK2iBK2b +HH2/ T`Q+2/m`H K+`Qb 7Q` i?Bb `2bQMX
8Xje
_r SQBMi2`b
_mbi ?b MmK#2` Q7 /Bz2`2Mi bK`i TQBMi2` ivT2b BM Bib biM/`/ HB#``v- #mi i?2`2 `2 irQ
ivT2b i?i `2 2ti`@bT2+BHX Jm+? Q7 _mbib b72iv +QK2b 7`QK +QKTBH2@iBK2 +?2+Fb- #mi `r
TQBMi2`b /QMi ?p2 bm+? ;m`Mi22b- M/ `2 mMb72 Ub2+iBQM 8Xjd- T;2 kj8V iQ mb2X
M/ *mut T `2 +HH2/ `r TQBMi2`b BM _mbiX aQK2iBK2b- r?2M r`BiBM; +2`iBM FBM/b
Q7 HB#``B2b- vQmHH M22/ iQ ;2i `QmM/ _mbib b72iv ;m`Mi22b 7Q` bQK2 `2bQMX AM i?Bb +b2vQm +M mb2 `r TQBMi2`b iQ BKTH2K2Mi vQm` HB#``v- r?BH2 2tTQbBM; b72 BMi2`7+2 7Q` vQm`
mb2`bX 6Q` 2tKTH2- * TQBMi2`b `2 HHQr2/ iQ HBb- HHQrBM; i?2K iQ #2 mb2/ iQ r`Bi2 b?`2/@
QrM2`b?BT ivT2b- M/ 2p2M i?`2/@b72 b?`2/ K2KQ`v ivT2b Ui?2 Rc<T> M/ Arc<T> ivT2b `2
#Qi? BKTH2K2Mi2/ 2MiB`2Hv BM _mbiVX
*const T
>2`2 `2 bQK2 i?BM;b iQ `2K2K#2` #Qmi `r TQBMi2`b i?i `2 /Bz2`2Mi i?M Qi?2` TQBMi2` ivT2bX
h?2v,
`2 MQi ;m`Mi22/ iQ TQBMi iQ pHB/ K2KQ`v M/ `2 MQi 2p2M ;m`Mi22/ iQ #2 MQM@MmHH
UmMHBF2 #Qi? Box M/ &Vc
kj9
/Q MQi ?p2 Mv miQKiB+ +H2M@mT- mMHBF2 Box- M/ bQ `2[mB`2 KMmH `2bQm`+2 KM;2@
K2Mic
`2 THBM@QH/@/i- i?i Bb- i?2v /QMi KQp2 QrM2`b?BT- ;BM mMHBF2 Box- ?2M+2 i?2 _mbi
+QKTBH2` +MMQi T`Qi2+i ;BMbi #m;b HBF2 mb2@7i2`@7`22c
H+F Mv 7Q`K Q7 HB72iBK2b- mMHBF2 &- M/ bQ i?2 +QKTBH2` +MMQi `2bQM #Qmi /M;HBM;
TQBMi2`bc M/
?p2 MQ ;m`Mi22b #Qmi HBbBM; Q` Kmi#BHBiv Qi?2` i?M KmiiBQM MQi #2BM; HHQr2/
/B`2+iHv i?`Qm;? *const TX
8XjeXR "bB+b
*`2iBM; `r TQBMi2` Bb T2`72+iHv b72,
let x = 5;
let raw = &x as *const i32;
let mut y = 10;
let raw_mut = &mut y as *mut i32;
q?2M vQm /2`272`2M+2 `r TQBMi2`- vQm`2 iFBM; `2bTQMbB#BHBiv i?i Bib MQi TQBMiBM; bQK2r?2`2
i?i rQmH/ #2 BM+Q``2+iX b bm+?- vQm M22/ unsafe,
let x = 5;
let raw = &x as *const i32;
let points_at = unsafe { *raw };
println!("raw points at {}", points_at);
8XjdX
kj8
UNSAFE
8XjeXk
66A
_r TQBMi2`b `2 mb27mH 7Q` 66A, _mbib *const T M/ *mut T `2 bBKBH` iQ *b const T* M/
`2bT2+i7mHHvX 6Q` KQ`2 #Qmi i?Bb mb2- +QMbmHi i?2 66A +?Ti2` Ub2+iBQM 9X3- T;2 RyeVX
8XjeXj
T*-
i `mMiBK2- `r TQBMi2` * M/ `272`2M+2 TQBMiBM; iQ i?2 bK2 TB2+2 Q7 /i ?p2 M B/2MiB+H
`2T`2b2MiiBQMX AM 7+i- M &T `272`2M+2 rBHH BKTHB+BiHv +Q2`+2 iQ M *const T `r TQBMi2` BM
b72 +Q/2 M/ bBKBH`Hv 7Q` i?2 mut p`BMib U#Qi? +Q2`+BQMb +M #2 T2`7Q`K2/ 2tTHB+BiHv rBi?`2bT2+iBp2Hv- value as *const T M/ value as *mut TVX
:QBM; i?2 QTTQbBi2 /B`2+iBQM- 7`QK *const iQ `272`2M+2 &- Bb MQi b72X &T Bb Hrvb pHB/- M/ bQi KBMBKmK- i?2 `r TQBMi2` *const T ?b iQ TQBMi iQ pHB/ BMbiM+2 Q7 ivT2 TX 6m`i?2`KQ`2i?2 `2bmHiBM; TQBMi2` Kmbi biBb7v i?2 HBbBM; M/ Kmi#BHBiv Hrb Q7 `272`2M+2bX h?2 +QKTBH2`
bbmK2b i?2b2 T`QT2`iB2b `2 i`m2 7Q` Mv `272`2M+2b- MQ Kii2` ?Qr i?2v `2 +`2i2/- M/ bQ Mv
+QMp2`bBQM 7`QK `r TQBMi2`b Bb bb2`iBM; i?i i?2v ?QH/X h?2 T`Q;`KK2` Kmbi ;m`Mi22 i?BbX
h?2 `2+QKK2M/2/ K2i?Q/ 7Q` i?2 +QMp2`bBQM Bb
let i: u32 = 1;
// explicit cast
let p_imm: *const u32 = &i as *const u32;
let mut m: u32 = 2;
// implicit coercion
let p_mut: *mut u32 = &mut m;
unsafe {
let ref_imm: &u32 = &*p_imm;
let ref_mut: &mut u32 = &mut *p_mut;
}
h?2 &*x /2`272`2M+BM; bivH2 Bb T`272``2/ iQ mbBM; transmuteX h?2 Hii2` Bb 7` KQ`2 TQr2`7mH
i?M M2+2bb`v- M/ i?2 KQ`2 `2bi`B+i2/ QT2`iBQM Bb ?`/2` iQ mb2 BM+Q``2+iHvc 7Q` 2tKTH2- Bi
`2[mB`2b i?i x Bb TQBMi2` UmMHBF2 transmuteVX
8Xjd
unsafe
_mbib KBM /`r Bb Bib TQr2`7mH biiB+ ;m`Mi22b #Qmi #2?pBQ`X "mi b72iv +?2+Fb `2 +QMb2`@
piBp2 #v Mim`2, i?2`2 `2 bQK2 T`Q;`Kb i?i `2 +imHHv b72- #mi i?2 +QKTBH2` Bb MQi #H2
iQ p2`B7v i?Bb Bb i`m2X hQ r`Bi2 i?2b2 FBM/b Q7 T`Q;`Kb- r2 M22/ iQ i2HH i?2 +QKTBH2` iQ `2Ht Bib
`2bi`B+iBQMb #BiX 6Q` i?Bb- _mbi ?b F2vrQ`/- unsafeX *Q/2 mbBM; unsafe ?b H2bb `2bi`B+iBQMb
i?M MQ`KH +Q/2 /Q2bX
G2ib ;Q Qp2` i?2 bvMit- M/ i?2M r2HH iHF b2KMiB+bX
QM2 Bb iQ K`F 7mM+iBQM b mMb72,
unsafe
kje
unsafe fn danger_will_robinson() {
// scary stuff
}
HH 7mM+iBQMb +HH2/ 7`QK 66A Ub2+iBQM 9X3- T;2 RyeV Kmbi #2 K`F2/ b
h?2 b2+QM/ mb2 Q7 unsafe Bb M mMb72 #HQ+F,
unsafe-
7Q` 2tKTH2X
unsafe {
// scary stuff
}
Aib BKTQ`iMi iQ #2 #H2 iQ 2tTHB+BiHv /2HBM2i2 +Q/2 i?i Kv ?p2 #m;b i?i +mb2 #B; T`Q#H2KbX
A7 _mbi T`Q;`K b2;7mHib- vQm +M #2 bm`2 Bib bQK2r?2`2 BM i?2 b2+iBQMb K`F2/ unsafeX
.i `+2b
.2`272`2M+BM; MmHHf/M;HBM; `r TQBMi2`
_2/b Q7 mM/279N UmMBMBiBHBx2/V K2KQ`v
"`2FBM; i?2 TQBMi2` HBbBM; `mH2b8y rBi? `r TQBMi2`bX
&mut T M/ &T 7QHHQr GGoJb b+QT2/ MQHBb8R KQ/2H- 2t+2Ti B7 i?2 &T +QMiBMb M
UnsafeCell<U>X lMb72 +Q/2 Kmbi MQi pBQHi2 i?2b2 HBbBM; ;m`Mi22bX
JmiiBM; M BKKmi#H2 pHm2f`272`2M+2 rBi?Qmi UnsafeCell<U>
AMpQFBM; mM/2}M2/ #2?pBQ` pB +QKTBH2` BMi`BMbB+b,
AM/2tBM; QmibB/2 Q7 i?2 #QmM/b Q7 M Q#D2+i rBi? std::ptr::offset Uoffset BMi`BMbB+V- rBi?
i?2 2t+2TiBQM Q7 QM2 #vi2 Tbi i?2 2M/ r?B+? Bb T2`KBii2/X
lbBM; std::ptr::copy_nonoverlapping_memory Umemcpy32fmemcpy64 BMi`BMbB+bV QM Qp2`HT@
TBM; #mz2`b
AMpHB/ pHm2b BM T`BKBiBp2 ivT2b- 2p2M BM T`Bpi2 }2H/bfHQ+Hb,
LmHHf/M;HBM; `272`2M+2b Q` #Qt2b
pHm2 Qi?2` i?M false UyV Q` true URV BM bool
/Bb+`BKBMMi BM M enum MQi BM+Hm/2/ BM Bib ivT2 /2}MBiBQM
pHm2 BM char r?B+? Bb bm``Q;i2 Q` #Qp2 char::MAX
LQM@lh6@3 #vi2 b2[m2M+2b BM str
lMrBM/BM; BMiQ _mbi 7`QK 7Q`2B;M +Q/2 Q` mMrBM/BM; 7`QK _mbi BMiQ 7Q`2B;M +Q/2X
q?2r5 h?ib #mM+? Q7 bimzX Aib HbQ BKTQ`iMi iQ MQiB+2 HH FBM/b Q7 #2?pBQ`b i?i `2
+2`iBMHv #/- #mi `2 2tT`2bbHv MQi mMb72,
9N ?iiT,ffHHpKXQ`;f/Q+bfGM;_27X?iKHOmM/27BM2/@pHm2b
8y ?iiT,ffHHpKXQ`;f/Q+bfGM;_27X?iKHOTQBMi2`@HBbBM;@`mH2b
8R ?iiT,ffHHpKXQ`;f/Q+bfGM;_27X?iKHOMQHBb
8XjdX
kjd
UNSAFE
.2/HQ+Fb
_2/BM; /i 7`QK T`Bpi2 }2H/b
G2Fb /m2 iQ `272`2M+2 +QmMi +v+H2b
1tBiBM; rBi?Qmi +HHBM; /2bi`m+iQ`b
a2M/BM; bB;MHb
++2bbBM;fKQ/B7vBM; i?2 }H2 bvbi2K
AMi2;2` Qp2`~Qr
_mbi +MMQi T`2p2Mi HH FBM/b Q7 bQ7ir`2 T`Q#H2KbX "m;;v +Q/2 +M M/ rBHH #2 r`Bii2M BM _mbiX
h?2b2 i?BM;b `2Mi ;`2i- #mi i?2v /QMi [mHB7v b unsafe bT2+B}+HHvX
8XjdXk
lMb72 amT2`TQr2`b
AM #Qi? mMb72 7mM+iBQMb M/ mMb72 #HQ+Fb- _mbi rBHH H2i vQm /Q i?`22 i?BM;b i?i vQm MQ`KHHv
+M MQi /QX Cmbi i?`22X >2`2 i?2v `2,
RX ++2bb Q` mT/i2 biiB+ Kmi#H2 p`B#H28k X
kX .2`272`2M+2 `r TQBMi2`X
jX *HH mMb72 7mM+iBQMbX h?Bb Bb i?2 KQbi TQr2`7mH #BHBivX
h?ib BiX Aib BKTQ`iMi i?i unsafe /Q2b MQi- 7Q` 2tKTH2- im`M Qz i?2 #Q``Qr +?2+F2`X //BM;
unsafe iQ bQK2 `M/QK _mbi +Q/2 /Q2bMi +?M;2 Bib b2KMiB+b- Bi rQMi Dmbi bi`i ++2TiBM;
Mvi?BM;X
"mi Bi rBHH H2i vQm r`Bi2 i?BM;b i?i /Q #`2F bQK2 Q7 i?2 `mH2bX G2ib ;Q Qp2` i?2b2 i?`22 #BHBiB2b
BM Q`/2`X
++2bb Q` mT/i2
static mut
_mbi ?b 72im`2 +HH2/ static mut r?B+? HHQrb 7Q` Kmi#H2 ;HQ#H bii2X .QBM; bQ +M +mb2
/i `+2- M/ b bm+? Bb BM?2`2MiHv MQi b72X 6Q` KQ`2 /2iBHb- b22 i?2 biiB+8j b2+iBQM Q7 i?2
#QQFX
kj3
unsafe,
unsafe
h?Bb #BHBiv Bb TQr2`7mH M/ p`B2/X _mbi 2tTQb2b bQK2 +QKTBH2` BMi`BMbB+b Ub2+iBQM eX9- T;2 k8RV
b mMb72 7mM+iBQMb- M/ bQK2 mMb72 7mM+iBQMb #vTbb b72iv +?2+Fb- i`/BM; b72iv 7Q` bT22/X
AHH `2T2i ;BM, 2p2M i?Qm;? vQm +M /Q `#Bi``v i?BM;b BM mMb72 #HQ+Fb M/ 7mM+iBQMb /Q2bMi
K2M vQm b?QmH/X h?2 +QKTBH2` rBHH +i b i?Qm;? vQm`2 mT?QH/BM; Bib BMp`BMib- bQ #2 +`27mH5
LB;?iHv _mbi
_mbi T`QpB/2b i?`22 /Bbi`B#miBQM +?MM2Hb 7Q` _mbi, MB;?iHv- #2i- M/ bi#H2X lMbi#H2 72@
im`2b `2 QMHv pBH#H2 QM MB;?iHv _mbiX 6Q` KQ`2 /2iBHb QM i?Bb T`Q+2bb- b22 ai#BHBiv b
/2HBp2`#H2R X
hQ BMbiHH MB;?iHv _mbi- vQm +M mb2
rustup.sh,
A7 vQm`2 +QM+2`M2/ #Qmi i?2 TQi2MiBH BMb2+m`Bivk Q7 mbBM; curl | sh- TH2b2 F22T `2/BM; M/
b22 Qm` /Bb+HBK2` #2HQrX M/ 722H 7`22 iQ mb2 irQ@bi2T p2`bBQM Q7 i?2 BMbiHHiBQM M/ 2tKBM2
Qm` BMbiHHiBQM b+`BTi,
$ curl -f -L https://static.rust-lang.org/rustup.sh -O
$ sh rustup.sh --channel=nightly
A7 vQm`2 QM qBM/Qrb- TH2b2 /QrMHQ/ 2Bi?2` i?2 jk@#Bi BMbiHH2`j Q` i?2 e9@#Bi BMbiHH2`9 M/
`mM BiX
lMBMbiHHBM;
A7 vQm /2+B/2 vQm /QMi rMi _mbi MvKQ`2- r2HH #2 #Bi b/- #mi i?ib QFvX LQi 2p2`v
T`Q;`KKBM; HM;m;2 Bb ;`2i 7Q` 2p2`vQM2X Cmbi `mM i?2 mMBMbiHH b+`BTi,
$ sudo /usr/local/lib/rustlib/uninstall.sh
R ?iiT,ff#HQ;X`mbi@HM;XQ`;fkyR9fRyfjyfai#BHBivX?iKH
k ?iiT,ff+m`HTBT2b?XimK#H`X+QK
j ?iiTb,ffbiiB+X`mbi@HM;XQ`;f/Bbif`mbi@RXyXy@#2i@Be3e@T+@rBM/Qrb@;MmXKbB
9 ?iiTb,ffbiiB+X`mbi@HM;XQ`;f/Bbif`mbi@RXyXy@#2i@t3ene9@T+@rBM/Qrb@;MmXKbB
k9y
A7 vQm mb2/ i?2 qBM/Qrb BMbiHH2`- Dmbi `2@`mM i?2
aQK2 T2QTH2- M/ bQK2r?i `B;?i7mHHv bQ- ;2i p2`v mTb2i r?2M r2 i2HH vQm iQ curl | shX "bB+HHvr?2M vQm /Q i?Bb- vQm `2 i`mbiBM; i?i i?2 ;QQ/ T2QTH2 r?Q KBMiBM _mbi `2Mi ;QBM; iQ ?+F
vQm` +QKTmi2` M/ /Q #/ i?BM;bX h?ib ;QQ/ BMbiBM+i5 A7 vQm`2 QM2 Q7 i?Qb2 T2QTH2- TH2b2
+?2+F Qmi i?2 /Q+mK2MiiBQM QM #mBH/BM; _mbi 7`QK aQm`+28 - Q` i?2 Q{+BH #BM`v /QrMHQ/be X
P?- r2 b?QmH/ HbQ K2MiBQM i?2 Q{+BHHv bmTTQ`i2/ THi7Q`Kb,
qBM/Qrb Ud- 3- a2`p2` kyy3 _kV
GBMmt UkXeXR3 Q` Hi2`- p`BQmb /Bbi`B#miBQMbV- t3e M/ t3e@e9
Pas RyXd UGBQMV Q` ;`2i2`- t3e M/ t3e@e9
q2 2ti2MbBp2Hv i2bi _mbi QM i?2b2 THi7Q`Kb- M/ 72r Qi?2`b- iQQ- HBF2 M/`QB/X "mi i?2b2 `2
i?2 QM2b KQbi HBF2Hv iQ rQ`F- b i?2v ?p2 i?2 KQbi i2biBM;X
6BMHHv- +QKK2Mi #Qmi qBM/QrbX _mbi +QMbB/2`b qBM/Qrb iQ #2 }`bi@+Hbb THi7Q`K mTQM
`2H2b2- #mi B7 r2`2 ?QM2bi- i?2 qBM/Qrb 2tT2`B2M+2 BbMi b BMi2;`i2/ b i?2 GBMmtfPa s
2tT2`B2M+2 BbX q2`2 rQ`FBM; QM Bi5 A7 Mvi?BM; /Q2b MQi rQ`F- Bi Bb #m;X SH2b2 H2i mb FMQr B7
i?i ?TT2MbX 1+? M/ 2p2`v +QKKBi Bb i2bi2/ ;BMbi qBM/Qrb Dmbi HBF2 Mv Qi?2` THi7Q`KX
A7 vQmp2 ;Qi _mbi BMbiHH2/- vQm +M QT2M mT b?2HH- M/ ivT2 i?Bb,
$ rustc --version
uQm b?QmH/ b22 i?2 p2`bBQM MmK#2`- +QKKBi ?b?- +QKKBi /i2 M/ #mBH/ /i2,
3 ?iiT,ff+?iXKB##BiX+QKf\b2`p2`4B`+XKQxBHHXQ`;+?MM2H4Wkj`mbi
N ?iiT,ffmb2`bX`mbi@HM;XQ`;f
Ry ?iiT,ffbi+FQp2`7HQrX+QKf[m2biBQMbfi;;2/f`mbi
eXR
eXRXR
k9R
*QKTBH2` SHm;BMb
AMi`Q/m+iBQM
+M HQ/ +QKTBH2` THm;BMb- r?B+? `2 mb2`@T`QpB/2/ HB#``B2b i?i 2ti2M/ i?2 +QKTBH2`b
#2?pBQ` rBi? M2r bvMit 2ti2MbBQMb- HBMi +?2+Fb- 2i+X
rustc
THm;BM Bb /vMKB+ HB#``v +`i2 rBi? /2bB;Mi2/ `2;Bbi`` 7mM+iBQM i?i `2;Bbi2`b 2ti2MbBQMb
rBi? rustcX Pi?2` +`i2b +M HQ/ i?2b2 2ti2MbBQMb mbBM; i?2 +`i2 ii`B#mi2 #![plugin(...)]X
a22 i?2 rustc::pluginRR /Q+mK2MiiBQM 7Q` KQ`2 #Qmi i?2 K2+?MB+b Q7 /2}MBM; M/ HQ/BM;
THm;BMX
A7 T`2b2Mi- `;mK2Mib Tbb2/ b #![plugin(foo(... args ...))] `2 MQi BMi2`T`2i2/ #v `mbi+
Bib2H7X h?2v `2 T`QpB/2/ iQ i?2 THm;BM i?`Qm;? i?2 Registryb args K2i?Q/Rk X
AM i?2 pbi KDQ`Biv Q7 +b2b- THm;BM b?QmH/ QMHv #2 mb2/ i?`Qm;? #![plugin] M/ MQi i?`Qm;?
M extern crate Bi2KX GBMFBM; THm;BM rQmH/ TmHH BM HH Q7 HB#bvMit M/ HB#`mbi+ b /2T2M/2M+B2b
Q7 vQm` +`i2X h?Bb Bb ;2M2`HHv mMrMi2/ mMH2bb vQm `2 #mBH/BM; MQi?2` THm;BMX h?2 plugin_as_library HBMi +?2+Fb i?2b2 ;mB/2HBM2bX
h?2 mbmH T`+iB+2 Bb iQ Tmi +QKTBH2` THm;BMb BM i?2B` QrM +`i2- b2T`i2 7`QK Mv macro_rules!
K+`Qb Q` Q`/BM`v _mbi +Q/2 K2Mi iQ #2 mb2/ #v +QMbmK2`b Q7 HB#``vX
eXRXk
avMit 2ti2MbBQMb
SHm;BMb +M 2ti2M/ _mbib bvMit BM p`BQmb rvbX PM2 FBM/ Q7 bvMit 2ti2MbBQM Bb i?2 T`Q+2/m`H
K+`QX h?2b2 `2 BMpQF2/ i?2 bK2 rv b Q`/BM`v K+`Qb Ub2+iBQM 8Xj8- T;2 kkyV- #mi i?2
2tTMbBQM Bb T2`7Q`K2/ #v `#Bi``v _mbi +Q/2 i?i KMBTmHi2b bvMit i`22bRj i +QKTBH2 iBK2X
G2ib r`Bi2 THm;BM
roman_numerals.rsR9
#![crate_type="dylib"]
#![feature(plugin_registrar, rustc_private)]
extern crate syntax;
extern crate rustc;
use syntax::codemap::Span;
use syntax::parse::token;
use syntax::ast::{TokenTree, TtToken};
use syntax::ext::base::{ExtCtxt, MacResult, DummyResult, MacEager};
use syntax::ext::build::AstBuilder;
use rustc::plugin::Registry;
fn expand_rn(cx: &mut ExtCtxt, sp: Span, args: &[TokenTree])
-> Box<MacResult + 'static> {
RR ?iiT,ff/Q+X`mbi@HM;XQ`;f`mbi+fTHm;BMfBM/2tX?iKH
Rk ?iiT,ff/Q+X`mbi@HM;XQ`;f`mbi+fTHm;BMf`2;Bbi`vfbi`m+iX_2;Bbi`vX?iKHOK2i?Q/X`;b
Rj ?iiT,ff/Q+X`mbi@HM;XQ`;fbvMitfbifBM/2tX?iKH
R9 ?iiTb,ff;Bi?m#X+QKf`mbi@HM;f`mbifi`22fKbi2`fb`+fi2bifmtBHB`vf`QKMnMmK2`HbX`b
k9k
100), ("XC",
90), ("L",
50), ("XL",
40),
("X",
10), ("IX",
9), ("V",
5), ("IV",
4),
("I",
1)];
rn!()
#![feature(plugin)]
#![plugin(roman_numerals)]
fn main() {
assert_eq!(rn!(MMXV), 2015);
}
`2,
k9j
GQQFBM; i?`Qm;?
rQ`FbX
libsyntax
T`b2` +Q/2kR rBHH ;Bp2 vQm 722H 7Q` ?Qr i?2 T`bBM; BM7`bi`m+im`2
E22T i?2 Spanbkk Q7 2p2`vi?BM; vQm T`b2- 7Q` #2ii2` 2``Q` `2TQ`iBM;X uQm +M r`T
`QmM/ vQm` +mbiQK /i bi`m+im`2bX
*HHBM;
ExtCtxt::span_fatalk9
ExtCtxt::span_errk8
2``Q`bX
Spannedkj
hQ T`BMi bvMit 7`;K2Mib 7Q` /2#m;;BM;- vQm +M mb2 span_notekd iQ;2i?2` rBi? syntax::print::pprust::*_to_stringk3 X
h?2 2tKTH2 #Qp2 T`Q/m+2/ M BMi2;2` HBi2`H mbBM; AstBuilder::expr_usizekN X b M Hi2`MiBp2
iQ i?2 AstBuilder i`Bi- libsyntax T`QpB/2b b2i Q7 [mbB[mQi2 K+`Qbjy X h?2v `2 mM/Q+mK2Mi2/
R8 ?iiT,ff/Q+X`mbi@HM;XQ`;f`272`2M+2X?iKHO/2`Bp2
Re ?iiT,ff/Q+X`mbi@HM;XQ`;f`mbi+fTHm;BMf`2;Bbi`vfbi`m+iX_2;Bbi`vX?iKHOK2i?Q/X`2;Bbi2`nbvMitn2ti2MbBQM
Rd ?iiT,ff/Q+X`mbi@HM;XQ`;fbvMitf2tif#b2f2MmKXavMit1ti2MbBQMX?iKH
R3 ?iiTb,ff;Bi?m#X+QKf`mbi@HM;f`2;2tf#HQ#fKbi2`f`2;2tnK+`Qbfb`+fHB#X`b
RN K+`QbX?iKHO/2#m;;BM;@K+`Q@+Q/2
ky ?iiT,ff/Q+X`mbi@HM;XQ`;fbvMitfT`b2fBM/2tX?iKH
kR ?iiTb,ff;Bi?m#X+QKf`mbi@HM;f`mbif#HQ#fKbi2`fb`+fHB#bvMitfT`b2fT`b2`X`b
kk ?iiT,ff/Q+X`mbi@HM;XQ`;fbvMitf+Q/2KTfbi`m+iXaTMX?iKH
kj ?iiT,ff/Q+X`mbi@HM;XQ`;fbvMitf+Q/2KTfbi`m+iXaTMM2/X?iKH
k9 ?iiT,ff/Q+X`mbi@HM;XQ`;fbvMitf2tif#b2fbi`m+iX1ti*itiX?iKHOK2i?Q/XbTMn7iH
k8 ?iiT,ff/Q+X`mbi@HM;XQ`;fbvMitf2tif#b2fbi`m+iX1ti*itiX?iKHOK2i?Q/XbTMn2``
ke ?iiT,ff/Q+X`mbi@HM;XQ`;fbvMitf2tif#b2fbi`m+iX.mKKv_2bmHiX?iKH
kd ?iiT,ff/Q+X`mbi@HM;XQ`;fbvMitf2tif#b2fbi`m+iX1ti*itiX?iKHOK2i?Q/XbTMnMQi2
k3 ?iiT,ff/Q+X`mbi@HM;XQ`;fbvMitfT`BMifTT`mbifBM/2tX?iKHO7mM+iBQMb
kN ?iiT,ff/Q+X`mbi@HM;XQ`;fbvMitf2tif#mBH/fi`BiXbi"mBH/2`X?iKHOivK2i?Q/X2tT`nmbBx2
jy ?iiT,ff/Q+X`mbi@HM;XQ`;fbvMitf2tif[mQi2fBM/2tX?iKH
k99
M/ p2`v `Qm;? `QmM/ i?2 2/;2bX >Qr2p2`- i?2 BKTH2K2MiiBQM Kv #2 ;QQ/ bi`iBM; TQBMi
7Q` M BKT`Qp2/ [mbB[mQi2 b M Q`/BM`v THm;BM HB#``vX
jk ?iiTb,ff;Bi?m#X+QKf`mbi@HM;f`mbif#HQ#fKbi2`fb`+fi2bifmtBHB`vfHBMinTHm;BMni2biX`b
declare_lint!
k98
BMpQ+iBQMb- r?B+? /2}M2 biiB+
Lintjj
bi`m+ibc
bi`m+i ?QH/BM; Mv bii2 M22/2/ #v i?2 HBMi Tbb U?2`2- MQM2Vc
LintPassj9 BKTH2K2MiiBQM /2}MBM; ?Qr iQ +?2+F 2+? bvMit 2H2K2MiX bBM;H2 LintPass
Kv +HH span_lint 7Q` b2p2`H /Bz2`2Mi Lintb- #mi b?QmH/ `2;Bbi2` i?2K HH i?`Qm;? i?2
get_lints K2i?Q/X
GBMi Tbb2b `2 bvMit i`p2`bHb- #mi i?2v `mM i Hi2 bi;2 Q7 +QKTBHiBQM r?2`2 ivT2 BM7Q`@
KiBQM Bb pBH#H2X rustcb #mBHi@BM HBMibj8 KQbiHv mb2 i?2 bK2 BM7`bi`m+im`2 b HBMi THm;BMbM/ T`QpB/2 2tKTH2b Q7 ?Qr iQ ++2bb ivT2 BM7Q`KiBQMX
GBMib /2}M2/ #v THm;BMb `2 +QMi`QHH2/ #v i?2 mbmH ii`B#mi2b M/ +QKTBH2` ~;bje - 2X;X
#[allow(test_lint)] Q` -A test-lintX h?2b2 B/2MiB}2`b `2 /2`Bp2/ 7`QK i?2 }`bi `;mK2Mi iQ
declare_lint!- rBi? TT`QT`Bi2 +b2 M/ TmM+imiBQM +QMp2`bBQMX
uQm +M `mM rustc -W help foo.rs iQ b22 HBbi Q7 HBMib FMQrM iQ
#v THm;BMb HQ/2/ #v foo.rsX
eXk
rustc-
AMHBM2 bb2K#Hv
6Q` 2ti`2K2Hv HQr@H2p2H KMBTmHiBQMb M/ T2`7Q`KM+2 `2bQMb- QM2 KB;?i rBb? iQ +QMi`QH i?2
*Sl /B`2+iHvX _mbi bmTTQ`ib mbBM; BMHBM2 bb2K#Hv iQ /Q i?Bb pB i?2 asm! K+`QX h?2 bvMit
`Qm;?Hv Ki+?2b i?i Q7 :** *HM;,
asm!(assembly template
: output operands
: input operands
: clobbers
: options
);
#![feature(asm)]
LQi2, i?2 2tKTH2b ?2`2 `2 ;Bp2M BM t3eft3e@e9 bb2K#Hv- #mi HH THi7Q`Kb `2
bmTTQ`i2/X
bb2K#Hv i2KTHi2
h?2
assembly template
jj ?iiT,ff/Q+X`mbi@HM;XQ`;f`mbi+fHBMifbi`m+iXGBMiX?iKH
j9 ?iiT,ff/Q+X`mbi@HM;XQ`;f`mbi+fHBMifi`BiXGBMiSbbX?iKH
j8 ?iiTb,ff;Bi?m#X+QKf`mbi@HM;f`mbif#HQ#fKbi2`fb`+fHB#`mbi+fHBMif#mBHiBMX`b
je ?iiT,ff/Q+X`mbi@HM;XQ`;f`272`2M+2X?iKHOHBMi@+?2+F@ii`B#mi2b
""V
k9e
#![feature(asm)]
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
fn foo() {
unsafe {
asm!("NOP");
}
}
// other platforms
#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
fn foo() { /* ... */ }
fn main() {
// ...
foo();
// ...
}
Uh?2
feature(asm)
M/
#[cfg]b
PmiTmi QT2`M/b- BMTmi QT2`M/b- +HQ##2`b M/ QTiBQMb `2 HH QTiBQMH #mi vQm Kmbi // i?2
`B;?i MmK#2` Q7 : B7 vQm bFBT i?2K,
# #![feature(asm)]
# #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
# fn main() { unsafe {
asm!("xor %eax, %eax"
:
:
: "{eax}"
);
# } }
PT2`M/b
AMTmi M/ QmiTmi QT2`M/b 7QHHQr i?2 bK2 7Q`Ki, : "constraints1"(expr1), "constraints2"(expr2),
..."X PmiTmi QT2`M/ 2tT`2bbBQMb Kmbi #2 Kmi#H2 HpHm2b- Q` MQi v2i bbB;M2/,
k9d
# #![feature(asm)]
# #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
fn add(a: i32, b: i32) -> i32 {
let c: i32;
unsafe {
asm!("add $2, $0"
: "=r"(c)
: "0"(a), "r"(b)
);
}
c
}
# #[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
# fn add(a: i32, b: i32) -> i32 { a + b }
fn main() {
assert_eq!(add(3, 14159), 14162)
}
A7 vQm rQmH/ HBF2 iQ mb2 `2H QT2`M/b BM i?Bb TQbBiBQM- ?Qr2p2`- vQm `2 `2[mB`2/ iQ Tmi +m`Hv
#`+2b {} `QmM/ i?2 `2;Bbi2` i?i vQm rMi- M/ vQm `2 `2[mB`2/ iQ Tmi i?2 bT2+B}+ bBx2 Q7
i?2 QT2`M/X h?Bb Bb mb27mH 7Q` p2`v HQr H2p2H T`Q;`KKBM;- r?2`2 r?B+? `2;Bbi2` vQm mb2 Bb
BKTQ`iMi,
# #![feature(asm)]
# #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
# unsafe fn read_byte_in(port: u16) -> u8 {
let result: u8;
asm!("in %dx, %al" : "={al}"(result) : "{dx}"(port));
result
# }
*HQ##2`b
aQK2 BMbi`m+iBQMb KQ/B7v `2;Bbi2`b r?B+? KB;?i Qi?2`rBb2 ?p2 ?2H/ /Bz2`2Mi pHm2b bQ r2 mb2
i?2 +HQ##2`b HBbi iQ BM/B+i2 iQ i?2 +QKTBH2` MQi iQ bbmK2 Mv pHm2b HQ/2/ BMiQ i?Qb2 `2;Bbi2`b
rBHH biv pHB/X
# #![feature(asm)]
# #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
# fn main() { unsafe {
// Put the value 0x200 in eax
asm!("mov $$0x200, %eax" : /* no outputs */ : /* no inputs */ : "{eax}");
# } }
AMTmi M/ QmiTmi `2;Bbi2`b M22/ MQi #2 HBbi2/ bBM+2 i?i BM7Q`KiBQM Bb H`2/v +QKKmMB+i2/ #v
i?2 ;Bp2M +QMbi`BMibX Pi?2`rBb2- Mv Qi?2` `2;Bbi2`b mb2/ 2Bi?2` BKTHB+BiHv Q` 2tTHB+BiHv b?QmH/
#2 HBbi2/X
k93
A7 i?2 bb2K#Hv +?M;2b i?2 +QM/BiBQM +Q/2 `2;Bbi2` cc b?QmH/ #2 bT2+B}2/ b QM2 Q7 i?2 +HQ##2`bX
aBKBH`Hv- B7 i?2 bb2K#Hv KQ/B}2b K2KQ`v- memory b?QmH/ HbQ #2 bT2+B}2/X
PTiBQMb
h?2 Hbi b2+iBQM-
options
eXj
LQ bi/HB#
"v /27mHi- std Bb HBMF2/ iQ 2p2`v _mbi +`i2X AM bQK2 +QMi2tib- i?Bb Bb mM/2bB`#H2- M/ +M #2
pQB/2/ rBi? i?2 #![no_std] ii`B#mi2 ii+?2/ iQ i?2 +`i2X
// a minimal library
#![crate_type="lib"]
#![feature(no_std)]
#![no_std]
# // fn main() {} tricked you, rustdoc!
P#pBQmbHv i?2`2b KQ`2 iQ HB72 i?M Dmbi HB#``B2b, QM2 +M mb2 #[no_std] rBi? M 2t2+mi#H2+QMi`QHHBM; i?2 2Mi`v TQBMi Bb TQbbB#H2 BM irQ rvb, i?2 #[start] ii`B#mi2- Q` Qp2``B/BM; i?2
/27mHi b?BK 7Q` i?2 * main 7mM+iBQM rBi? vQm` QrMX
h?2 7mM+iBQM K`F2/
#[start]
eXjX LP ah.GA"
k9N
hQ Qp2``B/2 i?2 +QKTBH2`@BMb2`i2/ main b?BK- QM2 ?b iQ /Bb#H2 Bi rBi? #![no_main] M/ i?2M +`2@
i2 i?2 TT`QT`Bi2 bvK#QH rBi? i?2 +Q``2+i "A M/ i?2 +Q``2+i MK2- r?B+? `2[mB`2b Qp2``B/BM;
i?2 +QKTBH2`b MK2 KM;HBM; iQQ,
#![feature(no_std)]
#![no_std]
#![no_main]
#![feature(lang_items, start)]
extern crate libc;
#[no_mangle] // ensure that this symbol is called `main` in the output
pub extern fn main(argc: i32, argv: *const *const u8) -> i32 {
0
}
#[lang = "stack_exhausted"] extern fn stack_exhausted() {}
#[lang = "eh_personality"] extern fn eh_personality() {}
#[lang = "panic_fmt"] fn panic_fmt() -> ! { loop {} }
# // fn main() {} tricked you, rustdoc!
h?2 +QKTBH2` +m``2MiHv KF2b 72r bbmKTiBQMb #Qmi bvK#QHb r?B+? `2 pBH#H2 BM i?2 2t2@
+mi#H2 iQ +HHX LQ`KHHv i?2b2 7mM+iBQMb `2 T`QpB/2/ #v i?2 biM/`/ HB#``v- #mi rBi?Qmi Bi
vQm Kmbi /2}M2 vQm` QrMX
h?2 }`bi Q7 i?2b2 i?`22 7mM+iBQMb- stack_exhausted- Bb BMpQF2/ r?2M2p2` bi+F Qp2`~Qr Bb /2i2+i2/X
h?Bb 7mM+iBQM ?b MmK#2` Q7 `2bi`B+iBQMb #Qmi ?Qr Bi +M #2 +HH2/ M/ r?i Bi Kmbi /Q- #mi
B7 i?2 bi+F HBKBi `2;Bbi2` Bb MQi #2BM; KBMiBM2/ i?2M i?`2/ Hrvb ?b M BM}MBi2 bi+F
M/ i?Bb 7mM+iBQM b?QmH/Mi ;2i i`B;;2`2/X
h?2 b2+QM/ Q7 i?2b2 i?`22 7mM+iBQMb- eh_personality- Bb mb2/ #v i?2 7BHm`2 K2+?MBbKb Q7 i?2
+QKTBH2`X h?Bb Bb Q7i2M KTT2/ iQ :**b T2`bQMHBiv 7mM+iBQM Ub22 i?2 HB#bi/ BKTH2K2MiiBQMjd
jd ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/f`ifmMrBM/fBM/2tX?iKH
k8y
7Q` KQ`2 BM7Q`KiBQMV- #mi +`i2b r?B+? /Q MQi i`B;;2` TMB+ +M #2 bbm`2/ i?i i?Bb 7mM+iBQM
Bb M2p2` +HH2/X h?2 }MH 7mM+iBQM- panic_fmt- Bb HbQ mb2/ #v i?2 7BHm`2 K2+?MBbKb Q7 i?2
+QKTBH2`X
lbBM; HB#+Q`2
LQi2, i?2 +Q`2 HB#``vb bi`m+im`2 Bb mMbi#H2- M/ Bi Bb `2+QKK2M/2/ iQ mb2 i?2
biM/`/ HB#``v BMbi2/ r?2`2p2` TQbbB#H2X
qBi? i?2 #Qp2 i2+?MB[m2b- r2p2 ;Qi #`2@K2iH 2t2+mi#H2 `mMMBM; bQK2 _mbi +Q/2X h?2`2
Bb ;QQ/ /2H Q7 7mM+iBQMHBiv T`QpB/2/ #v i?2 biM/`/ HB#``v- ?Qr2p2`- i?i Bb M2+2bb`v iQ #2
T`Q/m+iBp2 BM _mbiX A7 i?2 biM/`/ HB#``v Bb MQi bm{+B2Mi- i?2M HB#+Q`2j3 Bb /2bB;M2/ iQ #2 mb2/
BMbi2/X
h?2 +Q`2 HB#``v ?b p2`v 72r /2T2M/2M+B2b M/ Bb Km+? KQ`2 TQ`i#H2 i?M i?2 biM/`/ HB#``v
Bib2H7X //BiBQMHHv- i?2 +Q`2 HB#``v ?b KQbi Q7 i?2 M2+2bb`v 7mM+iBQMHBiv 7Q` r`BiBM; B/BQKiB+
M/ 2z2+iBp2 _mbi +Q/2X
b M 2tKTH2- ?2`2 Bb T`Q;`K i?i rBHH +H+mHi2 i?2 /Qi T`Q/m+i Q7 irQ p2+iQ`b T`QpB/2/
7`QK *- mbBM; B/BQKiB+ _mbi T`+iB+2bX
#![feature(lang_items, start, no_std, core, libc)]
#![no_std]
# extern crate libc;
extern crate core;
use core::prelude::*;
use core::mem;
#[no_mangle]
pub extern fn dot_product(a: *const u32, a_len: u32,
b: *const u32, b_len: u32) -> u32 {
use core::raw::Slice;
// Convert the provided arrays into Rust slices.
// The core::raw module guarantees that the Slice
// structure has the same memory layout as a &[T]
// slice.
//
// This is an unsafe operation because the compiler
// cannot tell the pointers are valid.
let (a_slice, b_slice): (&[u32], &[u32]) = unsafe {
mem::transmute((
Slice { data: a, len: a_len as usize },
Slice { data: b, len: b_len as usize },
j3 ?iiT,ff/Q+X`mbi@HM;XQ`;f+Q`2fBM/2tX?iKH
eX9X ALh_ALaA*a
k8R
))
};
// Iterate over the slices, collecting the result
let mut ret = 0;
for (i, j) in a_slice.iter().zip(b_slice.iter()) {
ret += (*i) * (*j);
}
return ret;
}
#[lang = "panic_fmt"]
extern fn panic_fmt(args: &core::fmt::Arguments,
file: &str,
line: u32) -> ! {
loop {}
}
#[lang = "stack_exhausted"] extern fn stack_exhausted() {}
#[lang = "eh_personality"] extern fn eh_personality() {}
# #[start] fn start(argc: isize, argv: *const *const u8) -> isize { 0 }
# fn main() {}
LQi2 i?i i?2`2 Bb QM2 2ti` HM; Bi2K ?2`2 r?B+? /Bz2`b 7`QK i?2 2tKTH2b #Qp2- panic_fmtX
h?Bb Kmbi #2 /2}M2/ #v +QMbmK2`b Q7 HB#+Q`2 #2+mb2 i?2 +Q`2 HB#``v /2+H`2b TMB+b- #mi Bi
/Q2b MQi /2}M2 BiX h?2 panic_fmt HM; Bi2K Bb i?Bb +`i2b /2}MBiBQM Q7 TMB+- M/ Bi Kmbi #2
;m`Mi22/ iQ M2p2` `2im`MX
b +M #2 b22M BM i?Bb 2tKTH2- i?2 +Q`2 HB#``v Bb BMi2M/2/ iQ T`QpB/2 i?2 TQr2` Q7 _mbi BM
HH +B`+mKbiM+2b- `2;`/H2bb Q7 THi7Q`K `2[mB`2K2MibX 6m`i?2` HB#``B2b- bm+? b HB#HHQ+- //
7mM+iBQMHBiv iQ HB#+Q`2 r?B+? KF2 Qi?2` THi7Q`K@bT2+B}+ bbmKTiBQMb- #mi +QMiBMm2 iQ #2 KQ`2
TQ`i#H2 i?M i?2 biM/`/ HB#``v Bib2H7X
eX9
AMi`BMbB+b
LQi2, BMi`BMbB+b rBHH 7Q`2p2` ?p2 M mMbi#H2 BMi2`7+2- Bi Bb `2+QKK2M/2/ iQ mb2 i?2
bi#H2 BMi2`7+2b Q7 HB#+Q`2 `i?2` i?M BMi`BMbB+b /B`2+iHvX
h?2b2 `2 BKTQ`i2/ b B7 i?2v r2`2 66A 7mM+iBQMb- rBi? i?2 bT2+BH rust-intrinsic "AX 6Q`
2tKTH2- B7 QM2 rb BM 7`22biM/BM; +QMi2ti- #mi rBb?2/ iQ #2 #H2 iQ transmute #2ir22M ivT2bM/ T2`7Q`K 2{+B2Mi TQBMi2` `Bi?K2iB+- QM2 rQmH/ BKTQ`i i?Qb2 7mM+iBQMb pB /2+H`iBQM HBF2
# #![feature(intrinsics)]
# fn main() {}
extern "rust-intrinsic" {
fn transmute<T, U>(x: T) -> U;
k8k
eX8
unsafe
iQ +HHX
GM; Bi2Kb
LQi2, HM; Bi2Kb `2 Q7i2M T`QpB/2/ #v +`i2b BM i?2 _mbi /Bbi`B#miBQM- M/ HM; Bi2Kb
i?2Kb2Hp2b ?p2 M mMbi#H2 BMi2`7+2X Ai Bb `2+QKK2M/2/ iQ mb2 Q{+BHHv /Bbi`B#mi2/
+`i2b BMbi2/ Q7 /2}MBM; vQm` QrM HM; Bi2KbX
h?2 rustc +QKTBH2` ?b +2`iBM THm;;#H2 QT2`iBQMb- i?i Bb- 7mM+iBQMHBiv i?i BbMi ?`/@+Q/2/
BMiQ i?2 HM;m;2- #mi Bb BKTH2K2Mi2/ BM HB#``B2b- rBi? bT2+BH K`F2` iQ i2HH i?2 +QKTBH2` Bi
2tBbibX h?2 K`F2` Bb i?2 ii`B#mi2 #[lang = "..."] M/ i?2`2 `2 p`BQmb /Bz2`2Mi pHm2b Q7 ...BX2X p`BQmb /Bz2`2Mi HM; Bi2KbX
6Q` 2tKTH2- Box TQBMi2`b `2[mB`2 irQ HM; Bi2Kb- QM2 7Q` HHQ+iBQM M/ QM2 7Q` /2HHQ+iBQMX
7`22biM/BM; T`Q;`K i?i mb2b i?2 Box bm;` 7Q` /vMKB+ HHQ+iBQMb pB malloc M/ free,
#![feature(lang_items, box_syntax, start, no_std, libc)]
#![no_std]
extern crate libc;
extern {
fn abort() -> !;
}
#[lang = "owned_box"]
pub struct Box<T>(*mut T);
#[lang = "exchange_malloc"]
unsafe fn allocate(size: usize, _align: usize) -> *mut u8 {
let p = libc::malloc(size as libc::size_t) as *mut u8;
// malloc failed
if p as usize == 0 {
abort();
}
p
}
#[lang = "exchange_free"]
unsafe fn deallocate(ptr: *mut u8, _size: usize, _align: usize) {
libc::free(ptr as *mut libc::c_void)
}
k8j
#[start]
fn main(argc: isize, argv: *const *const u8) -> isize {
let x = box 1;
0
}
#[lang = "stack_exhausted"] extern fn stack_exhausted() {}
#[lang = "eh_personality"] extern fn eh_personality() {}
#[lang = "panic_fmt"] fn panic_fmt() -> ! { loop {} }
LQi2 i?2 mb2 Q7 abort, i?2 exchange_malloc HM; Bi2K Bb bbmK2/ iQ `2im`M pHB/ TQBMi2`- M/
bQ M22/b iQ /Q i?2 +?2+F BMi2`MHHvX
Pi?2` 72im`2b T`QpB/2/ #v HM; Bi2Kb BM+Hm/2,
Qp2`HQ/#H2 QT2`iQ`b pB i`Bib, i?2 i`Bib +Q``2bTQM/BM; iQ i?2 ==- <- /2`272`2M+BM; U*V
M/ + U2i+XV QT2`iQ`b `2 HH K`F2/ rBi? HM; Bi2Kbc i?Qb2 bT2+B}+ 7Qm` `2 eq- ord- derefM/ add `2bT2+iBp2HvX
bi+F mMrBM/BM; M/ ;2M2`H 7BHm`2c i?2 eh_personality- fail M/ fail_bounds_checks HM;
Bi2KbX
i?2 i`Bib BM std::marker mb2/ iQ BM/B+i2 ivT2b Q7 p`BQmb FBM/bc HM; Bi2Kb send- sync M/
copyX
i?2 K`F2` ivT2b M/ p`BM+2 BM/B+iQ`b 7QmM/ BM std::markerc HM; Bi2Kb covariant_typecontravariant_lifetime- 2i+X
GM; Bi2Kb `2 HQ/2/ HxBHv #v i?2 +QKTBH2`c 2X;X B7 QM2 M2p2` mb2b Box i?2M i?2`2 Bb MQ M22/ iQ
/2}M2 7mM+iBQMb 7Q` exchange_malloc M/ exchange_freeX rustc rBHH 2KBi M 2``Q` r?2M M Bi2K
Bb M22/2/ #mi MQi 7QmM/ BM i?2 +m``2Mi +`i2 Q` Mv i?i Bi /2T2M/b QMX
eXe
GBMF `;b
h?2`2 Bb QM2 Qi?2` rv iQ i2HH `mbi+ ?Qr iQ +mbiQKBx2 HBMFBM;- M/ i?i Bb pB i?2 link_args
ii`B#mi2X h?Bb ii`B#mi2 Bb TTHB2/ iQ extern #HQ+Fb M/ bT2+B}2b `r ~;b r?B+? M22/ iQ ;2i
Tbb2/ iQ i?2 HBMF2` r?2M T`Q/m+BM; M `iB7+iX M 2tKTH2 mb;2 rQmH/ #2,
#![feature(link_args)]
#[link_args = "-foo -bar -baz"]
extern {}
# fn main() {}
LQi2 i?i i?Bb 72im`2 Bb +m``2MiHv ?B//2M #2?BM/ i?2 feature(link_args) ;i2 #2+mb2 i?Bb Bb
MQi bM+iBQM2/ rv Q7 T2`7Q`KBM; HBMFBM;X _B;?i MQr `mbi+ b?2HHb Qmi iQ i?2 bvbi2K HBMF2`- bQ
Bi KF2b b2Mb2 iQ T`QpB/2 2ti` +QKKM/ HBM2 `;mK2Mib- #mi i?Bb rBHH MQi Hrvb #2 i?2 +b2X
k89
AM i?2 7mim`2 `mbi+ Kv mb2 GGoJ /B`2+iHv iQ HBMF MiBp2 HB#``B2b BM r?B+? +b2
?p2 MQ K2MBM;X
link_args
rBHH
Ai Bb ?B;?Hv `2+QKK2M/2/ iQ MQi mb2 i?Bb ii`B#mi2- M/ `i?2` mb2 i?2 KQ`2 7Q`KH #[link(...)]
ii`B#mi2 QM extern #HQ+Fb BMbi2/X
eXd
"2M+?K`F h2bib
_mbi bmTTQ`ib #2M+?K`F i2bib- r?B+? +M i2bi i?2 T2`7Q`KM+2 Q7 vQm` +Q/2X G2ib KF2 Qm`
src/lib.rs HQQF HBF2 i?Bb U+QKK2Mib 2HB/2/V,
#![feature(test)]
extern crate test;
pub fn add_two(a: i32) -> i32 {
a + 2
}
#[cfg(test)]
mod tests {
use super::*;
use test::Bencher;
#[test]
fn it_works() {
assert_eq!(4, add_two(2));
}
#[bench]
fn bench_add_two(b: &mut Bencher) {
b.iter(|| add_two(2));
}
}
LQi2 i?2
test
q2p2 BKTQ`i2/ i?2 test +`i2- r?B+? +QMiBMb Qm` #2M+?K`FBM; bmTTQ`iX q2 ?p2 M2r 7mM+@
iBQM b r2HH- rBi? i?2 bench ii`B#mi2X lMHBF2 `2;mH` i2bib- r?B+? iF2 MQ `;mK2Mib- #2M+?K`F
i2bib iF2 &mut BencherX h?Bb Bencher T`QpB/2b M iter K2i?Q/- r?B+? iF2b +HQbm`2X h?Bb
+HQbm`2 +QMiBMb i?2 +Q/2 r2/ HBF2 iQ #2M+?K`FX
q2 +M `mM #2M+?K`F i2bib rBi?
cargo bench,
$ cargo bench
Compiling adder v0.0.1 (file:///home/steve/tmp/adder)
Running target/release/adder-91b3e234d4ed382a
running 2 tests
k88
1 ns/iter (+/- 0)
Pm` MQM@#2M+?K`F i2bi rb B;MQ`2/X uQm Kv ?p2 MQiB+2/ i?i cargo bench iF2b #Bi HQM;2`
i?M cargo testX h?Bb Bb #2+mb2 _mbi `mMb Qm` #2M+?K`F MmK#2` Q7 iBK2b- M/ i?2M iF2b
i?2 p2`;2X "2+mb2 r2`2 /QBM; bQ HBiiH2 rQ`F BM i?Bb 2tKTH2- r2 ?p2 1 ns/iter (+/- 0)#mi i?Bb rQmH/ b?Qr i?2 p`BM+2 B7 i?2`2 rb QM2X
/pB+2 QM r`BiBM; #2M+?K`Fb,
JQp2 b2imT +Q/2 QmibB/2 i?2 iter HQQTc QMHv Tmi i?2 T`i vQm rMi iQ K2bm`2 BMbB/2
JF2 i?2 +Q/2 /Q i?2 bK2 i?BM; QM 2+? Bi2`iBQMc /Q MQi ++mKmHi2 Q` +?M;2 bii2
JF2 i?2 Qmi2` 7mM+iBQM B/2KTQi2Mi iQQc i?2 #2M+?K`F `mMM2` Bb HBF2Hv iQ `mM Bi KMv
iBK2b
JF2 i?2 BMM2` iter HQQT b?Q`i M/ 7bi bQ #2M+?K`F `mMb `2 7bi M/ i?2 +HB#`iQ` +M
/Dmbi i?2 `mM@H2M;i? i }M2 `2bQHmiBQM
JF2 i?2 +Q/2 BM i?2 iter HQQT /Q bQK2i?BM; bBKTH2- iQ bbBbi BM TBMTQBMiBM; T2`7Q`KM+2
BKT`Qp2K2Mib UQ` `2;`2bbBQMbV
:Qi+?, QTiBKBxiBQMb
h?2`2b MQi?2` i`B+Fv T`i iQ r`BiBM; #2M+?K`Fb, #2M+?K`Fb +QKTBH2/ rBi? QTiBKBxiBQMb
+iBpi2/ +M #2 /`KiB+HHv +?M;2/ #v i?2 QTiBKBx2` bQ i?i i?2 #2M+?K`F Bb MQ HQM;2`
#2M+?K`FBM; r?i QM2 2tT2+ibX 6Q` 2tKTH2- i?2 +QKTBH2` KB;?i `2+Q;MBx2 i?i bQK2 +H+mH@
iBQM ?b MQ 2ti2`MH 2z2+ib M/ `2KQp2 Bi 2MiB`2HvX
#![feature(test)]
extern crate test;
use test::Bencher;
#[bench]
fn bench_xor_1000_ints(b: &mut Bencher) {
b.iter(|| {
(0..1000).fold(0, |old, new| old ^ new);
});
}
0 ns/iter (+/- 0)
k8e
h?2 #2M+?K`FBM; `mMM2` Qz2`b irQ rvb iQ pQB/ i?BbX 1Bi?2`- i?2 +HQbm`2 i?i i?2 iter K2i?Q/
`2+2Bp2b +M `2im`M M `#Bi``v pHm2 r?B+? 7Q`+2b i?2 QTiBKBx2` iQ +QMbB/2` i?2 `2bmHi mb2/ M/
2Mbm`2b Bi +MMQi `2KQp2 i?2 +QKTmiiBQM 2MiB`2HvX h?Bb +QmH/ #2 /QM2 7Q` i?2 2tKTH2 #Qp2
#v /DmbiBM; i?2 b.iter +HH iQ
b.iter(|| {
// note lack of `;` (could also use an explicit `return`).
(0..1000).fold(0, |old, new| old ^ new)
});
P`- i?2 Qi?2` QTiBQM Bb iQ +HH i?2 ;2M2`B+ test::black_box 7mM+iBQM- r?B+? Bb M QT[m2 #H+F
#Qt iQ i?2 QTiBKBx2` M/ bQ 7Q`+2b Bi iQ +QMbB/2` Mv `;mK2Mi b mb2/X
#![feature(test)]
extern crate test;
b.iter(|| {
let n = test::black_box(1000);
(0..n).fold(0, |a, b| a ^ b)
})
L2Bi?2` Q7 i?2b2 `2/ Q` KQ/B7v i?2 pHm2- M/ `2 p2`v +?2T 7Q` bKHH pHm2bX G`;2` pHm2b +M
#2 Tbb2/ BM/B`2+iHv iQ `2/m+2 Qp2`?2/ U2X;X black_box(&huge_struct)VX
S2`7Q`KBM; 2Bi?2` Q7 i?2 #Qp2 +?M;2b ;Bp2b i?2 7QHHQrBM; #2M+?K`FBM; `2bmHib
running 1 test
test bench_xor_1000_ints ... bench:
>Qr2p2`- i?2 QTiBKBx2` +M biBHH KQ/B7v i2bi+b2 BM M mM/2bB`#H2 KMM2` 2p2M r?2M mbBM;
2Bi?2` Q7 i?2 #Qp2X
eX3
*m``2MiHv i?2 QMHv bi#H2 rv iQ +`2i2 Box Bb pB i?2 Box::new K2i?Q/X HbQ Bi Bb MQi TQbbB#H2
BM bi#H2 _mbi iQ /2bi`m+im`2 Box BM Ki+? Tii2`MX h?2 mMbi#H2 box F2vrQ`/ +M #2 mb2/
iQ #Qi? +`2i2 M/ /2bi`m+im`2 BoxX M 2tKTH2 mb;2 rQmH/ #2,
#![feature(box_syntax, box_patterns)]
fn main() {
let b = Some(box 5);
match b {
k8d
LQi2 i?i i?2b2 72im`2b `2 +m``2MiHv ?B//2M #2?BM/ i?2 box_syntax U#Qt +`2iBQMV M/ box_patterns U/2bi`m+im`BM; M/ Tii2`M Ki+?BM;V ;i2b #2+mb2 i?2 bvMit Kv biBHH +?M;2 BM i?2
7mim`2X
eX3XR
_2im`MBM; SQBMi2`b
AM KMv HM;m;2b rBi? TQBMi2`b- vQm/ `2im`M TQBMi2` 7`QK 7mM+iBQM bQ b iQ pQB/ +QTvBM;
H`;2 /i bi`m+im`2X 6Q` 2tKTH2,
struct BigStruct {
one: i32,
two: i32,
// etc
one_hundred: i32,
}
fn foo(x: Box<BigStruct>) -> Box<BigStruct> {
Box::new(*x)
}
fn main() {
let x = Box::new(BigStruct {
one: 1,
two: 2,
one_hundred: 100,
});
let y = foo(x);
}
h?2 B/2 Bb i?i #v TbbBM; `QmM/ #Qt- vQm`2 QMHv +QTvBM; TQBMi2`- `i?2` i?M i?2 ?mM/`2/
intb i?i KF2 mT i?2 BigStructX
h?Bb Bb M MiBTii2`M BM _mbiX AMbi2/- r`Bi2 i?Bb,
k83
#![feature(box_syntax)]
struct BigStruct {
one: i32,
two: i32,
// etc
one_hundred: i32,
}
fn foo(x: Box<BigStruct>) -> BigStruct {
*x
}
fn main() {
let x = Box::new(BigStruct {
one: 1,
two: 2,
one_hundred: 100,
});
let y: Box<BigStruct> = box foo(x);
}
eXN
aHB+2 Sii2`Mb
&
rBi? i?2
slice_patterns
72im`2,
#![feature(slice_patterns)]
fn main() {
let v = vec!["match_this", "1"];
match &v[..] {
["match_this", second] => println!("The second element is {}", second),
_ => {},
}
}
k8N
h?2 advanced_slice_patterns ;i2 H2ib vQm mb2 .. iQ BM/B+i2 Mv MmK#2` Q7 2H2K2Mib BMbB/2
Tii2`M Ki+?BM; bHB+2X h?Bb rBH/+`/ +M QMHv #2 mb2/ QM+2 7Q` ;Bp2M ``vX A7 i?2`2b M
B/2MiB}2` #27Q`2 i?2 ..- i?2 `2bmHi Q7 i?2 bHB+2 rBHH #2 #QmM/ iQ i?i MK2X 6Q` 2tKTH2,
#![feature(advanced_slice_patterns, slice_patterns)]
fn is_symmetric(list: &[u32]) -> bool {
match list {
[] | [_] => true,
[x, inside.., y] if x == y => is_symmetric(inside),
_ => false
}
}
fn main() {
let sym = &[0, 1, 4, 2, 4, 1, 0];
assert!(is_symmetric(sym));
let not_sym = &[0, 1, 7, 2, 4, 1, 0];
assert!(!is_symmetric(not_sym));
}
eXRy
bbQ+Bi2/ *QMbiMib
qBi? i?2
associated_consts
#![feature(associated_consts)]
trait Foo {
const ID: i32;
}
impl Foo for i32 {
const ID: i32 = 1;
}
fn main() {
assert_eq!(1, i32::ID);
}
Mv BKTH2K2MiQ` Q7
Foo
#![feature(associated_consts)]
trait Foo {
const ID: i32;
}
IDX
key
;Bp2b
error: not all trait items implemented, missing: `ID` [E0046]
impl Foo for i32 {
}
b vQm +M b22- r?2M BKTH2K2MiBM; Foo- vQm +M H2p2 Bi mMBKTH2K2Mi2/- b rBi?
i?2M mb2 i?2 /27mHi pHm2X "mi- b BM i64- r2 +M HbQ // Qm` QrM /2}MBiBQMX
bbQ+Bi2/ +QMbiMib /QMi ?p2 iQ #2 bbQ+Bi2/ rBi? i`BiX M
}M2 iQQ,
#![feature(associated_consts)]
struct Foo;
impl Foo {
pub const FOO: u32 = 3;
}
impl
#HQ+F 7Q`
i32X
Ai rBHH
struct
rQ`Fb
:HQbb`v
LQi 2p2`v _mbi+2M ?b #+F;`QmM/ BM bvbi2Kb T`Q;`KKBM;- MQ` BM +QKTmi2` b+B2M+2- bQ
r2p2 //2/ 2tTHMiBQMb Q7 i2`Kb i?i KB;?i #2 mM7KBHB`X
`Biv `Biv `272`b iQ i?2 MmK#2` Q7 `;mK2Mib 7mM+iBQM Q` QT2`iBQM iF2bX
let x = (2, 3);
let y = (4, 6);
let z = (8, 2, 6);
M/
?p2 `Biv kX
?b `Biv jX
#bi`+i avMit h`22 q?2M +QKTBH2` Bb +QKTBHBM; vQm` T`Q;`K- Bi /Q2b MmK#2` Q7
/Bz2`2Mi i?BM;bX PM2 Q7 i?2 i?BM;b i?i Bi /Q2b Bb im`M i?2 i2ti Q7 vQm` T`Q;`K BMiQ M #bi`+i
bvMit i`22- Q`ahX h?Bb i`22 Bb `2T`2b2MiiBQM Q7 i?2 bi`m+im`2 Q7 vQm` T`Q;`KX 6Q` 2tKTH22 + 3 +M #2 im`M2/ BMiQ i`22,
+
/ \
2
M/
2 + (3 * 4)
+
/ \
2
*
/ \
3
kek
*>Sh1_ dX :GPaa_u
+/2KB+ _2b2`+?
M BM+QKTH2i2 HBbi Q7 TT2`b i?i ?p2 ?/ bQK2 BM~m2M+2 BM _mbiX
_2+QKK2M/2/ 7Q` BMbTB`iBQM M/ #2ii2` mM/2`biM/BM; Q7 _mbib #+F;`QmM/X
hvT2 bvbi2K
*QM+m``2M+v
aBM;mH`Biv, `2i?BMFBM; i?2 bQ7ir`2 bi+FRy
R ?iiT,ffkyNXe3X9kXRjdfm+b/@T;2bf*Qm`b2bf+b2kkdXryjf?M/Qmibf+v+HQM2@`2;BQMbXT/7
k ?iiT,ffrrrX+bXmK/X2/mfT`QD2+ibfSGf+v+HQM2fb+TXT/7
j ?iiT,ffrrrXTbXmMB@b#X/2f+Qm`b2bfivT2M@rbNNf+HbbXTbX;x
9 ?iiTb,ffrrrX+bXmi?X2/mfTHifTm#HB+iBQMbfD7TRk@/`7i@7+/7XT/7
8 ?iiT,ffb+;XmMB#2X+?f`+?Bp2fTT2`bfa+?yjh`BibXT/7
e ?iiT,ffrrrX+bXmrKX2/mf7+mHivf#QvHM/fTT2`bfmMB[m2@T`2T`BMiXTb
d ?iiT,ffrrrX+QKTmiBM;b+B2M+2XMHf`2b2`+?fi2+?`2Tbf`2TQf*a@kyykfkyyk@y93XT/7
3 ?iiTb,ff`2b2`+?XKB+`QbQ7iX+QKfTm#bfRdy8k3fKb`@i`@kyRk@dNXT/7
N ?iiT,ffrrrX+bXm+HX2/mfTHb#2`;fi#fTT2`bfiQ7i2@iHTBM@BM/+NdXT/7
Ry ?iiTb,ff`2b2`+?XKB+`QbQ7iX+QKfTm#bfeN9jRfQb`kyydn`2i?BMFBM;bQ7ir`2bi+FXT/7
ke9
Pi?2`b
*`b?@QMHv bQ7ir`2k8
*QKTQbBM; >B;?@S2`7Q`KM+2 J2KQ`v HHQ+iQ`bke
_2+QMbB/2`BM; *mbiQK J2KQ`v HHQ+iBQMkd
ST2`b #Qmi _mbi
:Sl T`Q;`KKBM; BM _mbik3
S`HH2H +HQbm`2b, M2r irBbi QM M QH/ B/2kN @ MQi 2t+iHv #Qmi `mbi- #mi #v MKibFBb
RR ?iiTb,ff`2b2`+?XKB+`QbQ7iX+QKfTm#bfed93kfbBM;b?`TXT/7
Rk ?iiT,ffbmT2`i2+?X+bBHXKBiX2/mfTT2`bfbi2HXT/7
Rj ?iiT,ffrrrX22+BbXm/2HX2/mfWd1+pxQbf+Bb+3dN@bT`BM;kyy3fTT2`bf`Q`N3i?`2/XT/7
R9 ?iiT,ffrrrXH//BMX+bX+KmX2/mfTT2`bfT/7bfvkyyyfHQ+HBivnbTyyXT/7
R8 ?iiT,ff+Bi2b22`tXBbiXTbmX2/mfpB2r/Q+f/QrMHQ/\/QB4RyXRXRXRdyXRyNd`2T4`2TRivT24T/7
Re ?iiT,ffrrrX+bX`B+2X2/mfWd1v;mQfTm#bfSA.3k9N9jXT/7
Rd ?iiT,ffrrrX+QQTbQ7iX+QKf`f*HKBiv`iB+H2X?iKH
R3 ?iiT,ffrrrX2+2X`mi;2`bX2/mfWd1T`b?`f*Hbb2bf2+28dk@TT2`bfy8fTb@Qmbi2`?QmiXT/7
RN ?iiT,ffrrrX#H;Q/m`QpXM2if7BH2bf3@#H;Q/m`QpXT/7
ky ?iiT,ffrrrX+b2XQ?BQ@bii2X2/mf?T+bfqqqf>hJGfTm#HB+iBQMbfTT2`bfh_@Rk@RXT/7
kR ?iiT,ffrrrXmT+`+XBHHBMQBbX2/mfrQ`Fb?QTbfT`THQTRyfTT2`bfT`THQTRynbm#KBbbBQMn3XT/7
kk ?iiT,ffrrrX+bX#;mX+XBHfWd1?2M/H2`/fTT2`bfTk3y@?2M/H2`XT/7
kj ?iiT,ffrrrXKTB@brbXQ`;fim`QMf`2;2MibXT/7
k9 ?iiTb,ffrrrX+bX`Q+?2bi2`X2/mfmfb+QiifTT2`bfRNNRnhP*anbvM+?XT/7
k8 ?iiTb,ffrrrXmb2MBtXQ`;fH2;+vf2p2Mibf?QiQbyjfi2+?f7mHHnTT2`bf+M/2f+M/2XT/7
ke ?iiT,ffT2QTH2X+bXmKbbX2/mf2K2`vfTm#bf#2`;2`@TH/BkyyRXT/7
kd ?iiT,ffT2QTH2X+bXmKbbX2/mf2K2`vfTm#bf#2`;2`@QQTbHkyykXT/7
k3 ?iiT,ffrrrX+bXBM/BMX2/mf2?QHFfTT2`bf?BTbkyRjXT/7
kN ?iiTb,ffrrrXmb2MBtXQ`;f+QM72`2M+2f?QiT`RkfT`HH2H@+HQbm`2b@M2r@irBbi@QH/@B/2