You are on page 1of 264

h?

2 _mbi S`Q;`KKBM; GM;m;2


h?2 _mbi h2K
kyR8@y8@R8

*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

 #`B27 BMi`Q/m+iBQM iQ _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

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

:2M2`iBM;  b2+`2i MmK#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

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

_mbi BMbB/2 Qi?2` HM;m;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

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

h?2 ai+F M/ i?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

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

`;mK2Mib M/ #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

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

q?i /Q Qi?2` HM;m;2b /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

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

1``Q` >M/HBM; X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Ryy

9Xk

9Xj

9X3

9XdXR

6BHm`2 pbX SMB+ X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X RyR

9XdXk

>M/HBM; 2``Q`b rBi?

9XdXj

LQM@`2+Qp2`#H2 2``Q`b rBi?

9XdX9

lT;`/BM; 7BHm`2b iQ TMB+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 Ry9

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

*`2iBM;  b72 BMi2`7+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 Ryd

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

*HH#+Fb 7`QK * +Q/2 iQ _mbi 7mM+iBQMb X X X X X X X X X X X X X X X X X X X RyN

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

lMb72 #HQ+Fb X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X RRj

*PLh1Lha

9X3Xd

++2bbBM; 7Q`2B;M ;HQ#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 RRj

9X3X3

6Q`2B;M +HHBM; +QMp2MiBQMb X X X X X X X X X X X X X X X X X X X X X X X X X X RR9

9X3XN

AMi2`QT2`#BHBiv rBi? 7Q`2B;M +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 RR8

9X3XRy h?2 MmHH#H2 TQBMi2` QTiBKBxiBQM X X X X X X X X X X X X X X X X X X X X X RR8


9X3XRR *HHBM; _mbi +Q/2 7`QK * X X X X X X X X X X X X X X X X X X X X X X X X X X X RR8
9XN

"Q``Qr M/ 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 RRe


9XNXR

"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

q?B+? b?QmH/ A 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 RRd

9XRy _2H2b2 *?MM2Hb X X X X X X X X X X X X 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


9XRyXR Pp2`pB2r X X X X X X X X X X X X 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
9XRyXk *?QQbBM;  p2`bBQM X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X RR3
9XRyXj >2HTBM; i?2 2+Qbvbi2K i?`Qm;? *A X X X X X X X X X X X X X X X X X X X X X X RR3
8 avMit M/ a2KMiB+b

RRN

8XR

o`B#H2 "BM/BM;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 RRN

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

S`BKBiBp2 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 Rke


8XjXR

"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

LmK2`B+ ivT2b X X X X X X X X X 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

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

7Q` HQQTb X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Rjj

8Xd

r?BH2 HQQTb X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Rjj

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

JQp2 b2KMiB+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 Rje

X X X X X X X X X X X 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

JQ`2 i?M QrM2`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 Rj3

_272`2M+2b M/ "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 Rj3


8XNXR

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

Kmi `272`2M+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 R9y

8XNX9

h?2 _mH2b X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X R9R

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

8XRyXR 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 R98


8XRyXk 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 R9e
8XRR Jmi#BHBiv X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X R8y
8XRRXR AMi2`BQ` pbX 1ti2`BQ` Jmi#BHBiv X X X X X X X X X X X X X X X X X X X X X X X X R8R
8XRk ai`m+ib X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X R8j
8XRkXR lT/i2 bvMit X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X R89
8XRkXk hmTH2 bi`m+ib X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X R88
8XRkXj lMBi@HBF2 bi`m+ib X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X R8e
8XRj 1MmKb X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X R8e
8XR9 Ji+? X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X R8d
8XR9XR Ji+?BM; QM 2MmKb X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X R83
8XR8 Sii2`Mb X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X R8N
8XR8XR JmHiBTH2 Tii2`Mb X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X R8N
8XR8Xk _M;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 Rey

8XR8Xj "BM/BM;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 Rey


8XR8X9 A;MQ`BM; p`BMib X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X ReR
8XR8X8 :m`/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 ReR
8XR8Xe `27 M/ `27 Kmi X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Rek
8XR8Xd .2bi`m+im`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 X X X X Rek
8XR8X3 JBt M/ Ji+? X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Rej
8XRe J2i?Q/ avMit X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Re9
8XReXR J2i?Q/ +HHb X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Re9
8XReXk *?BMBM; K2i?Q/ +HHb X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Re8
8XReXj bbQ+Bi2/ 7mM+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 Ree
8XReX9 "mBH/2` Sii2`M X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Ree
8XRd o2+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 Re3

*PLh1Lha

8XR3 ai`BM;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 X ReN


8XRN :2M2`B+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 RdR
8Xky h`Bib X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Rdj
8XkyXR JmHiBTH2 i`Bi #QmM/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 Rdd
8XkyXk q?2`2 +Hmb2 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X Rdd
8XkyXj AM?2`BiM+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 X X X X X X R3y
8XkR .`QT X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X R3y
8Xkk B7 H2i X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X R3k
8Xkj h`Bi P#D2+ib X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X R3j
8Xk9 *HQbm`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 X X X R33
8Xk9XR avMit X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X R33
8Xk9Xk *HQbm`2b M/ i?2B` 2MpB`QMK2Mi X X X X X X X X X X X X X X X X X X X X X X X X R3N
8Xk9Xj *HQbm`2 BKTH2K2MiiBQM X X X X X X X X X X X X X X X X X X X X X X X X X X X X RNR
8Xk9X9 hFBM; +HQbm`2b b `;mK2Mib X X X X X X X X X X X X X X X X X X X X X X X X X RNk
8Xk9X8 _2im`MBM; +HQbm`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 RNj
8Xk8 lMBp2`bH 6mM+iBQM *HH avMit X X X X X X X X X X X X X X X X X X X X X X X X X X X X RNe
8Xk8XR M;H2@#`+F2i 6Q`K X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X RNd
8Xke *`i2b M/ JQ/mH2b X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X RN3
8XkeXR "bB+ i2`KBMQHQ;v, *`i2b M/ JQ/mH2b X X X X X X X X X X X X X X X X X X X RN3
8XkeXk .2}MBM; JQ/mH2b X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X RNN
8XkeXj JmHiBTH2 }H2 +`i2b X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X kyy
8XkeX9 AKTQ`iBM; 1ti2`MH *`i2b X X X X X X X X X X X X X X X X X X X X X X X X X X X kyk
8XkeX8 1tTQ`iBM;  Sm#HB+ AMi2`7+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 kyj
8XkeXe AKTQ`iBM; JQ/mH2b rBi?
8Xkd

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

8XkdXj q?B+? +QMbi`m+i b?QmH/ A 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 ky3


8Xk3 ii`B#mi2b X X X X X X X X X X X X X X X X 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
8XkN

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

8Xjy *biBM; #2ir22M ivT2b X X X X X X X X X 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


8XjyXR

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

8Xj8X3 h?2 /22T 2M/ X X X X X X X X X X 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


8Xj8XN *QKKQM 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 kjR
8Xj8XRy S`Q+2/m`H 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 kjj
8Xje _r SQBMi2`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 kjj
8XjeXR "bB+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 kj9
8XjeXk 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 kj8
8XjeXj _272`2M+2b M/ `r TQBMi2`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 kj8
8Xjd

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

8XjdXR q?i /Q2b b72 K2M\ X X X X X X X X X X X X X X X X X X X X X X X X X X X X kje


8XjdXk lMb72 amT2`TQr2`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 kjd
e LB;?iHv _mbi
eXR

kjN

*QKTBH2` SHm;BMb X X X X X X X X X X X X 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


eXRXR

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

avMit 2ti2MbBQMb X X X X X X X 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

eXRXj

GBMi THm;BMb X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X k99

eXk

AMHBM2 bb2K#Hv X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X k98

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

GM; Bi2Kb X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X k8k

eXe

GBMF `;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 k8j

*PLh1Lha

eXd

"2M+?K`F h2bib X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X k89

eX3

"Qt avMit M/ Sii2`Mb X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X k8e


eX3XR

eXN

_2im`MBM; SQBMi2`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 k8d

aHB+2 Sii2`Mb X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X k83

eXRy bbQ+Bi2/ *QMbiMib X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X k8N


d :HQbb`v

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

 #`B27 BMi`Q/m+iBQM iQ _mbi

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

RXkX  "_A16 ALh_P.l*hAPL hP _lah

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

error: cannot borrow `x` as mutable because it is also borrowed as immutable


x.push("foo");
^
note: previous borrow of `x` occurs here; the immutable borrow prevents
subsequent moves or mutable borrows of `x` until the borrow ends
let y = &x[0];
^
note: previous borrow ends here
fn main() {
}
^

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");
}

q2 +`2i2/ M BMM2` b+QT2 rBi? M //BiBQMH b2i Q7 +m`Hv #`+2bX


r2 +HH push()- M/ bQ r2`2 HH ;QQ/X

rBHH ;Q Qmi Q7 b+QT2 #27Q`2

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

*>Sh1_ kX :1hhAL: ah_h1.

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

A7 vQm mb2/ i?2 qBM/Qrb BMbiHH2`- Dmbi `2@`mM i?2

.msi

M/ Bi rBHH ;Bp2 vQm M mMBMbiHH QTiBQMX

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)

A7 vQm /B/- _mbi ?b #22M BMbiHH2/ bm++2bb7mHHv5 *QM;`ib5


h?Bb BMbiHH2` HbQ BMbiHHb  +QTv Q7 i?2 /Q+mK2MiiBQM HQ+HHv- bQ vQm +M `2/ Bi Q|BM2X PM
lLAs bvbi2Kb- /usr/local/share/doc/rust Bb i?2 HQ+iBQMX PM qBM/Qrb- Bib BM  share/doc
/B`2+iQ`v- BMbB/2 r?2`2p2` vQm BMbiHH2/ _mbi iQX
A7 MQi- i?2`2 `2  MmK#2` Q7 TH+2b r?2`2 vQm +M ;2i ?2HTX h?2 2bB2bi Bb i?2 O`mbi A_* +?MM2H
QM B`+XKQxBHHXQ`;e - r?B+? vQm +M ++2bb i?`Qm;? JB##Bid X *HB+F i?i HBMF- M/ vQmHH #2 +?iiBM;
rBi? Qi?2` _mbi+2Mb U bBHHv MB+FMK2 r2 +HH Qm`b2Hp2bV- M/ r2 +M ?2HT vQm QmiX Pi?2` ;`2i
`2bQm`+2b BM+Hm/2 i?2 mb2`b 7Q`mK3 - M/ ai+F Pp2`~QrN X
9 ?iiTb,ff;Bi?m#X+QKf`mbi@HM;f`mbiO#mBH/BM;@7`QK@bQm`+2
8 ?iiT,ffrrrX`mbi@HM;XQ`;fBMbiHHX?iKH
e B`+,ffB`+XKQxBHHXQ`;fO`mbi

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

kXkX >1GGP- qP_G.5

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!

am++2bb5 G2ib ;Q Qp2` r?i Dmbi ?TT2M2/ BM /2iBHX


Ry ?iiTb,ff;Bi?m#X+QKfQF2bfaQHB/PF

RR ?iiTb,ff;Bi?m#X+QKf`mbi@HM;f`mbif#HQ#fKbi2`fb`+f2i+f*PL6A:aXK/

R3

*>Sh1_ kX :1hhAL: ah_h1.

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/

kXjX >1GGP- *_:P5

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

2ti2MbBQM- M/ i?2 2t2+mi#H2 Umain.exe

# or main.exe on Windows

h?Bb T`BMib Qmi Qm`

Hello, world!

i2ti iQ Qm` i2`KBMHX

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

*>Sh1_ kX :1hhAL: ah_h1.

*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

+QM};m`iBQM }H2- M/

$ 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

kXjX >1GGP- *_:P5

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,

cargo build --release

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

*>Sh1_ kX :1hhAL: ah_h1.

$ cargo new hello_world --bin

q2`2 TbbBM;
H2p2 Bi QzX

--bin

#2+mb2 r2`2 KFBM;  #BM`v T`Q;`K, B7 r2 r2`2 KFBM;  HB#``v- r2/

G2ib +?2+F Qmi r?i *`;Q ?b ;2M2`i2/ 7Q` mb,


$ cd hello_world
$ tree .
.
Cargo.toml
src
main.rs
1 directory, 2 files

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

q2 Tbb i?2 MK2 Q7 Qm` T`QD2+i iQ


#BM`v- `i?2` i?M  HB#``vX
*?2+F Qmi i?2 ;2M2`i2/

Cargo.toml,

cargo new-

M/ i?2M i?2

--bin

~;- bBM+2 r2`2 KFBM; 

k9

*>Sh1_ jX G1_L _lah

[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!")
}

G2ib i`v +QKTBHBM; r?i *`;Q ;p2 mb,


$ cargo build
Compiling guessing_game v0.0.1 (file:///home/you/projects/guessing_game)

1t+2HH2Mi5 PT2M mT vQm`

src/main.rs

;BMX q2HH #2 r`BiBM; HH Q7 Qm` +Q/2 BM i?Bb }H2X

"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

jXRXk S`Q+2bbBM;  :m2bb


G2ib ;2i iQ Bi5 h?2 }`bi i?BM; r2 M22/ iQ /Q 7Q` Qm` ;m2bbBM; ;K2 Bb HHQr Qm` THv2` iQ BMTmi
 ;m2bbX Smi i?Bb BM vQm` src/main.rs,
use std::io;
fn main() {
println!("Guess the number!");
println!("Please input your guess.");
let mut guess = String::new();

jXRX :l1aaAL: :J1

k8

io::stdin().read_line(&mut guess)
.ok()
.expect("Failed to read line");
println!("You guessed: {}", guess);
}

h?2`2b  HQi ?2`25 G2ib ;Q Qp2` Bi- #Bi #v #BiX


use std::io;

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

*>Sh1_ jX G1_L _lah

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

jXRX :l1aaAL: :J1

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

*>Sh1_ jX G1_L _lah

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

jXRXj :2M2`iBM;  b2+`2i MmK#2`


L2ti- r2 M22/ iQ ;2M2`i2  b2+`2i MmK#2`X _mbi /Q2b MQi v2i BM+Hm/2 `M/QK MmK#2` 7mM+iBQM@
HBiv BM Bib biM/`/ HB#``vX h?2 _mbi i2K /Q2b- ?Qr2p2`- T`QpB/2  rand +`i2Ry X  +`i2 Bb
 T+F;2 Q7 _mbi +Q/2X q2p2 #22M #mBH/BM;  #BM`v +`i2- r?B+? Bb M 2t2+mi#H2X rand Bb 
HB#``v +`i2- r?B+? +QMiBMb +Q/2 i?ib BMi2M/2/ iQ #2 mb2/ rBi? Qi?2` T`Q;`KbX
lbBM; 2ti2`MH +`i2b Bb r?2`2 *`;Q `2HHv b?BM2bX "27Q`2 r2 +M r`Bi2 i?2 +Q/2 mbBM;
M22/ iQ KQ/B7v Qm` Cargo.tomlX PT2M Bi mT- M/ // i?2b2 72r HBM2b i i?2 #QiiQK,

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

jXRX :l1aaAL: :J1

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)

UuQm Kv b22 /Bz2`2Mi p2`bBQMb- Q7 +Qm`b2XV


GQib Q7 M2r QmiTmi5 LQr i?i r2 ?p2 M 2ti2`MH /2T2M/2M+v- *`;Q 72i+?2b i?2 Hi2bi p2`bBQMb
Q7 2p2`vi?BM; 7`QK i?2 `2;Bbi`v- r?B+? Bb  +QTv Q7 /i 7`QK *`i2bXBQRj X *`i2bXBQ Bb r?2`2
T2QTH2 BM i?2 _mbi 2+Qbvbi2K TQbi i?2B` QT2M bQm`+2 _mbi T`QD2+ib 7Q` Qi?2`b iQ mb2X
7i2` mT/iBM; i?2 `2;Bbi`v- *`;Q +?2+Fb Qm` [dependencies] M/ /QrMHQ/b Mv r2 /QMi ?p2
v2iX AM i?Bb +b2- r?BH2 r2 QMHv bB/ r2 rMi2/ iQ /2T2M/ QM rand- r2p2 HbQ ;`##2/  +QTv Q7
libcX h?Bb Bb #2+mb2 rand /2T2M/b QM libc iQ rQ`FX 7i2` /QrMHQ/BM; i?2K- Bi +QKTBH2b i?2KM/ i?2M +QKTBH2b Qm` T`QD2+iX
A7 r2 `mM

cargo build

;BM- r2HH ;2i /Bz2`2Mi QmiTmi,

$ 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

*>Sh1_ jX G1_L _lah

/B`2+iHvX q?2M r2 /Q- i?2 M2ti iBK2 r2


M/ `2@2pHmi2 Qm` rand `2[mB`2K2MibX
Cargo.toml

cargo build-

*`;Q rBHH mT/i2 i?2 BM/2t

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

>2`2b Qm` M2ti bi2T,

extern crate rand;


use std::io;
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");
println!("You guessed: {}", guess);
}

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

jXRX :l1aaAL: :J1

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

*>Sh1_ jX G1_L _lah

let mut guess = String::new();


io::stdin().read_line(&mut guess)
.ok()
.expect("failed to read line");
println!("You guessed: {}", guess);
match guess.cmp(&secret_number) {
Ordering::Less

=> println!("Too small!"),

Ordering::Greater => println!("Too big!"),


Ordering::Equal

=> println!("You win!"),

}
}

 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

=> println!("Too small!"),

Ordering::Greater => println!("Too big!"),


Ordering::Equal

=> println!("You win!"),

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,
}

qBi? i?Bb /2}MBiBQM- Mvi?BM; Q7 ivT2 Foo +M #2 2Bi?2` 


iQ BM/B+i2 i?2 MK2bT+2 7Q`  T`iB+mH` enum p`BMiX

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

=> println!("Too small!"),

Ordering::Greater => println!("Too big!"),


Ordering::Equal

=> println!("You win!"),

}
Re ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/f+KTf2MmKXP`/2`BM;X?iKH

jXRX :l1aaAL: :J1

jj

A7 Bib Less- r2 T`BMi Too small!- B7 Bib


mb27mH- M/ Bb mb2/ Q7i2M BM _mbiX

Greater- Too big!-

M/ B7

Equal- You win!X match

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) {
^~~~~~~~~~~~~~

error: aborting due to previous error


Could not compile `guessing_game`.

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

*>Sh1_ jX G1_L _lah


let guess: u32 = guess.trim().parse()
.ok()
.expect("Please type a number!");
println!("You guessed: {}", guess);
match guess.cmp(&secret_number) {
Ordering::Less

=> println!("Too small!"),

Ordering::Greater => println!("Too big!"),


Ordering::Equal

=> println!("You win!"),

}
}

h?2 M2r i?`22 HBM2b,


let guess: u32 = guess.trim().parse()
.ok()
.expect("Please type a number!");

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

iQ M 2tT`2bbBQM i?i HQQFb HBF2 bQK2i?BM; r2 r`Qi2 2`HB2`,

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

jXRX :l1aaAL: :J1

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

F2vrQ`/ ;Bp2b mb M BM}MBi2 HQQTX G2ib // i?i BM,

loop

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)
.ok()
.expect("failed to read line");
let guess: u32 = guess.trim().parse()
.ok()
.expect("Please type a number!");
println!("You guessed: {}", guess);
match guess.cmp(&secret_number) {

je

*>Sh1_ jX G1_L _lah


Ordering::Less

=> println!("Too small!"),

Ordering::Greater => println!("Too big!"),


Ordering::Equal

=> println!("You win!"),

}
}
}

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 {

jXRX :l1aaAL: :J1

jd

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 = guess.trim().parse()
.ok()
.expect("Please type a number!");
println!("You guessed: {}", guess);
match guess.cmp(&secret_number) {
Ordering::Less

=> println!("Too small!"),

Ordering::Greater => println!("Too big!"),


Ordering::Equal

=> {

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

*>Sh1_ jX G1_L _lah


.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!("Too small!"),

Ordering::Greater => println!("Too big!"),


Ordering::Equal

=> {

println!("You win!");
break;
}
}
}
}

h?2b2 `2 i?2 HBM2b i?i +?M;2/,


let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};

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!

jXRX :l1aaAL: :J1

jN

Please input your guess.


99
You guessed: 99
Too big!
Please input your guess.
foo
Please input your guess.
61
You guessed: 61
You win!

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!("Too small!"),

Ordering::Greater => println!("Too big!"),


Ordering::Equal

=> {

println!("You win!");
break;
}

9y

*>Sh1_ jX G1_L _lah


}
}

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

 T?BHQbQT?2` TB+Fb mT i?2 7Q`F QM i?2B` H27iX


h?2v i?2M TB+F mT i?2 7Q`F QM i?2B` `B;?iX
h?2v 2iX
h?2v `2im`M i?2 7Q`FbX

LQr- H2ib BK;BM2 i?Bb b2[m2M+2 Q7 2p2Mib,


RN ?iiT,ffrrrXmbBM;+bTX+QKf+bT#QQFXT/7

jXkX .ALAL: S>AGPaPS>1_a


RX
kX
jX
9X
8X
eX

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

i?2 H;Q`Bi?K- TB+FBM; mT i?2


i?2 H;Q`Bi?K- TB+FBM; mT i?2
i?2 H;Q`Bi?K- TB+FBM; mT i?2
i?2 H;Q`Bi?K- TB+FBM; mT i?2
i?2 H;Q`Bi?K- TB+FBM; mT i?2
iF2M- #mi MQ#Q/v +M 2i5

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

*>Sh1_ jX G1_L _lah

fn new(name: &str) -> Philosopher {

q2 iF2 QM2 `;mK2Mi-  name- Q7 ivT2


BMbiM+2 Q7 Qm` Philosopher bi`m+iX

&strX

h?Bb Bb  `272`2M+2 iQ MQi?2` bi`BM;X Ai `2im`Mb M

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() };
}

h?ib Km+? MQBbB2`X lbBM;


mT #2BM; MB+2` iQ mb2X

new

?b Qi?2` /pMi;2b iQQ- #mi 2p2M BM i?Bb bBKTH2 +b2- Bi 2M/b

jXkX .ALAL: S>AGPaPS>1_a

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()-

r?B+? Bb /2}M2/ #Qp2,

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

*>Sh1_ jX G1_L _lah

Baruch Spinoza is done eating.


Gilles Deleuze is done eating.
Karl Marx is done eating.
Friedrich Nietzsche is done eating.
Michel Foucault is done eating.

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();
}
}

Cmbi  72r +?M;2bX G2ib #`2F Bi /QrMX

jXkX .ALAL: S>AGPaPS>1_a

98

use std::thread;

#`BM;b MK2b BMiQ b+QT2X q2`2 ;QBM; iQ bi`i mbBM; i?2


HB#``v- M/ bQ r2 M22/ iQ use BiX
use

thread

KQ/mH2 7`QK i?2 biM/`/

fn eat(&self) {
println!("{} is eating.", self.name);
thread::sleep_ms(1000);
println!("{} is done eating.", self.name);
}

q2 MQr T`BMi Qmi irQ K2bb;2b- rBi? 


iF2b  T?BHQbQT?2` iQ 2iX

sleep_ms()

BM i?2 KB//H2X h?Bb rBHH bBKmHi2 i?2 iBK2 Bi

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

*>Sh1_ jX G1_L _lah


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"),
];
let handles: Vec<_> = philosophers.into_iter().map(|p| {
thread::spawn(move || {
p.eat();
})
}).collect();
for h in handles {
h.join().unwrap();
}
}

HH r2p2 /QM2 Bb +?M;2 i?2 HQQT BM

main()-

M/ //2/  b2+QM/ QM25 >2`2b i?2 }`bi +?M;2,

let handles: Vec<_> = philosophers.into_iter().map(|p| {


thread::spawn(move || {
p.eat();
})
}).collect();

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

jXkX .ALAL: S>AGPaPS>1_a

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

*>Sh1_ jX G1_L _lah

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![

jXkX .ALAL: S>AGPaPS>1_a

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};

q2`2 ;QBM; iQ mb2 MQi?2` bi`m+im`2 7`QK i?2 std::sync T+F;2,


Bi r?2M r2 mb2 BiX

Arc<T>X

q2HH iHF KQ`2 #Qmi

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

*>Sh1_ jX G1_L _lah

fn new(name: &str, left: usize, right: usize) -> Philosopher {


Philosopher {
name: name.to_string(),
left: left,
right: right,
}
}

q2 MQr M22/ iQ +QMbi`m+i i?Qb2

left

M/

right

pHm2b- bQ r2 // i?2K iQ

new()X

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);
}

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-

let table = Arc::new(Table { forks: vec![


Mutex::new(()),
Mutex::new(()),
Mutex::new(()),
Mutex::new(()),
Mutex::new(()),
]});

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;

jXjX _lah ALaA.1 Ph>1_ GL:l:1a

8R

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),
];

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.

*QM;`ib5 uQmp2 BKTH2K2Mi2/  +HbbB+ +QM+m``2M+v T`Q#H2K BM _mbiX

jXj

_mbi BMbB/2 Qi?2` HM;m;2b

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

*>Sh1_ jX G1_L _lah

b Q`;MBxiBQMb ;`Qr- i?2v BM+`2bBM;Hv `2Hv QM  KmHiBim/2 Q7 T`Q;`KKBM; HM;m;2bX .Bz2`2Mi


T`Q;`KKBM; HM;m;2b ?p2 /Bz2`2Mi bi`2M;i?b M/ r2FM2bb2b- M/  TQHv;HQi bi+F H2ib vQm
mb2  T`iB+mH` HM;m;2 r?2`2 Bib bi`2M;i?b KF2 b2Mb2- M/ mb2  /Bz2`2Mi HM;m;2 r?2`2 Bib
r2FX
 p2`v +QKKQM `2 r?2`2 KMv T`Q;`KKBM; HM;m;2b `2 r2F Bb BM `mMiBK2 T2`7Q`KM+2 Q7
T`Q;`KbX P7i2M- mbBM;  HM;m;2 i?i Bb bHQr2`- #mi Qz2`b ;`2i2` T`Q;`KK2` T`Q/m+iBpBiv Bb
 rQ`i?r?BH2 i`/2@QzX hQ ?2HT KBiB;i2 i?Bb- i?2v T`QpB/2  rv iQ r`Bi2 bQK2 Q7 vQm` bvbi2K
BM *- M/ i?2M +HH i?2 * +Q/2 b i?Qm;? Bi r2`2 r`Bii2M BM i?2 ?B;?2`@H2p2H HM;m;2X h?Bb Bb
+HH2/  7Q`2B;M 7mM+iBQM BMi2`7+2- Q7i2M b?Q`i2M2/ iQ 66AX
_mbi ?b bmTTQ`i 7Q` 66A BM #Qi? /B`2+iBQMb, Bi +M +HH BMiQ * +Q/2 2bBHv- #mi +`m+BHHv- Bi +M
HbQ #2 +HH2/ BMiQ b 2bBHv b *X *QK#BM2/ rBi? _mbib H+F Q7  ;`#;2 +QHH2+iQ` M/ HQr
`mMiBK2 `2[mB`2K2Mib- i?Bb KF2b _mbi  ;`2i +M/B/i2 iQ 2K#2/ BMbB/2 Q7 Qi?2` HM;m;2b
r?2M vQm M22/ bQK2 2ti` QQKT?X
h?2`2 Bb  r?QH2 +?Ti2` /2pQi2/ iQ 66A Ub2+iBQM 9X3- T;2 RyeV M/ Bib bT2+B}+b 2Hb2r?2`2 BM i?2
#QQF- #mi BM i?Bb +?Ti2`- r2HH 2tKBM2 i?Bb T`iB+mH` mb2@+b2 Q7 66A- rBi? i?`22 2tKTH2b- BM
_m#v- Svi?QM- M/ Cpa+`BTiX

jXjXR h?2 T`Q#H2K


h?2`2 `2 KMv /Bz2`2Mi T`QD2+ib r2 +QmH/ +?QQb2 ?2`2- #mi r2`2 ;QBM; iQ TB+F M 2tKTH2 r?2`2
_mbi ?b  +H2` /pMi;2 Qp2` KMv Qi?2` HM;m;2b, MmK2`B+ +QKTmiBM; M/ i?`2/BM;X
JMv HM;m;2b- 7Q` i?2 bF2 Q7 +QMbBbi2M+v- TH+2 MmK#2`b QM i?2 ?2T- `i?2` i?M QM i?2 bi+FX
1bT2+BHHv BM HM;m;2b i?i 7Q+mb QM Q#D2+i@Q`B2Mi2/ T`Q;`KKBM; M/ mb2 ;`#;2 +QHH2+iBQM?2T HHQ+iBQM Bb i?2 /27mHiX aQK2iBK2b QTiBKBxiBQMb +M bi+F HHQ+i2 T`iB+mH` MmK#2`b#mi `i?2` i?M `2HvBM; QM M QTiBKBx2` iQ /Q Bib DQ#- r2 Kv rMi iQ 2Mbm`2 i?i r2`2 Hrvb
mbBM; T`BKBiBp2 MmK#2` ivT2b `i?2` i?M bQK2 bQ`i Q7 Q#D2+i ivT2X
a2+QM/- KMv HM;m;2b ?p2  ;HQ#H BMi2`T`2i2` HQ+F- r?B+? HBKBib +QM+m``2M+v BM KMv bBim@
iBQMbX h?Bb Bb /QM2 BM i?2 MK2 Q7 b72iv- r?B+? Bb  TQbBiBp2 2z2+i- #mi Bi HBKBib i?2 KQmMi Q7
rQ`F i?i +M #2 /QM2 i i?2 bK2 iBK2- r?B+? Bb  #B; M2;iBp2X
hQ 2KT?bBx2 i?2b2 irQ bT2+ib- r2`2 ;QBM; iQ +`2i2  HBiiH2 T`QD2+i i?i mb2b i?2b2 irQ bT2+ib
?2pBHvX aBM+2 i?2 7Q+mb Q7 i?2 2tKTH2 Bb i?2 2K#2//BM; Q7 _mbi BMiQ i?2 HM;m;2b- `i?2` i?M
i?2 T`Q#H2K Bib2H7- r2HH Dmbi mb2  iQv 2tKTH2,
ai`i i2M i?`2/bX AMbB/2 2+? i?`2/- +QmMi 7`QK QM2 iQ }p2 KBHHBQMX 7i2` HH i2M
i?`2/b `2 }MBb?2/- T`BMi Qmi /QM25X
A +?Qb2 }p2 KBHHBQM #b2/ QM Kv T`iB+mH` +QKTmi2`X >2`2b M 2tKTH2 Q7 i?Bb +Q/2 BM _m#v,
threads = []
10.times do
threads << Thread.new do
count = 0
5_000_000.times do

jXjX _lah ALaA.1 Ph>1_ GL:l:1a

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

h?Bb T`Q;`K Bb 7B`Hv 2bv iQ r`Bi2 BM _mbi,


use std::thread;
fn process() {
let handles: Vec<_> = (0..10).map(|_| {
thread::spawn(|| {
let mut _x = 0;
for _ in (0..5_000_001) {
_x += 1
}
})
}).collect();
for h in handles {
h.join().ok().expect("Could not join a thread!");
}
}

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

*>Sh1_ jX G1_L _lah

$ 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

let handles: Vec<_> = (0..10).map(|_| {

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,

jXjX _lah ALaA.1 Ph>1_ GL:l:1a

88

$ cargo build --release


Compiling embed v0.1.0 (file:///home/steve/src/embed)

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

}H2 BMbB/2 Q7 Qm` T`QD2+i- M/ /Q i?Bb,

require 'ffi'
module Hello
extend FFI::Library
ffi_lib 'target/release/libembed.so'
attach_function :process, [], :void
end
Hello.process
puts "done!

"27Q`2 r2 +M `mM i?Bb- r2 M22/ iQ BMbiHH i?2

ffi

;2K,

$ gem install ffi # this may need sudo


Fetching: ffi-1.9.8.gem (100%)
Building native extensions.

This could take a while...

Successfully installed ffi-1.9.8


Parsing documentation for ffi-1.9.8
Installing ri documentation for ffi-1.9.8
Done installing documentation for ffi after 0 seconds
1 gem installed

M/ }MHHv- r2 +M i`v `mMMBM; Bi,


$ ruby embed.rb
done!
$

8e

*>Sh1_ jX G1_L _lah

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!"

6BMHHv- b T2` Qm` T`QD2+ib `2[mB`2K2Mib- r2 T`BMi Qmi

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

}H2 BM i?Bb /B`2+iQ`v- M/ Tmi i?Bb BM Bi,

from ctypes import cdll


lib = cdll.LoadLibrary("target/release/libembed.so")
lib.process()
print("done!")

jXjX _lah ALaA.1 Ph>1_ GL:l:1a

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

7i2` i?i BMbiHHb- r2 +M mb2 Bi,


var ffi = require('ffi');
var lib = ffi.Library('target/release/libembed', {
'process': [ 'void', []

});
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

*>Sh1_ jX G1_L _lah

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

h?2 ai+F M/ i?2 >2T

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

*>Sh1_ 9X 1661*hAo1 _lah

9XRXk h?2 ai+F


G2ib iHF #Qmi i?Bb _mbi T`Q;`K,
fn main() {
let x = 42;
}

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,

9XRX h>1 ah*E L. h>1 >1S

q2p2 ;Qi
q?2M

foo()

eR

//`2bb

LK2

oHm2

9k

HQ+i2/ i //`2bb 0- rBi? i?2 pHm2

42X

Bb +HH2/-  M2r bi+F 7`K2 Bb HHQ+i2/,


//`2bb

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()

Bb Qp2`- Bib 7`K2 Bb /2HHQ+i2/,

M/ i?2M- 7i2`

main()-

//`2bb

LK2

oHm2

9k

2p2M i?Bb Hbi pHm2 ;Q2b rvX 1bv5

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

*>Sh1_ 9X 1661*hAo1 _lah


let x = 42;
foo();

PFv- }`bi- r2 +HH

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(),

q?2r5 Pm` bi+F Bb ;`QrBM; iHHX


7i2`

bar()

M/ i?2M

Bb Qp2`- Bib 7`K2 Bb /2HHQ+i2/- H2pBM; Dmbi

foo()

2M/b- H2pBM; Dmbi

foo()

//`2bb

LK2

oHm2

j
k
R
y

+
#

t

R
Ryy
8
9k

//`2bb

LK2

oHm2

9k

main()

M/

main(),

9XRX h>1 ah*E L. h>1 >1S

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>

ivT2R X >2`2b M 2tKTH2,

fn main() {
let x = Box::new(5);
let y = 42;
}

>2`2b r?i ?TT2Mb BM K2KQ`v r?2M

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

*>Sh1_ 9X 1661*hAo1 _lah

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
\\\\\\

out of the box. More complex examples will

be covered later.

M/ i?2M i?2 bi+F 7`K2 ;Q2b rv- 7`22BM; HH Q7 Qm` K2KQ`vX

9XRX9 `;mK2Mib M/ #Q``QrBM;


q2p2 ;Qi bQK2 #bB+ 2tKTH2b rBi? i?2 bi+F M/ i?2 ?2T ;QBM;- #mi r?i #Qmi 7mM+iBQM
`;mK2Mib M/ #Q``QrBM;\ >2`2b  bKHH _mbi T`Q;`K,
fn foo(i: &i32) {
let z = 42;
k ?iiT,ffrrrX+MQMr`2X+QKfD2KHHQ+f

9XRX h>1 ah*E L. h>1 >1S

e8

}
fn main() {
let x = 5;
let y = &x;
foo(y);
}

q?2M r2 2Mi2`

main()-

K2KQ`v HQQFb HBF2 i?Bb,


//`2bb

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

q?i #Qmi r?2M r2 +HH

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

PFv- H2ib ;Q i?`Qm;? i?Bb +QKTH2t T`Q;`K bi2T@#v@bi2T,


fn foo(x: &i32) {
let y = 10;
let z = &y;
baz(z);
bar(x, z);
}

ee

*>Sh1_ 9X 1661*hAo1 _lah

fn bar(a: &i32, b: &i32) {


let c = 5;
let d = Box::new(5);
let e = &d;
baz(e);
}
fn baz(f: &i32) {
let g = 100;
}
fn main() {
let h = 3;
let i = Box::new(20);
let j = &h;
foo(j);
}

6B`bi- r2 +HH

main(),

//`2bb

LK2

oHm2

kjy

k
R
y

D
B
?

ky

y
kjy
j

q2 HHQ+i2 K2KQ`v 7Q` j- i- M/ hX


L2ti- i i?2 2M/ Q7

main()- foo()

Bb QM i?2 ?2T- M/ bQ ?b  pHm2 TQBMiBM; i?2`2X

;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

9XRX h>1 ah*E L. h>1 >1S


L2ti-

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

q2p2 HHQ+i2/ K2KQ`v 7Q` f M/ gX


7`K2,

L2ti-

foo()

+HHb

bar()

ed

rBi?

baz()

Bb p2`v b?Q`i- bQ r?2M Bib Qp2`- r2 ;2i `B/ Q7 Bib bi+F

//`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

*>Sh1_ 9X 1661*hAo1 _lah

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()

Bb Qp2`- r2 ;2i `B/ Q7

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>-

bQ Bi HbQ 7`22b r?i Bi TQBMib iQ, UkjyV @

9XRX h>1 ah*E L. h>1 >1S

M/ 7i2` i?i-

foo()

M/ i?2M- }MHHvQ7 i?2 ?2T iQQX

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()-

r?B+? +H2Mb i?2 `2bi mTX q?2M

Bb

DropT2/-

Bi rBHH +H2M mT i?2 Hbi

q?i /Q Qi?2` HM;m;2b /Q\

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

*>Sh1_ 9X 1661*hAo1 _lah

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

i Bib bBKTH2bi-  i2bi BM _mbi Bb  7mM+iBQM i?ib MMQii2/ rBi? i?2


 M2r T`QD2+i rBi? *`;Q +HH2/ adder,

test

ii`B#mi2X G2ib KF2

$ cargo new adder


$ cd adder

*`;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

h?Bb +QK2b 7`QK i?2 MK2 Q7 Qm` 7mM+iBQM,

fn it_works() {

q2 HbQ ;2i  bmKK`v HBM2,


test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured

aQ r?v /Q2b Qm` /Q@MQi?BM; i2bi Tbb\ Mv i2bi r?B+? /Q2bMi
/Q2b panic! 7BHbX G2ib KF2 Qm` i2bi 7BH,

panic!

Tbb2b- M/ Mv i2bi i?i

#[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

*>Sh1_ 9X 1661*hAo1 _lah

$ 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

_mbi BM/B+i2b i?i Qm` i2bi 7BH2/,


test it_works ... FAILED

M/ i?ib `2~2+i2/ BM i?2 bmKK`v HBM2,


test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured

q2 HbQ ;2i  MQM@x2`Q biimb +Q/2,


$ echo $?
101

h?Bb Bb mb27mH B7 vQm rMi iQ BMi2;`i2

cargo test

BMiQ Qi?2` iQQHBM;X

q2 +M BMp2`i Qm` i2bib 7BHm`2 rBi? MQi?2` ii`B#mi2,

should_panic,

#[test]
#[should_panic]
fn it_works() {
assert!(false);
}

h?Bb i2bi rBHH MQr bm++22/ B7 r2

panic!

M/ 7BH B7 r2 +QKTH2i2X G2ib i`v Bi,

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

_mbi T`QpB/2b MQi?2` K+`Q-

assert_eq!-

i?i +QKT`2b irQ `;mK2Mib 7Q` 2[mHBiv,

#[test]
#[should_panic]
fn it_works() {
assert_eq!("Hello", "world");
}

.Q2b i?Bb i2bi Tbb Q` 7BH\ "2+mb2 Q7 i?2

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

*>Sh1_ 9X 1661*hAo1 _lah


assert_eq!("Hello", "world");

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

pub fn add_two(a: i32) -> i32 {


a + 2
}
#[cfg(test)]
mod tests {
use super::add_two;
#[test]
fn it_works() {
assert_eq!(4, add_two(2));
}
}

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

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 /Bz2`2Mi

use

HBM2X LQr r2 `mM Qm` i2bib,

$ 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

*>Sh1_ 9X 1661*hAo1 _lah


assert_eq!(4, adder::add_two(2));

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

KQ/mH2 BbMi M22/2/ ?2`2- bBM+2 i?2 r?QH2

G2ib }MHHv +?2+F Qmi i?i i?B`/ b2+iBQM, /Q+mK2MiiBQM i2bibX

9XkX9 .Q+mK2MiiBQM i2bib


LQi?BM; Bb #2ii2` i?M /Q+mK2MiiBQM rBi? 2tKTH2bX LQi?BM; Bb rQ`b2 i?M 2tKTH2b i?i /QMi
+imHHv rQ`F- #2+mb2 i?2 +Q/2 ?b +?M;2/ bBM+2 i?2 /Q+mK2MiiBQM ?b #22M r`Bii2MX hQ i?Bb
2M/- _mbi bmTTQ`ib miQKiB+HHv `mMMBM; 2tKTH2b BM vQm` /Q+mK2MiiBQMX >2`2b  ~2b?2/@Qmi
src/lib.rs rBi? 2tKTH2b,
//! The `adder` crate provides functions that add numbers to other numbers.
//!

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

*>Sh1_ 9X 1661*hAo1 _lah

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured


Doc-tests adder
running 2 tests
test add_two_0 ... ok
test _0 ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured

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")]

h?2v HbQ ?p2 bQK2 ?2HT2`b,


#[cfg(any(unix, windows))]
#[cfg(all(unix, target_pointer_width = "32"))]
#[cfg(not(foo))]

h?2b2 +M M2bi `#Bi``BHv,


#[cfg(any(not(unix), all(target_os="macos", target_arch = "powerpc")))]

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 feature depends on the bcrypt package.

secure-password = ["bcrypt"]
9 ?iiT,ff/Q+X+`i2bXBQfKMB72biX?iKHOi?2@&('72im`2b&)'@b2+iBQM

9X9X .P*lJ1LhhAPL

dN

q?2M vQm /Q i?Bb- *`;Q Tbb2b HQM;  ~; iQ

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`

uQm +M HbQ b2i MQi?2` ii`B#mi2 #b2/ QM 

cfg

p`B#H2 rBi?

cfg_attr,

#[cfg_attr(a, b)]

qBHH #2 i?2 bK2 b

9XjXk

#[b]

B7

Bb b2i #v

cfg

ii`B#mi2- M/ MQi?BM; Qi?2`rBb2X

+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!");
}

h?2b2 rBHH #2 `2TH+2/ #v 


b2iiBM;bX

9X9

true

Q`

false

i +QKTBH2@iBK2- /2T2M/BM; QM i?2 +QM};m`iBQM

.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

h?2 _mbi /Bbi`B#miBQM BM+Hm/2b  iQQHmb2/ #v *`;Q i?`Qm;? cargo docX

rustdoc-

i?i ;2M2`i2b /Q+mK2MiiBQMX

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

*>Sh1_ 9X 1661*hAo1 _lah

.Q+mK2MiBM; bQm`+2 +Q/2


h?2 T`BK`v rv Q7 /Q+mK2MiBM;  _mbi T`QD2+i Bb i?`Qm;? MMQiiBM; i?2 bQm`+2 +Q/2X uQm +M
mb2 /Q+mK2MiiBQM +QKK2Mib 7Q` i?Bb Tm`TQb2,
/// Constructs a new `Rc<T>`.
///
/// # Examples
///
/// ```
/// use std::rc::Rc;
///
/// let five = Rc::new(5);
/// ```
pub fn new(value: T) -> Rc<T> {
// implementation goes here
}

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),
}

h?2 #Qp2 rQ`Fb- #mi i?Bb /Q2b MQi,


/// The `Option` type. See [the module level documentation](../) for more.
enum Option<T> {
None, /// No value
Some(T), /// Some value `T`
}

uQmHH ;2i M 2``Q`,


hello.rs:4:1: 4:2 error: expected ident, found `}`
hello.rs:4 }
^
8 ?iiT,ff/Q+X`mbi@HM;XQ`;fMB;?iHvfbi/f`+fbi`m+iX_+X?iKHOK2i?Q/XM2r

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

*>Sh1_ 9X 1661*hAo1 _lah


unsafe-

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() {}

G2ib /Bb+mbb i?2 /2iBHb Q7 i?2b2 +Q/2 #HQ+FbX


*Q/2 #HQ+F MMQiiBQMb hQ r`Bi2 bQK2 _mbi +Q/2 BM  +QKK2Mi- mb2 i?2 i`BTH2 ;`p2b,
/// ```
/// println!("Hello, world");
/// ```
# 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() {}

h?Bb rBHH 2M/ mT i2biBM;,


fn main() {
use std::rc::Rc;
let five = Rc::new(5);
}

>2`2b i?2 7mHH H;Q`Bi?K `mbi/Q+ mb2b iQ TQbiT`Q+2bb 2tKTH2b,


RX Mv H2/BM; #![foo] ii`B#mi2b `2 H27i BMi+i b +`i2 ii`B#mi2bX
kX aQK2 +QKKQM allow ii`B#mi2b `2 BMb2`i2/- BM+Hm/BM; unused_variables- unused_assignments- unused_mut- unused_attributes- M/ dead_codeX aKHH 2tKTH2b Q7i2M i`B;;2`
i?2b2 HBMibX
jX A7 i?2 2tKTH2 /Q2b MQi +QMiBM extern crate- i?2M extern crate
<mycrate>; Bb BMb2`i2/X
9X 6BMHHv- B7 i?2 2tKTH2 /Q2b MQi +QMiBM fn main- i?2 `2KBM/2` Q7 i?2 i2ti Bb r`TT2/ BM
fn main() { your_code }

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

*>Sh1_ 9X 1661*hAo1 _lah

/// Some documentation.


# fn foo() {}

HQQFb /Bz2`2Mi i?M i?2 QmiTmi,


/// Some documentation.
# fn foo() {}

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);

>2`2b M 2tTHMiBQM- `2M/2`2/,


6B`bi- r2 b2i

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);

6BMHHv- r2 T`BMi i?2 bmK Q7

M/ y,

# let x = 5;
# let y = 6;
println!("{}", x + y);

>2`2b i?2 bK2 2tTHMiBQM- BM `r i2ti,


6B`bi- r2 b2i

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);

6BMHHv- r2 T`BMi i?2 bmK Q7

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

>2`2b M 2tKTH2 Q7 /Q+mK2MiBM;  K+`Q,

/// Panic with a given message unless an expression evaluates to true.


///
/// # Examples
///
/// ```
/// # #[macro_use] extern crate foo;
/// # fn main() {
/// panic_unless!(1 + 1 == 2,

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

*>Sh1_ 9X 1661*hAo1 _lah

$ rustdoc --test path/to/my/crate/root.rs


# or
$ cargo test

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

h?Bb +QKK2Mi /Q2bMi

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

HBM2 M22/b iQ #2 i?2 p2`v }`bi HBM2 Q7 i?2 }H2X

d ?iiTb,ff;Bi?m#X+QKf`mbi@HM;f`7+bf#HQ#fKbi2`fi2tify8y8@TB@+QKK2Mi@+QMp2MiBQMbXK/

33
doc

*>Sh1_ 9X 1661*hAo1 _lah


ii`B#mi2b

i  /22T2` H2p2H- /Q+mK2MiiBQM +QKK2Mib `2 bm;` 7Q` /Q+mK2MiiBQM ii`B#mi2b,


/// this
# fn foo() {}
#[doc="this"]
# fn bar() {}

`2 i?2 bK2- b `2 i?2b2,


//! this
#![doc="/// this"]

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

rBHH b?Qr i?2 /Q+mK2MiiBQM 7Q`  Tm#HB+ `2@2tTQ`i BM #Qi? TH+2b,

extern crate foo;


pub use foo::bar;

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,

extern crate foo;


#[doc(no_inline)]
pub use foo::bar;

*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

BM+Hm/2b i?2 +QMi2Mib Q7 6AG1 i i?2 2M/ Q7 i?2

<head>...</head>

BM+Hm/2b i?2 +QMi2Mib Q7 6AG1 /B`2+iHv 7i2` <body>- #27Q`2


i?2 `2M/2`2/ +QMi2Mi UBM+Hm/BM; i?2 b2`+? #`VX
--html-after-content FILE, BM+Hm/2b i?2 +QMi2Mib Q7 6AG1 7i2` HH i?2 `2M/2`2/ +QMi2MiX
a2+m`Biv MQi2
h?2 J`F/QrM BM /Q+mK2MiiBQM +QKK2Mib Bb TH+2/ rBi?Qmi T`Q+2bbBM; BMiQ i?2 }MH r2#T;2X
"2 +`27mH rBi? HBi2`H >hJG,
/// <script>alert(document.cookie)</script>

9X8

Ai2`iQ`b

G2ib iHF #Qmi HQQTbX


_2K2K#2` _mbib

for

HQQT\ >2`2b M 2tKTH2,

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

*>Sh1_ 9X 1661*hAo1 _lah

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

Bb i?2 KQbi +QKKQM +QMbmK2`- #mi i?2`2 `2 Qi?2`b iQQX

let greater_than_forty_two = (0..100)


.find(|x| *x > 42);
match greater_than_forty_two {
Some(_) => println!("We got some numbers!"),
None => println!("No numbers found :("),
}

find()

Bb bQK2iBK2b +HH2/ 
Bb QM2,

Nk

*>Sh1_ 9X 1661*hAo1 _lah

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

MQi?2` BKTQ`iMi +QMbmK2` Bb

foldX

>2`2b r?i Bi HQQFb HBF2,

let sum = (1..4).fold(0, |sum, x| sum + x);

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

rBi? i?2b2 `;mK2Mib,

.fold(0, |sum, x| sum + x);

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

let nums = 1..100;

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 

let nums = vec![1, 2, 3];


for num in nums.iter() {
println!("{}", num);
}

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

*>Sh1_ 9X 1661*hAo1 _lah

for i in (1..).step_by(5).take(5) {
println!("{}", i);
}

h?Bb rBHH T`BMi


1
6
11
16
21
filter() Bb M /Ti2` i?i iF2b  +HQbm`2 b M `;mK2MiX h?Bb +HQbm`2 `2im`Mb true Q`
h?2 M2r Bi2`iQ` filter() T`Q/m+2b QMHv i?2 2H2K2Mib i?i i?i +HQbm`2 `2im`Mb true 7Q`,

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>>();

h?Bb rBHH ;Bp2 vQm  p2+iQ` +QMiBMBM; 6-

12- 18- 24-

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

*>Sh1_ 9X 1661*hAo1 _lah

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);
}

h?Bb ;Bp2b mb M 2``Q`,


8:17 error: capture of moved value: `data`
data[i] += 1;
^~~~

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);
}

>2`2b i?2 2``Q`,


<anon>:9:9: 9:22 error: the trait `core::marker::Send` is not implemented for the type
`std::sync::mutex::MutexGuard<'_, collections::vec::Vec<u32>>` [E0277]
<anon>:11

thread::spawn(move || {
^~~~~~~~~~~~~

<anon>:9:9: 9:22 note: `std::sync::mutex::MutexGuard<'_, collections::vec::Vec<u32>>` c

N3

*>Sh1_ 9X 1661*hAo1 _lah

annot be sent between threads safely


<anon>:11

thread::spawn(move || {
^~~~~~~~~~~~~

uQm b22-

MutexRk

?b 

lockRj

K2i?Q/ r?B+? ?b i?Bb bB;Mim`2,

fn lock(&self) -> LockResult<MutexGuard<T>>

"2+mb2 Send Bb MQi BKTH2K2Mi2/ 7Q`


#QmM/`B2b- r?B+? ;Bp2b mb Qm` 2``Q`X
q2 +M mb2

Arc<T>

MutexGuard<T>-

r2 +Mi i`Mb72` i?2 ;m`/ +`Qbb i?`2/

iQ }t i?BbX >2`2b i?2 rQ`FBM; p2`bBQM,

use std::sync::{Arc, Mutex};


use std::thread;
fn main() {
let data = Arc::new(Mutex::new(vec![1u32, 2, 3]));
for i in 0..3 {
let data = data.clone();
thread::spawn(move || {
let mut data = data.lock().unwrap();
data[i] += 1;
});
}
thread::sleep_ms(50);
}

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();
}
}

q2 mb2 i?2 mpsc::channel() K2i?Q/ iQ +QMbi`m+i  M2r +?MM2HX q2 Dmbi


i?2 +?MM2H- M/ i?2M rBi 7Q` i2M Q7 i?2K iQ +QK2 #+FX

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

*>Sh1_ 9X 1661*hAo1 _lah

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

#+F- r?B+? HHQrb mb iQ +?2+F B7 i?2 i?`2/ ?b TMB+F2/ Q` MQiX

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

9XdX 1__P_ >L.GAL:

9XdXR

RyR

6BHm`2 pbX SMB+

_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

*>Sh1_ 9X 1661*hAo1 _lah

h?Bb rBHH ;Bp2 mb M 2``Q`,


error: non-exhaustive patterns: `_` not covered [E0004]

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

9XdXk >M/HBM; 2``Q`b rBi?

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);

9XdX 1__P_ >L.GAL:

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

i`Bi Bb r?i H2ib mb T`BMi i?2 2MmK pHm2 mbBM; i?2

R9 ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/f7Kifi`BiX.2#m;X?iKH

{:?}

7Q`Ki QT2`iBQMX

Ry9

*>Sh1_ 9X 1661*hAo1 _lah

9XdXj LQM@`2+Qp2`#H2 2``Q`b rBi?

panic!

AM i?2 +b2 Q7 M 2``Q` i?i Bb mM2tT2+i2/ M/ MQi `2+Qp2`#H2- i?2


TMB+X h?Bb rBHH +`b? i?2 +m``2Mi i?`2/- M/ ;Bp2 M 2``Q`,

panic!

K+`Q rBHH BM/m+2 

panic!("boom");

;Bp2b
thread '<main>' panicked at 'boom', hello.rs:2

r?2M vQm `mM BiX


"2+mb2 i?2b2 FBM/b Q7 bBimiBQMb `2 `2HiBp2Hv ``2- mb2 TMB+b bT`BM;HvX

9XdX9 lT;`/BM; 7BHm`2b iQ TMB+b


AM +2`iBM +B`+mKbiM+2b- 2p2M i?Qm;?  7mM+iBQM Kv 7BH- r2 Kv rMi iQ i`2i Bi b  TMB+
BMbi2/X 6Q` 2tKTH2- io::stdin().read_line(&mut buffer) `2im`Mb  Result<usize>- r?2M i?2`2
Bb M 2``Q` `2/BM; i?2 HBM2X h?Bb HHQrb mb iQ ?M/H2 M/ TQbbB#Hv `2+Qp2` 7`QK 2``Q`X
A7 r2 /QMi rMi iQ ?M/H2 i?Bb 2``Q`- M/ rQmH/ `i?2` Dmbi #Q`i i?2 T`Q;`K- r2 +M mb2 i?2
unwrap() K2i?Q/,
io::stdin().read_line(&mut buffer).unwrap();

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()

h?2`2b MQi?2` rv Q7 /QBM; i?Bb i?ib  #Bi MB+2` i?M

unwrap(),

let mut buffer = String::new();


let input = io::stdin().read_line(&mut buffer)
.ok()
.expect("Failed to read line");

+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,

9XdX 1__P_ >L.GAL:

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

*>Sh1_ 9X 1661*hAo1 _lah

Err-

BM r?B+? +b2

Err

Bb `2im`M2/ 2`Hv 7`QK i?2 2M+HQbBM; 7mM+iBQMX

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

iQ /2i2`KBM2 r?i iQ `2im`M BM i?2 2``Q` +b2X

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

#HQ+F +M #2 2ti2M/2/ iQ +Qp2` i?2 2MiB`2 bMTTv SA,

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

*`2iBM;  b72 BMi2`7+2

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

*>Sh1_ 9X 1661*hAo1 _lah

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,
#

d: *mut size_t) -> c_int { 0 }

# unsafe fn snappy_max_compressed_length(a: size_t) -> size_t { a }


# fn main() {}
pub fn compress(src: &[u8]) -> Vec<u8> {
unsafe {
let srclen = src.len() as size_t;
let psrc = src.as_ptr();
let mut dstlen = snappy_max_compressed_length(srclen);
let mut dst = Vec::with_capacity(dstlen as usize);
let pdst = dst.as_mut_ptr();
snappy_compress(psrc, srclen, pdst, &mut dstlen);
dst.set_len(dstlen as usize);
dst
}
}

.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,

uncompressed: *mut u8,

uncompressed_length: *mut size_t) -> c_int { 0 }

# unsafe fn snappy_uncompressed_length(compressed: *const u8,


#

compressed_length: size_t,

result: *mut size_t) -> c_int { 0 }

# 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

let mut dst = Vec::with_capacity(dstlen as usize);


let pdst = dst.as_mut_ptr();
if snappy_uncompress(psrc, srclen, pdst, &mut dstlen) == 0 {
dst.set_len(dstlen as usize);
Some(dst)
} else {
None // SNAPPY_INVALID_INPUT
}
}
}

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

*HH#+Fb 7`QK * +Q/2 iQ _mbi 7mM+iBQMb

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

*>Sh1_ 9X 1661*hAo1 _lah


unsafe {
register_callback(callback);
trigger_callback(); // Triggers the callback
}

* +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
}

AM i?Bb 2tKTH2 _mbib


iQ callback() BM _mbiX

main()

rBHH +HH

trigger_callback()

BM *- r?B+? rQmH/- BM im`M- +HH #+F

h`;2iBM; +HH#+Fb iQ _mbi Q#D2+ib


h?2 7Q`K2` 2tKTH2 b?Qr2/ ?Qr  ;HQ#H 7mM+iBQM +M #2 +HH2/ 7`QK * +Q/2X >Qr2p2` Bi Bb
Q7i2M /2bB`2/ i?i i?2 +HH#+F Bb i`;2i2/ iQ  bT2+BH _mbi Q#D2+iX h?Bb +QmH/ #2 i?2 Q#D2+i i?i
`2T`2b2Mib i?2 r`TT2` 7Q` i?2 `2bT2+iBp2 * Q#D2+iX
h?Bb +M #2 +?B2p2/ #v TbbBM; M mMb72 TQBMi2` iQ i?2 Q#D2+i /QrM iQ i?2 * HB#``vX h?2 *
HB#``v +M i?2M BM+Hm/2 i?2 TQBMi2` iQ i?2 _mbi Q#D2+i BM i?2 MQiB}+iBQMX h?Bb rBHH HHQr i?2
+HH#+F iQ mMb72Hv ++2bb i?2 `272`2M+2/ _mbi Q#D2+iX
_mbi +Q/2,
#[repr(C)]
struct RustObject {
a: i32,
// other members
}
extern "C" fn callback(target: *mut RustObject, a: i32) {
println!("I'm called from C with value {0}", a);
unsafe {
// Update the value in RustObject with the value received from the callback
(*target).a = a;
}
}

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

*>Sh1_ 9X 1661*hAo1 _lah

;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 }

h?Bb 7mM+iBQM +M QMHv #2 +HH2/ 7`QK M

9X3Xd

unsafe

#HQ+F Q` MQi?2`

unsafe

7mM+iBQMX

++2bbBM; 7Q`2B;M ;HQ#Hb

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

*>Sh1_ 9X 1661*hAo1 _lah


unsafe {
rl_prompt = prompt.as_ptr();
println!("{:?}", rl_prompt);
rl_prompt = ptr::null();
}

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

9X3X3 6Q`2B;M +HHBM; +QMp2MiBQMb


JQbi 7Q`2B;M +Q/2 2tTQb2b  * "A- M/ _mbi mb2b i?2 THi7Q`Kb * +HHBM; +QMp2MiBQM #v /27mHi
r?2M +HHBM; 7Q`2B;M 7mM+iBQMbX aQK2 7Q`2B;M 7mM+iBQMb- KQbi MQi#Hv i?2 qBM/Qrb SA- mb2
Qi?2` +HHBM; +QMp2MiBQMbX _mbi T`QpB/2b  rv iQ i2HH i?2 +QKTBH2` r?B+? +QMp2MiBQM iQ mb2,
# #![feature(libc)]
extern crate libc;
#[cfg(all(target_os = "win32", target_arch = "x86"))]
#[link(name = "kernel32")]
#[allow(non_snake_case)]
extern "stdcall" {
fn SetEnvironmentVariableA(n: *const u8, v: *const u8) -> libc::c_int;
}
# fn main() { }

h?Bb TTHB2b iQ i?2 2MiB`2

extern

#HQ+FX h?2 HBbi Q7 bmTTQ`i2/ "A +QMbi`BMib `2,

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

AMi2`QT2`#BHBiv rBi? 7Q`2B;M +Q/2

_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

h?2 MmHH#H2 TQBMi2` QTiBKBxiBQM

*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

*HHBM; _mbi +Q/2 7`QK *

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

*>Sh1_ 9X 1661*hAo1 _lah

9XN

"Q``Qr M/ b_27

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

K2i?Q/k9 r?B+? mb2b

Borrow,

fn get<Q: ?Sized>(&self, k: &Q) -> Option<&V>


where K: Borrow<Q>,
Q: Hash + Eq

h?Bb bB;Mim`2 Bb T`2iiv +QKTHB+i2/X h?2


iQ  T`K2i2` Q7 i?2 HashMap Bib2H7,

T`K2i2` Bb r?i r2`2 BMi2`2bi2/ BM ?2`2X Ai `272`b

struct HashMap<K, V, S = RandomState> {

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));

h?Bb Bb #2+mb2 i?2 biM/`/ HB#``v ?b

impl Borrow<str> for StringX

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

9XRyX _1G1a1 *>LL1Ga

RRd

}
let mut i = 5;
foo(&i);
foo(&mut i);

h?Bb rBHH T`BMi Qmi

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

q?B+? b?QmH/ A mb2\

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

h?2`2 `2 i?`22 +?MM2Hb 7Q` _mbi `2H2b2b,


LB;?iHv
"2i
ai#H2

RR3

*>Sh1_ 9X 1661*hAo1 _lah

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

9XRyXk *?QQbBM;  p2`bBQM


:2M2`HHv bT2FBM;- mMH2bb vQm ?p2  bT2+B}+ `2bQM- vQm b?QmH/ #2 mbBM; i?2 bi#H2 `2H2b2
+?MM2HX h?2b2 `2H2b2b `2 BMi2M/2/ 7Q`  ;2M2`H m/B2M+2X
>Qr2p2`- /2T2M/BM; QM vQm` BMi2`2bi BM _mbi- vQm Kv +?QQb2 iQ mb2 MB;?iHv BMbi2/X h?2 #bB+
i`/2Qz Bb i?Bb, BM i?2 MB;?iHv +?MM2H- vQm +M mb2 mMbi#H2- M2r _mbi 72im`2bX >Qr2p2`mMbi#H2 72im`2b `2 bm#D2+i iQ +?M;2- M/ bQ Mv M2r MB;?iHv `2H2b2 Kv #`2F vQm` +Q/2X A7
vQm mb2 i?2 bi#H2 `2H2b2- vQm +MMQi mb2 2tT2`BK2MiH 72im`2b- #mi i?2 M2ti `2H2b2 Q7 _mbi
rBHH MQi +mb2 bB;MB}+Mi Bbbm2b i?`Qm;? #`2FBM; +?M;2bX

9XRyXj >2HTBM; i?2 2+Qbvbi2K i?`Qm;? *A


q?i #Qmi #2i\ q2 2M+Qm`;2 HH _mbi mb2`b r?Q mb2 i?2 bi#H2 `2H2b2 +?MM2H iQ HbQ i2bi
;BMbi i?2 #2i +?MM2H BM i?2B` +QMiBMmQmb BMi2;`iBQM bvbi2KbX h?Bb rBHH ?2HT H2`i i?2 i2K
BM +b2 i?2`2b M ++B/2MiH `2;`2bbBQMX
//BiBQMHHv- i2biBM; ;BMbi MB;?iHv +M +i+? `2;`2bbBQMb 2p2M bQQM2`- M/ bQ B7 vQm /QMi KBM/
 i?B`/ #mBH/- r2/ TT`2+Bi2 i2biBM; ;BMbi HH +?MM2HbX

avMit M/ a2KMiB+b


h?Bb b2+iBQM #`2Fb _mbi /QrM BMiQ bKHH +?mMFb- QM2 7Q` 2+? +QM+2TiX
A7 vQm/ HBF2 iQ H2`M _mbi 7`QK i?2 #QiiQK mT- `2/BM; i?Bb BM Q`/2` Bb  ;`2i rv iQ /Q i?iX
h?2b2 b2+iBQMb HbQ 7Q`K  `272`2M+2 7Q` 2+? +QM+2Ti- bQ B7 vQm`2 `2/BM; MQi?2` imiQ`BH M/
}M/ bQK2i?BM; +QM7mbBM;- vQm +M }M/ Bi 2tTHBM2/ bQK2r?2`2 BM ?2`2X

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

*>Sh1_ 8X auLhs L. a1JLhA*a

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;

Ai rBHH ;Bp2 vQm i?Bb 2``Q`,


error: re-assignment of immutable variable `x`
x = 10;
^~~~~~~

A7 vQm rMi  #BM/BM; iQ #2 Kmi#H2- vQm +M mb2

mut,

let mut x = 5; // mut x: i32


x = 10;

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

8XRX o_A"G1 "AL.AL:a

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

}H2 iQ HQQF HBF2 i?Bb,

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);
}

M/ i`v iQ #mBH/ BiX uQmHH ;2i M 2``Q`,


$ cargo build
Compiling hello_world v0.0.1 (file:///home/you/projects/hello_world)
src/main.rs:4:39: 4:40 error: use of possibly uninitialized variable: `x`
src/main.rs:4

println!("The value of x is: {}", x);


^

note: in expansion of format_args!


<std macros>:2:23: 2:77 note: expansion site
<std macros>:1:1: 3:2 note: in expansion of println!
src/main.rs:4:5: 4:42 note: expansion site
error: aborting due to previous error
Could not compile `hello_world`.

_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

*>Sh1_ 8X auLhs L. a1JLhA*a

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

1p2`v _mbi T`Q;`K ?b i H2bi QM2 7mM+iBQM- i?2

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);
}

>2`2b  +QKTH2i2 T`Q;`K i?i mb2b

print_number,

fn main() {
print_number(5);
}
fn print_number(x: i32) {
println!("x is: {}", x);
}

b vQm +M b22- 7mM+iBQM `;mK2Mib rQ`F p2`v bBKBH` iQ


`;mK2Mi MK2- 7i2`  +QHQMX

let

/2+H`iBQMb, vQm //  ivT2 iQ i?2

>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);
}

uQm ;2i i?Bb 2``Q`,


expected one of `!`, `:`, or `@`, found `)`
fn print_number(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;
}

q2 rQmH/ ;2i M 2``Q`,


error: not all control paths return a value
fn add_one(x: i32) -> i32 {
x + 1;
}

Rk9

*>Sh1_ 8X auLhs L. a1JLhA*a

help: consider removing this semicolon:


x + 1;
^

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);

// x has the value `()`, not `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

fn add_one(x: i32) -> i32 {


x + 1
}

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,

fn foo(x: i32) -> i32 {


return x;
// we never run this code!
x + 1
}

lbBM; 

return

b i?2 Hbi HBM2 Q7  7mM+iBQM rQ`Fb- #mi Bb +QMbB/2`2/ TQQ` bivH2,

fn foo(x: i32) -> i32 {


return x + 1;
}

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!");
}

Bb  K+`Q- bBKBH` iQ println!() i?i r2p2 H`2/v b22MX lMHBF2


+mb2b i?2 +m``2Mi i?`2/ Q7 2t2+miBQM iQ +`b? rBi? i?2 ;Bp2M K2bb;2X
panic!

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() -> ! {
#

panic!("This function never returns!");

# }
let x: i32 = diverges();
let x: String = diverges();

Rke

*>Sh1_ 8X auLhs L. a1JLhA*a

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

Ai ?b irQ pHm2b-

true

M/

false,

let x = true;
let y: bool = false;

 +QKKQM mb2 Q7 #QQH2Mb Bb BM

if

+QM/BiBQMHb Ub2+iBQM 8X8- T;2 RjRVX

uQm +M }M/ KQ`2 /Q+mK2MiiBQM 7Q`

8XjXk
h?2
U'V

char

boolb

BM i?2 biM/`/ HB#``v /Q+mK2MiiBQMk X

char

ivT2 `2T`2b2Mib  bBM;H2 lMB+Q/2 b+H` pHm2X uQm +M +`2i2

charb

rBi?  bBM;H2 iB+F,

let x = 'x';
let two_hearts = '';

lMHBF2 bQK2 Qi?2` HM;m;2b- i?Bb K2Mb i?i _mbib


uQm +M }M/ KQ`2 /Q+mK2MiiBQM 7Q`

charb

char

Bb MQi  bBM;H2 #vi2- #mi 7Qm`X

BM i?2 biM/`/ HB#``v /Q+mK2MiiBQMj X

8XjXj LmK2`B+ ivT2b


_mbi ?b  p`B2iv Q7 MmK2`B+ ivT2b BM  72r +i2;Q`B2b, bB;M2/ M/ mMbB;M2/- }t2/ M/ p`B#H2~QiBM;@TQBMi M/ BMi2;2`X
h?2b2 ivT2b +QMbBbi Q7 irQ T`ib, i?2 +i2;Q`v- M/ i?2 bBx2X 6Q` 2tKTH2ivT2 rBi? bBti22M #Bib Q7 bBx2X JQ`2 #Bib H2ib vQm ?p2 #B;;2` MmK#2`bX

u16

Bb M mMbB;M2/

A7  MmK#2` HBi2`H ?b MQi?BM; iQ +mb2 Bib ivT2 iQ #2 BM72``2/- Bi /27mHib,


let x = 42; // x has type i32
let y = 1.0; // y has type f64

>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

8XjX S_AJAhAo1 huS1a

Rkd

B39
BRe8
Bjke
Be9d
m33
mReN
mjkRy
me9RR
BbBx2Rk
mbBx2Rj
7jkR9
7e9R8

G2ib ;Q Qp2` i?2K #v +i2;Q`v,


aB;M2/ M/ lMbB;M2/
AMi2;2` ivT2b +QK2 BM irQ p`B2iB2b, bB;M2/ M/ mMbB;M2/X hQ mM/2`biM/ i?2 /Bz2`2M+2- H2ib
+QMbB/2`  MmK#2` rBi? 7Qm` #Bib Q7 bBx2X  bB;M2/- 7Qm`@#Bi MmK#2` rQmH/ H2i vQm biQ`2 MmK#2`b
7`QK -8 iQ +7X aB;M2/ MmK#2`b mb2 irQb +QKTH2K2Mi `2T`2b2MiiBQMX M mMbB;M2/ 7Qm` #Bi
MmK#2`- bBM+2 Bi /Q2b MQi M22/ iQ biQ`2 M2;iBp2b- +M biQ`2 pHm2b 7`QK 0 iQ +15X
lMbB;M2/ ivT2b mb2  u 7Q` i?2B` +i2;Q`v- M/ bB;M2/ ivT2b mb2 iX h?2
M 2B;?i@#Bi mMbB;M2/ MmK#2`- M/ i8 Bb M 2B;?i@#Bi bB;M2/ MmK#2`X

Bb 7Q` BMi2;2`X aQ

u8

Bb

6Bt2/ bBx2 ivT2b


6Bt2/ bBx2 ivT2b ?p2  bT2+B}+ MmK#2` Q7 #Bib BM i?2B` `2T`2b2MiiBQMX oHB/ #Bi bBx2b `2 832- M/ 64X aQ- u32 Bb M mMbB;M2/- jk@#Bi BMi2;2`- M/ i64 Bb  bB;M2/- e9@#Bi BMi2;2`X

16-

o`B#H2 bBx2/ ivT2b


_mbi HbQ T`QpB/2b ivT2b r?Qb2 bBx2 /2T2M/b QM i?2 bBx2 Q7  TQBMi2` Q7 i?2 mM/2`HvBM; K+?BM2X
h?2b2 ivT2b ?p2 bBx2 b i?2 +i2;Q`v- M/ +QK2 BM bB;M2/ M/ mMbB;M2/ p`B2iB2bX h?Bb KF2b
7Q` irQ ivT2b, isize M/ usizeX
9 ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fT`BKBiBp2XB3X?iKH

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

*>Sh1_ 8X auLhs L. a1JLhA*a

6HQiBM;@TQBMi ivT2b
_mbi HbQ ?b irQ ~QiBM; TQBMi ivT2b,
/Qm#H2 T`2+BbBQM MmK#2`bX

f32

M/

f64X

h?2b2 +Q``2bTQM/ iQ A111@d89 bBM;H2 M/

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]

uQm +M ;2i i?2 MmK#2` Q7 2H2K2Mib BM M ``v

rBi?

a.len(),

let a = [1, 2, 3];


println!("a has {} elements", a.len());

uQm +M ++2bb  T`iB+mH` 2H2K2Mi Q7 M ``v rBi? bm#b+`BTi MQiiBQM,


let names = ["Graydon", "Brian", "Niko"]; // names: [&str; 3]
println!("The second name is: {}", names[1]);

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

BM i?2 biM/`/ HB#``v /Q+mK2MiiBQMRe X

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

8XjX S_AJAhAo1 huS1a

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

aHB+2b ?p2 ivT2

&[T]X

q2HH iHF #Qmi i?i

r?2M r2 +Qp2` ;2M2`B+b Ub2+iBQM 8XRN- T;2 RdRVX

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

BM i?2 biM/`/ HB#``v /Q+mK2MiiBQMR3 X

hmTH2b

 imTH2 Bb M Q`/2`2/ HBbi Q7 }t2/ bBx2X GBF2 i?Bb,


let x = (1, "hello");

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

*>Sh1_ 8X auLhs L. a1JLhA*a

let (x, y, z) = (1, 2, 3);


println!("x is {}", x);

_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-

Bb  7mM+iBQM TQBMi2` iQ  7mM+iBQM i?i iF2b M

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

//

and extend to the end of the line.

let x = 5; // this is also a line comment.


// If you have a long explanation for something, you can put line comments next
// to each other. Put a space between the // and your comment so that its
// more readable.

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

*>Sh1_ 8X auLhs L. a1JLhA*a

AM i?2 +b2 Q7

if-

i?2`2 Bb QM2 +?QB+2 i?i H2/b /QrM irQ Ti?b,

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 :(");
}

A7 i?2`2 Bb KQ`2 i?M QM2 +b2- mb2 M

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 :(");
}

h?Bb Bb HH T`2iiv biM/`/X >Qr2p2`- vQm +M HbQ /Q i?Bb,


let x = 5;
let y = if x == 5 {
10
} else {
15
}; // y: i32

q?B+? r2 +M UM/ T`Q##Hv b?QmH/V r`Bi2 HBF2 i?Bb,


let x = 5;
let y = if x == 5 { 10 } else { 15 }; // y: i32

else,

8XeX 6P_ GPPSa

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 );
}

AMbi2/- Bi HQQFb HBF2 i?Bb,


for x in 0..10 {
println!("{}", x); // x: i32
}

AM bHB;?iHv KQ`2 #bi`+i i2`Kbfor var in expression {


code
}

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

_mbi HbQ ?b 

while

HQQTX Ai HQQFb HBF2 i?Bb,

let mut x = 5; // mut x: i32


let mut done = false; // mut done: bool

Rj9

*>Sh1_ 8X auLhs L. a1JLhA*a

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

A7 vQm M22/ M BM}MBi2 HQQT- vQm Kv #2 i2KTi2/ iQ r`Bi2 i?Bb,


while true {

>Qr2p2`- _mbi ?b  /2/B+i2/ F2vrQ`/-

loop-

iQ ?M/H2 i?Bb +b2,

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

HQQT r2 ?/ 2`HB2`,

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; }
}

q2 MQr HQQT 7Q`2p2` rBi?

loop

M/ mb2

break

iQ #`2F Qmi 2`HvX

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

`2 pHB/ BM #Qi?

while

HQQTb M/

for

HQQTb Ub2+iBQM 8Xe- T;2 RjjVX

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

*>Sh1_ 8X auLhs L. a1JLhA*a

>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

8X3Xj JQp2 b2KMiB+b


h?2`2b bQK2 KQ`2 bm#iH2iv ?2`2- i?Qm;?, _mbi 2Mbm`2b i?i i?2`2 Bb 2t+iHv QM2 #BM/BM; iQ Mv
;Bp2M `2bQm`+2X 6Q` 2tKTH2- B7 r2 ?p2  p2+iQ`- r2 +M bbB;M Bi iQ MQi?2` #BM/BM;,
let v = vec![1, 2, 3];
let v2 = v;

"mi- B7 r2 i`v iQ mb2

7i2`r`/b- r2 ;2i M 2``Q`,

let v = vec![1, 2, 3];


let v2 = v;
println!("v[0] is: {}", v[0]);

Ai HQQFb HBF2 i?Bb,


error: use of moved value: `v`
println!("v[0] is: {}", v[0]);
^
kR ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fp2+fbi`m+iXo2+X?iKH

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

*>Sh1_ 8X auLhs L. a1JLhA*a

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

BM i?2 i`Bib Ub2+iBQM 8Xky- T;2 RdjV b2+iBQMX

8X3X9 JQ`2 i?M QrM2`b?BT


P7 +Qm`b2- B7 r2 ?/ iQ ?M/ QrM2`b?BT #+F rBi? 2p2`v 7mM+iBQM r2 r`Qi2,
fn foo(v: Vec<i32>) -> Vec<i32> {
// do stuff with v
// hand back ownership
v
}

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

_272`2M+2b M/ "Q``QrBM;

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;

8XNX _161_1L*1a L. "P__PqAL:

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

*>Sh1_ 8X auLhs L. a1JLhA*a

}
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()-

i?2 p2+iQ`b +Mi

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);
^

Smb?BM;  pHm2 Kmii2b i?2 p2+iQ`- M/ bQ r2 `2Mi HHQr2/ iQ /Q BiX

8XNXj Kmi `272`2M+2b


h?2`2b  b2+QM/ FBM/ Q7 `272`2M+2, &mut TX  Kmi#H2 `272`2M+2 HHQrb vQm iQ Kmii2 i?2
`2bQm`+2 vQm`2 #Q``QrBM;X 6Q` 2tKTH2,
let mut x = 5;
{
let y = &mut x;
*y += 1;
}
println!("{}", x);

8XNX _161_1L*1a L. "P__PqAL:

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() {
}
^

b Bi im`Mb Qmi- i?2`2 `2 `mH2bX

8XNX9

h?2 _mH2b

>2`2b i?2 `mH2b #Qmi #Q``QrBM; BM _mbi,


6B`bi- Mv #Q``Qr Kmbi Hbi 7Q`  bKHH2` b+QT2 i?M i?2 QrM2`X a2+QM/- vQm 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,
y iQ L `272`2M+2b U&TV iQ  `2bQm`+2X
2t+iHv QM2 Kmi#H2 `272`2M+2 U&mut TV
uQm Kv MQiB+2 i?i i?Bb Bb p2`v bBKBH`- i?Qm;? MQi 2t+iHv i?2 bK2 b- iQ i?2 /2}MBiBQM Q7 
/i `+2,
h?2`2 Bb  /i `+2 r?2M irQ Q` KQ`2 TQBMi2`b ++2bb i?2 bK2 K2KQ`v HQ+iBQM
i i?2 bK2 iBK2- r?2`2 i H2bi QM2 Q7 i?2K Bb r`BiBM;- M/ i?2 QT2`iBQMb `2 MQi
bvM+?`QMBx2/X
qBi? `272`2M+2b- vQm Kv ?p2 b KMv b vQm/ HBF2- bBM+2 MQM2 Q7 i?2K `2 r`BiBM;X A7 vQm `2
r`BiBM;- vQm M22/ irQ Q` KQ`2 TQBMi2`b iQ i?2 bK2 K2KQ`v- M/ vQm +M QMHv ?p2 QM2 &mut i
 iBK2X h?Bb Bb ?Qr _mbi T`2p2Mib /i `+2b i +QKTBH2 iBK2, r2HH ;2i 2``Q`b B7 r2 #`2F i?2
`mH2bX
qBi? i?Bb BM KBM/- H2ib +QMbB/2` Qm` 2tKTH2 ;BMX

R9k

*>Sh1_ 8X auLhs L. a1JLhA*a

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 +Q/2 ;Bp2b mb i?Bb 2``Q`,


error: cannot borrow `x` as immutable because it is also borrowed as mutable
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;

// -+ &mut borrow of x starts here


//

//

//

println!("{}", x); // -+ - try to borrow x here


// -+ &mut borrow of x ends here

h?2 b+QT2b +QM~B+i, r2 +Mi KF2 M

&x

r?BH2

Bb BM b+QT2X

aQ r?2M r2 // i?2 +m`Hv #`+2b,


let mut x = 5;
{
let y = &mut x; // -+ &mut borrow starts here
*y += 1;

//

8XNX _161_1L*1a L. "P__PqAL:


}

// -+ ... and ends here

println!("{}", x);

// <- try to borrow x here

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);
}

>2`2b i?2 2``Q`,


error: cannot borrow `v` as mutable because it is also borrowed as immutable
v.push(34);
^
note: previous borrow of `v` occurs here; the immutable borrow prevents
subsequent moves or mutable borrows of `v` until the borrow ends
for i in &v {
^
note: previous borrow ends here
for i in &v {
println!({}, i);
v.push(34);
}
^

R99

*>Sh1_ 8X auLhs L. a1JLhA*a

q2 +Mi KQ/B7v

#2+mb2 Bib #Q``Qr2/ #v i?2 HQQTX

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);

q2 ;2i i?Bb 2``Q`,


error: `x` does not live long enough
y = &x;
^
note: reference must be valid for the block suffix following statement 0 at
2:16...
let y: &i32;
{
let x = 5;
y = &x;
}
note: ...but borrowed value is only valid for the block suffix following
statement 0 at 4:18
let x = 5;
y = &x;
}

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);

q2 ;2i i?Bb 2``Q`,

8XRyX GA61hAJ1a

R98

error: `x` does not live long enough


y = &x;
^
note: reference must be valid for the block suffix following statement 0 at
2:16...
let y: &i32;
let x = 5;
y = &x;
println!("{}", y);
}
note: ...but borrowed value is only valid for the block suffix following
statement 1 at 3:14
let x = 5;
y = &x;
println!("{}", y);
}

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

*>Sh1_ 8X auLhs L. a1JLhA*a

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,

A +[mB`2  ?M/H2 iQ bQK2 FBM/ Q7 `2bQm`+2X


A H2M/ vQm  `272`2M+2 iQ i?2 `2bQm`+2X
A /2+B/2 AK /QM2 rBi? i?2 `2bQm`+2- M/ /2HHQ+i2 Bi- r?BH2 vQm biBHH ?p2 vQm` `272`2M+2X
uQm /2+B/2 iQ mb2 i?2 `2bQm`+2X

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>(...)

h?Bb T`i /2+H`2b Qm` HB72iBK2bX h?Bb bvb i?i


T`K2i2`b- Bi rQmH/ HQQF HBF2 i?Bb,

bar

?b QM2 HB72iBK2-

fn bar<'a, 'b>(...)

h?2M BM Qm` T`K2i2` HBbi- r2 mb2 i?2 HB72iBK2b r2p2 MK2/,

'aX

A7 r2 ?/ irQ `272`2M+2

8XRyX GA61hAJ1a

R9d

...(x: &'a i32)

A7 r2 rMi2/ M

&mut

`272`2M+2- r2/ /Q i?Bb,

...(x: &'a mut i32)

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

Ub2+iBQM 8XRk- T;2 R8jVb,

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);
}

b vQm +M b22-

structb

+M HbQ ?p2 HB72iBK2bX AM  bBKBH` rv iQ 7mM+iBQMb-

struct Foo<'a> {

/2+H`2b  HB72iBK2- M/


x: &'a i32,

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`

// -+ y goes into scope


//

//

//

// -+ y goes out of scope


Foo,

R93

*>Sh1_ 8X auLhs L. a1JLhA*a

struct Foo<'a> {
x: &'a i32,
}
fn main() {
let y = &5;

// -+ y goes into scope

let f = Foo { x: y }; // -+ f goes into scope


// stuff
}

Pm`

//

//

// -+ f and y go out of scope


f

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;

// -+ x goes into scope

{
let y = &5;

//

//

// ---+ y goes into scope

let f = Foo { x: y }; // ---+ f goes into scope


x = &f.x;
}

//

| | error here

// ---+ f and y go out of scope

println!("{}", x);
}

//

//

// -+ x goes out of scope

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

iQ i?2 /i b2;K2Mi Q7 i?2 #BM`v- M/

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)

h?Bb QM2 ?b M QmiTmi HB72iBK2,


fn foo<'a>() -> &'a str

h?Bb QM2 ?b  HB72iBK2 BM #Qi? TQbBiBQMb,


fn foo<'a>(bar: &'a str) -> &'a str

>2`2 `2 i?2 i?`22 `mH2b,


1+? 2HB/2/ HB72iBK2 BM  7mM+iBQMb `;mK2Mib #2+QK2b  /BbiBM+i HB72iBK2 T`K2i2`X
A7 i?2`2 Bb 2t+iHv QM2 BMTmi HB72iBK2- 2HB/2/ Q` MQi- i?i HB72iBK2 Bb bbB;M2/ iQ HH 2HB/2/
HB72iBK2b BM i?2 `2im`M pHm2b Q7 i?i 7mM+iBQMX
A7 i?2`2 `2 KmHiBTH2 BMTmi HB72iBK2b- #mi QM2 Q7 i?2K Bb
Q7 self Bb bbB;M2/ iQ HH 2HB/2/ QmiTmi HB72iBK2bX

&self

Q`

&mut

self-

i?2 HB72iBK2

Pi?2`rBb2- Bi Bb M 2``Q` iQ 2HB/2 M QmiTmi HB72iBK2X


1tKTH2b >2`2 `2 bQK2 2tKTH2b Q7 7mM+iBQMb rBi? 2HB/2/ HB72iBK2bX q2p2 TB`2/ 2+? 2t@
KTH2 Q7 M 2HB/2/ HB72iBK2 rBi? Bib 2tTM/2/ 7Q`KX
fn print(s: &str); // elided
fn print<'a>(s: &'a str); // expanded
fn debug(lvl: u32, s: &str); // elided
fn debug<'a>(lvl: u32, s: &'a str); // expanded
// In the preceding example, `lvl` doesnt need a lifetime because its not a
// reference (`&`). Only things relating to references (such as a `struct`

R8y

*>Sh1_ 8X auLhs L. a1JLhA*a

// which contains a reference) need lifetimes.


fn substr(s: &str, until: u32) -> &str; // elided
fn substr<'a>(s: &'a str, until: u32) -> &'a str; // expanded
fn get_str() -> &str; // ILLEGAL, no inputs
fn frob(s: &str, t: &str) -> &str; // ILLEGAL, two inputs
fn frob<'a, 'b>(s: &'a str, t: &'b str) -> &str; // Expanded: Output lifetime is unclea
r
fn get_mut(&mut self) -> &mut T; // elided
fn get_mut<'a>(&'a mut self) -> &'a mut T; // expanded
fn args<T:ToCStr>(&mut self, args: &[T]) -> &mut Command // elided
fn args<'a, 'b, T:ToCStr>(&'a mut self, args: &'b [T]) -> &'a mut Command // expanded
fn new(buf: &mut [u8]) -> BufWriter; // elided
fn new<'a>(buf: &'a mut [u8]) -> BufWriter<'a> // expanded

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!

q2 +M BMi`Q/m+2 Kmi#BHBiv rBi? i?2

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

P7 +Qm`b2- B7 vQm M22/ #Qi?,

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

AMi2`BQ` pbX 1ti2`BQ` Jmi#BHBiv

>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

*>Sh1_ 8X auLhs L. a1JLhA*a

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
}

h?2 Kmi#BHBiv Q7  bi`m+i Bb BM Bib #BM/BM;,


struct Point {
x: i32,
y: i32,
}
let mut a = Point { x: 5, y: 6 };
a.x = 10;
let b = Point { x: 5, y: 6};
b.x = 10; // error: cannot assign to immutable field `b.x`

>Qr2p2`- #v mbBM;

Cell<T>-

vQm +M 2KmHi2 }2H/@H2p2H Kmi#BHBiv,

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);

h?Bb rBHH T`BMi

8XRk

y: Cell { value: 7 }X

q2p2 bm++2bb7mHHv mT/i2/ yX

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;

 bi`m+i H2ib mb +QK#BM2 i?2b2 irQ BMiQ  bBM;H2- mMB}2/ /iivT2,


struct Point {
x: i32,
y: i32,
}
fn main() {
let origin = Point { x: 0, y: 0 }; // origin: Point
println!("The origin is at ({}, {})", origin.x, origin.y);
}

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

*>Sh1_ 8X auLhs L. a1JLhA*a

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);
}

h?Bb rBHH T`BMi

The point is at (5, 0)X

_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
}

8XRkXR lT/i2 bvMit


 struct +M BM+Hm/2 .. iQ BM/B+i2 i?i vQm rMi iQ mb2  +QTv Q7 bQK2 Qi?2` bi`m+i 7Q` bQK2
Q7 i?2 pHm2bX 6Q` 2tKTH2,

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

*>Sh1_ 8X auLhs L. a1JLhA*a

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

8XRkXj lMBi@HBF2 bi`m+ib


uQm +M /2}M2  bi`m+i rBi? MQ K2K#2`b i HH,
struct Electron;

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

let x: Message = Message::Move { x: 3, y: 4 };


enum BoardGameTurn {
Move { squares: i32 },
Pass,
}
let y: BoardGameTurn = BoardGameTurn::Move { squares: 1 };

"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

*>Sh1_ 8X auLhs L. a1JLhA*a


_ => println!("something else"),

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

8XR9XR Ji+?BM; QM 2MmKb


MQi?2` BKTQ`iMi mb2 Q7 i?2

match

enum Message {
Quit,
ChangeColor(i32, i32, i32),
Move { x: i32, y: i32 },
Write(String),
}

F2vrQ`/ Bb iQ T`Q+2bb i?2 TQbbB#H2 p`BMib Q7 M 2MmK,

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

uQm +M Ki+? KmHiBTH2 Tii2`Mb rBi? |,


let x = 1;
match x {

+ib b M Mv +b2,

Rey

*>Sh1_ 8X auLhs L. a1JLhA*a


1 | 2 => println!("one or two"),
3 => println!("three"),
_ => println!("anything"),

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

one through fiveX

_M;2b `2 KQbiHv mb2/ rBi? BMi2;2`b M/

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"),

q2p2 #QmM/ i?2 BMM2`

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

A7 vQm`2 Ki+?BM; QM M 2MmK r?B+? ?b p`BMib- vQm +M mb2


BM i?2 p`BMi,
enum OptionalInt {
Value(i32),
Missing,
}
let x = OptionalInt::Value(5);
match x {
OptionalInt::Value(..) => println!("Got an int!"),
OptionalInt::Missing => println!("No such luck."),
}

h?Bb T`BMib

8XR8X8

Got an int!X

:m`/b

uQm +M BMi`Q/m+2 Ki+? ;m`/b rBi?

if,

..

iQ B;MQ`2 i?2 pHm2 M/ ivT2

Rek

*>Sh1_ 8X auLhs L. a1JLhA*a

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

8XR8Xe `27 M/ `27 Kmi


A7 vQm rMi iQ ;2i  `272`2M+2 Ub2+iBQM 8XN- T;2 Rj3V- mb2 i?2

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

Ub2+iBQM 8XRk- T;2 R8jV- vQm +M /2bi`m+im`2 Bi

8XR8X Shh1_La

Rej

let origin = Point { x: 0, y: 0 };


match origin {
Point { x: x, y: y } => println!("({},{})", x, y),
}

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

JBt M/ Ji+?

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 } => ...
}

Sii2`Mb `2 p2`v TQr2`7mHX JF2 ;QQ/ mb2 Q7 i?2KX


ke T`BKBiBp2@ivT2bX?iKHOimTH2b

Re9

*>Sh1_ 8X auLhs L. a1JLhA*a

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

8XReXR J2i?Q/ +HHb


>2`2b ?Qr Bi rQ`Fb,
struct Circle {
x: f64,
y: f64,
radius: f64,
}
impl Circle {
fn area(&self) -> f64 {
std::f64::consts::PI * (self.radius * self.radius)
}
}
fn main() {
let c = Circle { x: 0.0, y: 0.0, radius: 2.0 };
println!("{}", c.area());
}

h?Bb rBHH T`BMi

12.566371X

q2p2 K/2  bi`m+i i?i `2T`2b2Mib  +B`+H2X q2 i?2M r`Bi2 M


 K2i?Q/- areaX

impl

#HQ+F- M/ BMbB/2 Bi- /2}M2

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

8XReX J1h>P. auLhs

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

*?BMBM; K2i?Q/ +HHb

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

*>Sh1_ 8X auLhs L. a1JLhA*a


let d = c.grow(2.0).area();
println!("{}", d);

*?2+F i?2 `2im`M ivT2,


# struct Circle;
# impl Circle {
fn grow(&self) -> Circle {
# Circle } }

q2 Dmbi bv r2`2 `2im`MBM; 


`#Bi``v bBx2X

CircleX

qBi? i?Bb K2i?Q/- r2 +M ;`Qr  M2r +B`+H2 iQ Mv

8XReXj bbQ+Bi2/ 7mM+iBQMb


uQm +M HbQ /2}M2 bbQ+Bi2/ 7mM+iBQMb i?i /Q MQi iF2 
i?ib p2`v +QKKQM BM _mbi +Q/2,

self

T`K2i2`X >2`2b  Tii2`M

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

8XReX9 "mBH/2` Sii2`M


G2ib bv i?i r2 rMi Qm` mb2`b iQ #2 #H2 iQ +`2i2 *B`+H2b- #mi r2 rBHH HHQr i?2K iQ QMHv b2i
i?2 T`QT2`iB2b i?2v +`2 #QmiX Pi?2`rBb2- i?2 x M/ y ii`B#mi2b rBHH #2 0.0- M/ i?2 radius

8XReX J1h>P. auLhs

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

*>Sh1_ 8X auLhs L. a1JLhA*a


.y(2.0)
.radius(2.0)
.finalize();
println!("area: {}", c.area());
println!("x: {}", c.x);
println!("y: {}", c.y);

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?

7Q` `2T2iBM; M BMBiBH pHm2,

let v = vec![0; 10]; // ten zeroes

++2bbBM; 2H2K2Mib
hQ ;2i i?2 pHm2 i  T`iB+mH` BM/2t BM i?2 p2+iQ`- r2 mb2

[]b,

let v = vec![1, 2, 3, 4, 5];


println!("The third element of v is {}", v[2]);

h?2 BM/B+2b +QmMi 7`QK 0- bQ i?2 i?B`/ 2H2K2Mi Bb

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

h?2`2 `2 i?`22 p2`bBQMb,

8XR3X ah_AL:a

ReN

let mut v = vec![1, 2, 3, 4, 5];


for i in &v {
println!("A reference to {}", i);
}
for i in &mut v {
println!("A mutable reference to {}", i);
}
for i in v {
println!("Take ownership of the vector and its element {}", i);
}

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

}`biX h?2b2 `2

let string = "Hello there."; // string: &'static 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

rBHH +Q2`+2 BMiQ

&str

rBi? M &,

k3 ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fp2+fBM/2tX?iKH

Rdy

*>Sh1_ 8X auLhs L. a1JLhA*a

fn takes_slice(slice: &str) {
println!("Got: {}", slice);
}
fn main() {
let s = "Hello".to_string();
takes_slice(&s);
}

oB2rBM;  String b  &str Bb +?2T- #mi +QMp2`iBM; i?2


K2KQ`vX LQ `2bQM iQ /Q i?i mMH2bb vQm ?p2 iQ5

&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,

, , , , ,

b vQm +M b22- i?2`2 `2 KQ`2 #vi2b i?M

charbX

uQm +M ;2i bQK2i?BM; bBKBH` iQ M BM/2t HBF2 i?Bb,

8XRNX :1L1_A*a

RdR

let dog = hachiko.chars().nth(1); // kinda like hachiko[1]

h?Bb 2KT?bBx2b i?i r2 ?p2 iQ ;Q i?`Qm;? i?2 r?QH2 HBbi Q7

charsX

*QM+i2MiBQM
A7 vQm ?p2 

String-

vQm +M +QM+i2Mi2 

&str

iQ i?2 2M/ Q7 Bi,

let hello = "Hello ".to_string();


let world = "world!";
let hello_world = hello + world;

"mi B7 vQm ?p2 irQ

Stringb-

vQm M22/ M &,

let hello = "Hello ".to_string();


let world = "world!".to_string();
let hello_world = hello + &world;

h?Bb Bb #2+mb2 &String +M miQKiB+HHv +Q2`2+2 iQ 


+Q2`+BQMb Ub2+iBQM 8Xj9- T;2 kR3VX

8XRN

&strX

h?Bb Bb  72im`2 +HH2/ Deref

: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

*>Sh1_ 8X auLhs L. a1JLhA*a

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)

h?i /Q2bMi K2M r2 +Mi KF2

Option<T>b

i?i ?QH/ M

f645

h?2v Dmbi ?p2 iQ Ki+? mT,

let x: Option<i32> = Some(5);


let y: Option<f64> = Some(5.0f64);

h?Bb Bb Dmbi }M2X PM2 /2}MBiBQM- KmHiBTH2 mb2bX


:2M2`B+b /QMi ?p2 iQ QMHv #2 ;2M2`B+ Qp2` QM2 ivT2X *QMbB/2` MQi?2` ivT2 7`QK _mbib biM/`/
HB#``v i?ib bBKBH`- Result<T, E>,
enum Result<T, E> {
Ok(T),
Err(E),
}

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
}

h?2 bvMit ?b irQ T`ib, i?2


bvb t ?b i?2 ivT2 TX

<T>

bvb i?Bb 7mM+iBQM Bb ;2M2`B+ Qp2` QM2 ivT2- T- M/ i?2

JmHiBTH2 `;mK2Mib +M ?p2 i?2 bK2 ;2M2`B+ ivT2,

x: T

8XkyX h_Aha

Rdj

fn takes_two_of_the_same_things<T>(x: T, y: T) {
// ...
}

q2 +QmH/ r`Bi2  p2`bBQM i?i iF2b KmHiBTH2 ivT2b,


fn takes_two_things<T, U>(x: T, y: U) {
// ...
}

: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

.Q vQm `2K2K#2` i?2


T;2 Re9V\

impl

F2vrQ`/- mb2/ iQ +HH  7mM+iBQM rBi? K2i?Q/ bvMit Ub2+iBQM 8XRe-

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

*>Sh1_ 8X auLhs L. a1JLhA*a

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`

"2+mb2 T +M #2 Mv ivT2- r2 +Mi #2 bm`2 i?i Bi BKTH2K2Mib i?2


//  i`Bi +QMbi`BMi iQ Qm` ;2M2`B+ T- 2Mbm`BM; i?i Bi /Q2b,

area

K2i?Q/X "mi r2 +M

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

*>Sh1_ 8X auLhs L. a1JLhA*a

h?Bb T`Q;`K QmiTmib,


This shape has an area of 3.141593
This shape has an area of 1

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);

q2 ;2i  +QKTBH2@iBK2 2``Q`,


error: failed to find an implementation of trait main::HasArea for int

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());

>2`2b i?2 2``Q`,


error: type `std::fs::File` does not implement any method in scope named `write`
let result = f.write(b"whatever");
^~~~~~~~~~~~~~~~~~
kN ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fBQfi`BiXq`Bi2X?iKH

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());

h?Bb rBHH +QKTBH2 rBi?Qmi 2``Q`X


h?Bb K2Mb i?i 2p2M B7 bQK2QM2 /Q2b bQK2i?BM; #/ HBF2 // K2i?Q/b iQ
vQm- mMH2bb vQm use i?i i`BiX

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

JmHiBTH2 i`Bi #QmM/b

uQmp2 b22M i?i vQm +M #QmM/  ;2M2`B+ ivT2 T`K2i2` rBi?  i`Bi,
fn foo<T: Clone>(x: T) {
x.clone();
}

A7 vQm M22/ KQ`2 i?M QM2 #QmM/- vQm +M mb2 +,


use std::fmt::Debug;
fn foo<T: Clone + Debug>(x: T) {
x.clone();
println!("{:?}", x);
}

MQr M22/b iQ #2 #Qi?

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

*>Sh1_ 8X auLhs L. a1JLhA*a


x.clone();
y.clone();
println!("{:?}", y);

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);
}

h?Bb ~2tB#BHBiv +M // +H`Biv BM +QKTH2t bBimiBQMbX


where

Bb HbQ KQ`2 TQr2`7mH i?M i?2 bBKTH2` bvMitX 6Q` 2tKTH2,

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

*>Sh1_ 8X auLhs L. a1JLhA*a


fn baz(&self) { println!("Override baz!"); }

}
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

Kmbi HbQ BKTH2K2Mi

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-

_mbi rBHH i2HH mb,

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

?b QM2 K2i?Q/-

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?Bb rBHH QmiTmi,


BOOM times 100!!!
BOOM times 1!!!

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

*>Sh1_ 8X auLhs L. a1JLhA*a

8Xkk

B7 H2i

HHQrb vQm iQ +QK#BM2


Tii2`M Ki+?2bX
if let

if

M/

let

iQ;2i?2` iQ `2/m+2 i?2 Qp2`?2/ Q7 +2`iBM FBM/b Q7

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 => {},
}

q2 /QMi ?p2 iQ mb2

match

?2`2- 7Q` 2tKTH2- r2 +QmH/ mb2

if,

if option.is_some() {
let x = option.unwrap();
foo(x);
}

L2Bi?2` Q7 i?2b2 QTiBQMb Bb T`iB+mH`Hv TT2HBM;X q2 +M mb2


MB+2` rv,

if let

iQ /Q i?2 bK2 i?BM; BM 

if let Some(x) = option {


foo(x);
}

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,

if let Some(x) = option {


foo(x);
} else {
bar();
}

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,
}
}

8XkjX h_Ah P"C1*ha

R3j

AMiQ +Q/2 HBF2 i?Bb,


while let Some(x) = option {
println!("{}", x);
}

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;
}

q2HH HbQ BKTH2K2Mi i?Bb i`Bi 7Q`

u8

M/

String,

impl Foo for u8 {


fn method(&self) -> String { format!("u8: {}", *self) }
}
impl Foo for String {
fn method(&self) -> String { format!("string: {}", *self) }
}

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

*>Sh1_ 8X auLhs L. a1JLhA*a

_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

8XkjX h_Ah P"C1*ha

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

*>Sh1_ 8X auLhs L. a1JLhA*a

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 (),
}

h?i Bb-  i`Bi Q#D2+i HBF2

&Foo

+QMbBbib Q7  /i TQBMi2` M/  pi#H2 TQBMi2`X

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

8XkjX h_Ah P"C1*ha

R3d

fn call_method_on_String(x: *const ()) -> String {


// the compiler guarantees that this function is only called
// with `x` pointing to a String
let string: &String = unsafe { &*(x as *const String) };
string.method()
}
static Foo_for_String_vtable: FooVtable = FooVtable {
destructor: /* compiler magic */,
// values for a 64-bit computer, halve them for 32-bit ones
size: 24,
align: 8,
method: call_method_on_String as fn(*const ()) -> String,
};

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

*>Sh1_ 8X auLhs L. a1JLhA*a

(b.vtable.method)(b.data);
// y.method();
(y.vtable.method)(y.data);

A7 b Q` y r2`2 QrMBM; i`Bi Q#D2+ib UBox<Foo>V- i?2`2 rQmH/ #2 


U`2bT2+iBp2Hv yV +HH r?2M i?2v r2Mi Qmi Q7 b+QT2X

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: i32 ) -> i32 { x + 1 }

let plus_one_v2 = |x: i32 | -> i32 { x + 1 };


let plus_one_v3 = |x: i32 |

x + 1

aKHH /Bz2`2M+2b- #mi i?2v`2 bBKBH` BM rvbX

8Xk9Xk

*HQbm`2b M/ i?2B` 2MpB`QMK2Mi

*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;

q?B+? 2``Q`b rBi?,


error: cannot borrow `num` as mutable because it is also borrowed as immutable
let y = &mut num;
^~~
note: previous borrow of `num` occurs here due to use in closure; the immutable
borrow prevents subsequent moves or mutable borrows of `num` until the borrow
ends
let plus_num = |x| x + num;
^~~~~~~~~~~
note: previous borrow ends here
fn main() {
let mut num = 5;
let plus_num = |x| x + num;

RNy

*>Sh1_ 8X auLhs L. a1JLhA*a


let y = &mut num;

}
^

 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

let mut num = 5;


{
let plus_num = |x: i32| x + num;
} // plus_num goes out of scope, borrow of num ends
let y = &mut num;

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);

h?Bb ;Bp2b mb,


note: `nums` moved into closure environment here because it has type
`[closure(()) -> collections::vec::Vec<i32>]`, which is non-copyable
let takes_nums = || 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

let mut num = 5;


{
let mut add_num = |x: i32| num += x;
add_num(5);
}
assert_eq!(10, num);

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

+HQbm`2- Bib /Bz2`2Mi,

let mut num = 5;


{
let mut add_num = move |x: i32| num += x;
add_num(5);
}
assert_eq!(5, num);

q2 QMHv ;2i 5X _i?2` i?M iFBM;  Kmi#H2 #Q``Qr Qmi QM Qm`


+QTvX

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

*>Sh1_ 8X auLhs L. a1JLhA*a

pub trait Fn<Args> : FnMut<Args> {


extern "rust-call" fn call(&self, args: Args) -> Self::Output;
}
pub trait FnMut<Args> : FnOnce<Args> {
extern "rust-call" fn call_mut(&mut self, args: Args) -> Self::Output;
}
pub trait FnOnce<Args> {
type Output;
extern "rust-call" fn call_once(self, args: Args) -> Self::Output;
}

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

8Xk9X9 hFBM; +HQbm`2b b `;mK2Mib


LQr i?i r2 FMQr i?i +HQbm`2b `2 i`Bib- r2 H`2/v FMQr ?Qr iQ ++2Ti M/ `2im`M +HQbm`2b,
Dmbi HBF2 Mv Qi?2` i`Bi5
h?Bb HbQ K2Mb i?i r2 +M +?QQb2 biiB+ pb /vMKB+ /BbTi+? b r2HHX 6B`bi- H2ib r`Bi2 
7mM+iBQM r?B+? iF2b bQK2i?BM; +HH#H2- +HHb Bi- M/ `2im`Mb i?2 `2bmHi,
fn call_with_one<F>(some_closure: F) -> i32
where F : Fn(i32) -> i32 {
some_closure(1)
}
let answer = call_with_one(|x| x + 2);
assert_eq!(3, answer);

q2 Tbb Qm` +HQbm`2- |x| x + 2- iQ


+HQbm`2- ;BpBM; Bi 1 b M `;mK2MiX
G2ib 2tKBM2 i?2 bB;Mim`2 Q7

call_with_oneX

call_with_one

Ai Dmbi /Q2b r?i Bi bm;;2bib, Bi +HHb i?2

BM KQ`2 /2Ti?,

fn call_with_one<F>(some_closure: F) -> i32

q2 iF2 QM2 T`K2i2`- M/ Bi ?b i?2 ivT2 FX q2 HbQ `2im`M 


h?2 M2ti T`i Bb,

i32X

h?Bb T`i BbMi BMi2`2biBM;X

8Xk9X *GPal_1a

RNj

where F : Fn(i32) -> i32 {

"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);

h?Bb ;Bp2b mb i?2b2 HQM;- `2Hi2/ 2``Q`b,


error: the trait `core::marker::Sized` is not implemented for the type
`core::ops::Fn(i32) -> collections::vec::Vec<i32>` [E0277]

RN9

*>Sh1_ 8X auLhs L. a1JLhA*a

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);

"mi r2 ;2i MQi?2` 2``Q`,


error: missing lifetime specifier [E0106]
fn factory() -> &(Fn(i32) -> i32) {
^~~~~~~~~~~~~~~~~

_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

let answer = f(1);


assert_eq!(6, answer);

"mi r2 ;2i MQi?2` 2``Q`,


error: mismatched types:
expected `&'static core::ops::Fn(i32) -> i32`,
found `[closure <anon>:7:9: 7:20]`
(expected &-ptr,
found closure) [E0308]
|x| x + num
^~~~~~~~~~~

h?Bb 2``Q` Bb H2iiBM; mb FMQr i?i r2 /QMi ?p2 


<anon>:7:9: 7:20]X qBi- r?i\

&'static Fn(i32) -> i32-

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);

q2 mb2  i`Bi Q#D2+i- #v

BoxBM;

mT i?2

FnX

h?2`2b Dmbi QM2 Hbi T`Q#H2K,

error: `num` does not live long enough


Box::new(|x| x + num)
^~~~~~~~~~~

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

*>Sh1_ 8X auLhs L. a1JLhA*a

fn factory() -> Box<Fn(i32) -> i32> {


let num = 5;
Box::new(move |x| x + num)
}
let f = factory();
let answer = f(1);
assert_eq!(6, answer);

"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

lMBp2`bH 6mM+iBQM *HH avMit

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;

A7 r2 r2`2 iQ i`v iQ +HH

b.f()-

r2/ ;2i M 2``Q`,

error: multiple applicable methods in scope [E0034]


b.f();
^~~
note: candidate #1 is defined in an impl of the trait `main::Foo` for the type
`main::Baz`
fn f(&self) { println!("Bazs impl of Foo"); }
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

BoxBM;

8Xk8X lLAo1_aG 6lL*hAPL *GG auLhs

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);

G2ib #`2F Bi /QrMX


Foo::
Bar::

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 7Q`K Q7 l6*a r2 Dmbi iHF2/ #Qmi,


Trait::method(args);

Ab  b?Q`i@?M/X h?2`2b M 2tTM/2/ 7Q`K Q7 i?Bb i?ib M22/2/ BM bQK2 bBimiBQMb,


<Type as Trait>::method(args);

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

*>Sh1_ 8X auLhs L. a1JLhA*a

#[derive(Clone)]
struct Bar;
impl Foo for Bar {
fn clone(&self) {
println!("Making a clone of Bar");
<Bar as Clone>::clone(self);
}
}

h?Bb rBHH +HH i?2

8Xke

Clone

i`Bib

clone()

K2i?Q/- `i?2` i?M

FoobX

*`i2b M/ JQ/mH2b

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

8XkeXR "bB+ i2`KBMQHQ;v, *`i2b M/ JQ/mH2b


_mbi ?b irQ /BbiBM+i i2`Kb i?i `2Hi2 iQ i?2 KQ/mH2 bvbi2K, +`i2 M/ KQ/mH2X  +`i2
Bb bvMQMvKQmb rBi?  HB#``v Q` T+F;2 BM Qi?2` HM;m;2bX >2M+2 *`;Q b i?2 MK2 Q7
_mbib T+F;2 KM;2K2Mi iQQH, vQm b?BT vQm` +`i2b iQ Qi?2`b rBi? *`;QX *`i2b +M T`Q/m+2
M 2t2+mi#H2 Q`  HB#``v- /2T2M/BM; QM i?2 T`QD2+iX
1+? +`i2 ?b M BKTHB+Bi `QQi KQ/mH2 i?i +QMiBMb i?2 +Q/2 7Q` i?i +`i2X uQm +M i?2M /2}M2
 i`22 Q7 bm#@KQ/mH2b mM/2` i?i `QQi KQ/mH2X JQ/mH2b HHQr vQm iQ T`iBiBQM vQm` +Q/2 rBi?BM
i?2 +`i2 Bib2H7X
b M 2tKTH2- H2ib KF2  T?`b2b +`i2- r?B+? rBHH ;Bp2 mb p`BQmb T?`b2b BM /Bz2`2Mi HM@
;m;2bX hQ F22T i?BM;b bBKTH2- r2HH biB+F iQ ;`22iBM;b M/ 7`2r2HHb b irQ FBM/b Q7 T?`b2bM/ mb2 1M;HBb? M/ CTM2b2 UV b irQ HM;m;2b 7Q` i?Qb2 T?`b2b iQ #2 BMX q2HH mb2
i?Bb KQ/mH2 HvQmi,
+-----------+
+---| greetings |
|
+---------+

+-----------+

+---| english |---+


|
+---------+

+---------+

+-----------+

+---| farewells |

+-----------+

| phrases |---+
+---------+

+-----------+

+---| greetings |

8XkeX *_h1a L. JP.lG1a


|

+----------+

RNN
|

+-----------+

+---| japanese |--+


+----------+

|
|

+-----------+

+---| 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

A7 vQm `2K2K#2`- i?Bb ;2M2`i2b  bBKTH2 T`QD2+i 7Q` mb,


$ tree .
.
Cargo.toml
src
lib.rs
1 directory, 2 files
src/lib.rs

8XkeXk

Bb Qm` +`i2 `QQi- +Q``2bTQM/BM; iQ i?2

phrases

BM Qm` /B;`K #Qp2X

.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

*>Sh1_ 8X auLhs L. a1JLhA*a

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()

7mM+iBQM- M/ Bb +HH2/

lib.rs-

*`;Q rBHH #mBH/ i?Bb

$ 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

8XkeXj JmHiBTH2 }H2 +`i2b


A7 2+? +`i2 r2`2 Dmbi QM2 }H2- i?2b2 }H2b rQmH/ ;2i p2`v H`;2X Aib Q7i2M 2bB2` iQ bTHBi mT +`i2b
BMiQ KmHiBTH2 }H2b- M/ _mbi bmTTQ`ib i?Bb BM irQ rvbX
AMbi2/ Q7 /2+H`BM;  KQ/mH2 HBF2 i?Bb,
mod english {
// contents of our module go here
}

q2 +M BMbi2/ /2+H`2 Qm` KQ/mH2 HBF2 i?Bb,


mod english;

A7 r2 /Q i?i- _mbi rBHH 2tT2+i iQ }M/ 2Bi?2` 


+QMi2Mib Q7 Qm` KQ/mH2X

english.rs

}H2- Q` 

english/mod.rs

}H2 rBi? i?2

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

8XkeX *_h1a L. JP.lG1a

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

Bb Qm` +`i2 `QQi- M/ HQQFb HBF2 i?Bb,

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,

fn hello() -> String {


"Hello!".to_string()
}

Smi i?Bb BM

src/english/farewells.rs,

fn goodbye() -> String {


"Goodbye.".to_string()
}

src/japanese/farewells.rs

`2 #Qi? 2KTiv i

kyk

*>Sh1_ 8X auLhs L. a1JLhA*a

Smi i?Bb BM

src/japanese/greetings.rs,

fn hello() -> String {


"

".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,

fn goodbye() -> String {


"

".to_string()

Uh?Bb Bb avM`- B7 vQm`2 +m`BQmbXV


LQr i?i r2 ?p2 bQK2 7mM+iBQMHBiv BM Qm` +`i2- H2ib i`v iQ mb2 Bi 7`QK MQi?2` +`i2X

8XkeX9 AKTQ`iBM; 1ti2`MH *`i2b


q2 ?p2  HB#``v +`i2X G2ib KF2 M 2t2+mi#H2 +`i2 i?i BKTQ`ib M/ mb2b Qm` HB#``vX
JF2 

src/main.rs

M/ Tmi i?Bb BM Bi UBi rQMi [mBi2 +QKTBH2 v2iV,

extern crate phrases;


fn main() {
println!("Hello in English: {}", phrases::english::greetings::hello());
println!("Goodbye in English: {}", phrases::english::farewells::goodbye());
println!("Hello in Japanese: {}", phrases::japanese::greetings::hello());
println!("Goodbye in Japanese: {}", phrases::japanese::farewells::goodbye());
}

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

8XkeX *_h1a L. JP.lG1a


src/main.rs:4

kyj

println!("Hello in English: {}", phrases::english::greetings::hello()

);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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

1tTQ`iBM;  Sm#HB+ AMi2`7+2

_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,

pub mod english;


mod japanese;

M/ BM Qm`

src/english/mod.rs-

H2ib KF2 #Qi?

pub,

pub mod greetings;


pub mod farewells;

AM Qm`

src/english/greetings.rs-

H2ib //

pub

iQ Qm`

fn

/2+H`iBQM,

pub fn hello() -> String {


"Hello!".to_string()
}

M/ HbQ BM

src/english/farewells.rs,

pub fn goodbye() -> String {


"Goodbye.".to_string()
}

LQr- Qm` +`i2 +QKTBH2b- H#2Bi rBi? r`MBM;b #Qmi MQi mbBM; i?2

japanese

7mM+iBQMb,

ky9

*>Sh1_ 8X auLhs L. a1JLhA*a

$ 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.

LQr i?i Qm` 7mM+iBQMb `2 Tm#HB+- r2 +M mb2 i?2KX


:`2i5
>Qr2p2`- ivTBM; Qmi
phrases::english::greetings::hello() Bb p2`v HQM; M/ `2T2iBiBp2X
_mbi ?b MQi?2` F2v@
rQ`/ 7Q` BKTQ`iBM; MK2b BMiQ i?2 +m``2Mi b+QT2- bQ i?i vQm +M `272` iQ i?2K rBi? b?Q`i2`
MK2bX G2ib iHF #Qmi useX

8XkeXe AKTQ`iBM; JQ/mH2b rBi?


_mbi ?b 

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

extern crate phrases;


use phrases::english::greetings;
use phrases::english::farewells;
fn main() {
println!("Hello in English: {}", greetings::hello());
println!("Goodbye in English: {}", farewells::goodbye());
}

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());
}

8XkeX *_h1a L. JP.lG1a

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());
}

_mbi rBHH ;Bp2 mb  +QKTBH2@iBK2 2``Q`,


Compiling phrases v0.0.1 (file:///home/you/projects/phrases)
src/main.rs:4:5: 4:40 error: a value named `hello` has already been imported in this mo
dule [E0252]
src/main.rs:4 use phrases::japanese::greetings::hello;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to previous error
Could not compile `phrases`.

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;

q2 +M mb2 i?Bb b?Q`i+mi,


use phrases::english::{greetings, 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

extern crate phrases;


use phrases::english::{greetings,farewells};
use phrases::japanese;

iQ `2/ HBF2 i?Bb,

kye

*>Sh1_ 8X auLhs L. a1JLhA*a

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());
}

h?2M- KQ/B7v vQm`

src/lib.rs

iQ KF2 i?2

japanese

KQ/ Tm#HB+,

pub mod english;


pub mod japanese;

L2ti- KF2 i?2 irQ 7mM+iBQMb Tm#HB+- }`bi BM

src/japanese/greetings.rs,

pub fn hello() -> String {


"

".to_string()

M/ i?2M BM

src/japanese/farewells.rs,

pub fn goodbye() -> String {


"

".to_string()

6BMHHv- KQ/B7v vQm`

src/japanese/mod.rs

iQ `2/ HBF2 i?Bb,

pub use self::greetings::hello;


pub use self::farewells::goodbye;
mod greetings;
mod farewells;

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

+m``2Mi HQ+iBQMX aQK2 T2QTH2 HBF2 iQ i?BMF Q7 self b . M/


/BbTHv 7Q` i?2 +m``2Mi /B`2+iQ`v M/ i?2 T`2Mi /B`2+iQ`vX

super

b

..-

7`QK KMv b?2HHb

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/

#27Q`2 r2 /2+H`2/ Qm`

modbX

_mbi `2[mB`2b i?i

use

/2+H`iBQMb ;Q

h?Bb rBHH #mBH/ M/ `mM,


$ cargo run
Compiling phrases v0.0.1 (file:///home/you/projects/phrases)
Running `target/debug/phrases`
Hello in English: Hello!
Goodbye in English: Goodbye.
Hello in Japanese:

Goodbye in Japanese:

8Xkd

const

M/

static

_mbi ?b  rv Q7 /2}MBM; +QMbiMib rBi? i?2

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

*>Sh1_ 8X auLhs L. a1JLhA*a

static NAME: &'static str = "Steve";

Jmi#BHBiv
uQm +M BMi`Q/m+2 Kmi#BHBiv rBi? i?2

mut

F2vrQ`/,

static mut N: i32 = 5;

"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);
}

6m`i?2`KQ`2- Mv ivT2 biQ`2/ BM 

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

8XkdXj q?B+? +QMbi`m+i b?QmH/ A mb2\


HKQbi Hrvb- B7 vQm +M +?QQb2 #2ir22M i?2 irQ- +?QQb2 constX Aib T`2iiv ``2 i?i vQm +imHHv
rMi  K2KQ`v HQ+iBQM bbQ+Bi2/ rBi? vQm` +QMbiMi- M/ mbBM;  +QMbi HHQrb 7Q` QTiBKBxiBQMb
HBF2 +QMbiMi T`QT;iBQM MQi QMHv BM vQm` +`i2 #mi /QrMbi`2K +`i2bX
 +QMbi +M #2 i?Qm;?i Q7 b  #define BM *, Bi ?b K2i/i Qp2`?2/ #mi Bi ?b MQ `mMiBK2
Qp2`?2/X a?QmH/ A mb2  O/2}M2 Q`  biiB+ BM *- Bb H`;2Hv i?2 bK2 [m2biBQM b r?2i?2` vQm
b?QmH/ mb2  +QMbi Q`  biiB+ BM _mbiX

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() {

P` 2p2M F2vb M/ pHm2b,


#[cfg(target_os = "macos")]
mod macos_only {

_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

F2vrQ`/ H2ib vQm /2+H`2 M HBb Q7 MQi?2` ivT2,

type

HBb2b

jj ?iiT,ff/Q+X`mbi@HM;XQ`;f`272`2M+2X?iKHOii`B#mi2b

kRy

*>Sh1_ 8X auLhs L. a1JLhA*a

type Name = String;

uQm +M i?2M mb2 i?Bb ivT2 b B7 Bi r2`2  `2H ivT2,


type Name = String;
let x: Name = "Hello".to_string();

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 {
^

"mi- B7 r2 ?/ M HBb,


type Num = i32;
let x: i32 = 5;
let y: Num = 5;
if x == y {
// ...
}

h?Bb +QKTBH2b rBi?Qmi 2``Q`X oHm2b Q7 


rvX

Num

uQm +M HbQ mb2 ivT2 HBb2b rBi? ;2M2`B+b,


use std::result;
enum ConcreteError {

ivT2 `2 i?2 bK2 b  pHm2 Q7 ivT2

i32-

BM 2p2`v

8XjyX *ahAL: "1hq11L huS1a

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

*biBM; #2ir22M ivT2b

_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

F2vrQ`/ /Q2b #bB+ +biBM;,

let x: i32 = 5;
let y = x as i64;

Ai QMHv HHQrb +2`iBM FBM/b Q7 +biBM;- ?Qr2p2`,


let a = [0u8, 0u8, 0u8, 0u8];
let b = a as u32; // four eights makes 32

h?Bb 2``Q`b rBi?,


error: non-scalar cast: `[u8; 4]` as `u32`
let b = a as u32; // four eights makes 32
^~~~~~~~

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

*>Sh1_ 8X auLhs L. a1JLhA*a

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)

Pi?2` i?M i?i- vQm`2 QM vQm` QrM5

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,

8XjRX aaP*Ah1. huS1a

kRj

trait Graph<N, E> {


fn has_edge(&self, &N, &N) -> bool;
fn edges(&self, &N) -> Vec<E>;
// etc
}

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 { ... }

Pm` /BbiM+2 +H+mHiBQM rQ`Fb `2;`/H2bb Q7 Qm`


 /Bbi`+iBQMX

Edge

ivT2- bQ i?2

bimz BM i?Bb bB;Mim`2 Bb Dmbi

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
}

LQr- Qm` +HB2Mib +M #2 #bi`+i Qp2`  ;Bp2M

Graph,

fn distance<G: Graph>(graph: &G, start: &G::N, end: &G::N) -> uint { ... }

LQ M22/ iQ /2H rBi? i?2 E/;2 ivT2 ?2`25


G2ib ;Q Qp2` HH i?Bb BM KQ`2 /2iBHX
.2}MBM; bbQ+Bi2/ ivT2b
G2ib #mBH/ i?i

Graph

i`BiX >2`2b i?2 /2}MBiBQM,

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

*>Sh1_ 8X auLhs L. a1JLhA*a

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>;
}

AKTH2K2MiBM; bbQ+Bi2/ ivT2b


Cmbi HBF2 Mv i`Bi- i`Bib i?i mb2 bbQ+Bi2/ ivT2b mb2 i?2
iBQMbX >2`2b  bBKTH2 BKTH2K2MiiBQM Q7 :`T?,

impl

F2vrQ`/ iQ T`QpB/2 BKTH2K2Mi@

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

HBM2- r?B+? Bb Dmbi HBF2 BKTH2K2MiBM; Mv Qi?2` i`BiX

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

8XjkX lLaAw1. huS1a

kR8

h`Bi Q#D2+ib rBi? bbQ+Bi2/ ivT2b


h?2`2b QM2 KQ`2 #Bi Q7 bvMit r2 b?QmH/ iHF #Qmi, i`Bi Q#D2+ibX A7 vQm i`v iQ +`2i2  i`Bi
Q#D2+i 7`QK M bbQ+Bi2/ ivT2- HBF2 i?Bb,
let graph = MyGraph;
let obj = Box::new(graph) as Box<Graph>;

uQmHH ;2i irQ 2``Q`b,


error: the value of the associated type `E` (from the trait `main::Graph`) must
be specified [E0191]
let obj = Box::new(graph) as Box<Graph>;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
24:44 error: the value of the associated type `N` (from the trait
`main::Graph`) must be specified [E0191]
let obj = Box::new(graph) as Box<Graph>;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

*>Sh1_ 8X auLhs L. a1JLhA*a

impl Foo for str {

Q`
impl<T> Foo for [T] {

AMbi2/- vQm rQmH/ ?p2 iQ r`Bi2,


impl Foo for &str {

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

PT2`iQ`b M/ Pp2`HQ/BM;

_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

QT2`iQ` +M #2 Qp2`HQ/2/ rBi? i?2

use std::ops::Add;
#[derive(Debug)]
struct Point {
x: i32,
y: i32,
}
impl Add for Point {
type Output = Point;

Add

i`Bi,

8XjjX PS1_hP_a L. Po1_GP.AL:

kRd

fn add(self, other: Point) -> Point {


Point { x: self.x + other.x, y: self.y + other.y }
}
}
fn main() {
let p1 = Point { x: 1, y: 0 };
let p2 = Point { x: 2, y: 3 };
let p3 = p1 + p2;
println!("{:?}", p3);
}

AM

main-

r2 +M mb2

QM Qm` irQ

Pointb-

bBM+2 r2p2 BKTH2K2Mi2/

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,

pub trait Add<RHS = Self> {


type Output;
fn add(self, rhs: RHS) -> Self::Output;
}

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
}
}

rBHH H2i vQm /Q i?Bb,


let p: Point = // ...
let x: f64 = p + 2i32;
j8 ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fQTbfBM/2tX?iKH

je ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fQTbfi`BiX//X?iKH

kR3

*>Sh1_ 8X auLhs L. a1JLhA*a

8Xj9

.2`27 +Q2`+BQMb

h?2 biM/`/ HB#``v T`QpB/2b  bT2+BH i`Bi/2`272`2M+2 QT2`iQ`,

Derefjd X

Aib MQ`KHHv mb2/ iQ Qp2`HQ/ *- i?2

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

8Xj9X .1_16 *P1_*APLa

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

.2`27 M/ K2i?Q/ +HHb


Deref

_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

*>Sh1_ 8X auLhs L. a1JLhA*a

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

8Xj8XR .2}MBM;  K+`Q


uQm Kv ?p2 b22M i?2
MmK#2` Q7 2H2K2MibX

vec!

K+`Q- mb2/ iQ BMBiBHBx2  p2+iQ` Ub2+iBQM 8XRd- T;2 Re3V rBi? Mv

let x: Vec<u32> = vec![1, 2, 3];

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
};

q2 +M BKTH2K2Mi i?Bb b?Q`i?M/- mbBM;  K+`Q,

j3

macro_rules! vec {
( $( $x:expr ),* ) => {
{
let mut temp_vec = Vec::new();
$(
temp_vec.push($x);
)*
temp_vec
}
};
}

q?Q- i?ib  HQi Q7 M2r bvMit5 G2ib #`2F Bi /QrMX


macro_rules! 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

*>Sh1_ 8X auLhs L. a1JLhA*a

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);

r2 ;2i i?2 +QKTBH2` 2``Q`


error: no rules expected the token `z`

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

$(...)* rHFb i?`Qm;? QM2 Hv2` Q7 `2T2iBiBQMb-

7Q` HH Q7 i?2 $nameb Bi +QMiBMb- BM HQ+Fbi2TM/


kX 2+? $name Kmbi #2 mM/2` i H2bi b KMv $(...)*b b Bi rb Ki+?2/ ;BMbiX A7 Bi Bb
mM/2` KQ`2- BiHH #2 /mTHB+i2/- b TT`QT`Bi2X
h?Bb #`Q[m2 K+`Q BHHmbi`i2b i?2 /mTHB+iBQM Q7 p`B#H2b 7`QK Qmi2` `2T2iBiBQM H2p2HbX
macro_rules! o_O {
(
$(
$x:expr; [ $( $y:expr ),* ]
);*
) => {
&[ $($( $x + $y ),*),* ]
}
}
fn main() {
let a: &[i32]
= o_O!(10; [1, 2, 3];
20; [4, 5, 6]);
assert_eq!(a, [11, 12, 13, 24, 25, 26]);
}

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

*>Sh1_ 8X auLhs L. a1JLhA*a

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); \
} \
})

>2`2b  bBKTH2 mb2 +b2 i?i ;Q2b i2``B#Hv r`QM;,


const char *state = "reticulating splines";
LOG(state)

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

*>Sh1_ 8X auLhs L. a1JLhA*a

h?Bb ?QH/b 7Q`


+QKTBH2,

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();
}

8Xj8Xj _2+m`bBp2 K+`Qb


 K+`Qb 2tTMbBQM +M BM+Hm/2 KQ`2 K+`Q BMpQ+iBQMb- BM+Hm/BM; BMpQ+iBQMb Q7 i?2 p2`v bK2
K+`Q #2BM; 2tTM/2/X h?2b2 `2+m`bBp2 K+`Qb `2 mb27mH 7Q` T`Q+2bbBM; i`22@bi`m+im`2/ BMTmib BHHmbi`i2/ #v i?Bb UbBKTHBbiB+V >hJG b?Q`i?M/,
macro_rules! write_html {
($w:expr, ) => (());
($w:expr, $e:tt) => (write!($w, "{}", $e));
($w:expr, $tag:ident [ $($inner:tt)* ] $($rest:tt)*) => {{
write!($w, "<{}>", stringify!($tag));
write_html!($w, $($inner)*);
write!($w, "</{}>", stringify!($tag));
write_html!($w, $($rest)*);
}};
}
fn main() {
use std::fmt::Write;
let mut out = String::new();
write_html!(&mut out,
html[
head[title["Macros guide"]]
body[h1["Macros are the best!"]]
]);
assert_eq!(out,
"<html><head><title>Macros guide</title></head>\
<body><h1>Macros are the best!</h1></body></html>");
}
9j ?iiT,ff/Q+X`mbi@HM;XQ`;f`272`2M+2X?iKHOBi2Kb

8Xj8X J*_Pa

8Xj8X9

kkd

.2#m;;BM; K+`Q +Q/2

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`

x2`Q Q` KQ`2 Bi2Kbx2`Q Q` KQ`2 K2i?Q/bM 2tT`2bbBQM bii2K2Mi- Q`


 Tii2`MX

 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

*>Sh1_ 8X auLhs L. a1JLhA*a

 b2[m2M+2 Q7 iQF2M i`22b bm``QmM/2/ #v Ki+?BM;


Mv Qi?2` bBM;H2 iQF2MX

()- []-

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,

M B/2MiB}2`X 1tKTH2b, xc fooX


 [mHB}2/ MK2X 1tKTH2, T::SpecialAX
expr, M 2tT`2bbBQMX 1tKTH2b, 2 + 2c if true then { 1 } else { 2 }c f(42)X
ty,  ivT2X 1tKTH2b, i32c Vec<(char, String)>c &TX
pat,  Tii2`MX 1tKTH2b, Some(t)c (17, 'a')c _X
stmt,  bBM;H2 bii2K2MiX 1tKTH2, let x = 3X
block,  #`+2@/2HBKBi2/ b2[m2M+2 Q7 bii2K2MibX 1tKTH2, { log(error, "hi"); return
12; }X
item, M Bi2K98 X 1tKTH2b, fn foo() { }c struct Bar;X
meta,  K2i Bi2K- b 7QmM/ BM ii`B#mi2bX 1tKTH2, cfg(target_os = "windows")X
tt,  bBM;H2 iQF2M i`22X
path,

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

8Xj8Xe a+QTBM; M/ K+`Q BKTQ`if2tTQ`i


J+`Qb `2 2tTM/2/ i M 2`Hv bi;2 BM +QKTBHiBQM- #27Q`2 MK2 `2bQHmiBQMX PM2 /QrMbB/2 Bb
i?i b+QTBM; rQ`Fb /Bz2`2MiHv 7Q` K+`Qb- +QKT`2/ iQ Qi?2` +QMbi`m+ib BM i?2 HM;m;2X
.2}MBiBQM M/ 2tTMbBQM Q7 K+`Qb #Qi? ?TT2M BM  bBM;H2 /2Ti?@}`bi- H2tB+H@Q`/2` i`p2`bH
Q7  +`i2b bQm`+2X aQ  K+`Q /2}M2/ i KQ/mH2 b+QT2 Bb pBbB#H2 iQ Mv bm#b2[m2Mi +Q/2 BM i?2
bK2 KQ/mH2- r?B+? BM+Hm/2b i?2 #Q/v Q7 Mv bm#b2[m2Mi +?BH/ mod Bi2KbX
 K+`Q /2}M2/ rBi?BM i?2 #Q/v Q7  bBM;H2
QMHv rBi?BM i?i Bi2KX

fn-

Q` Mvr?2`2 2Hb2 MQi i KQ/mH2 b+QT2- Bb pBbB#H2

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

h?2 macro_use ii`B#mi2 +M HbQ TT2` QM extern


K+`Qb `2 HQ/2/ 7`QK i?2 2ti2`MH +`i2- 2X;X

crateX

AM i?Bb +QMi2ti Bi +QMi`QHb r?B+?

#[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

q?2M i?Bb HB#``v Bb HQ/2/ rBi?

#[macro_use] extern crate-

QMHv

h?2 _mbi _272`2M+2 ?b  HBbiBM; Q7 K+`Q@`2Hi2/ ii`B#mi2b9e X


9e ?iiT,ff/Q+X`mbi@HM;XQ`;f`272`2M+2X?iKHOK+`Q@`2Hi2/@ii`B#mi2b

m2

rBHH #2 BKTQ`i2/X

kjy

*>Sh1_ 8X auLhs L. a1JLhA*a

8Xj8Xd h?2 p`B#H2

$crate

 7m`i?2` /B{+mHiv Q++m`b r?2M  K+`Q Bb mb2/ BM KmHiBTH2 +`i2bX av i?i

mylib

/2}M2b

pub fn increment(x: u32) -> u32 {


x + 1
}
#[macro_export]
macro_rules! inc_a {
($x:expr) => ( ::increment($x) )
}
#[macro_export]
macro_rules! inc_b {
($x:expr) => ( ::mylib::increment($x) )
}
inc_a QMHv rQ`Fb rBi?BM mylib- r?BH2 inc_b QMHv rQ`Fb QmibB/2 i?2 HB#``vX 6m`i?2`KQ`2rBHH #`2F B7 i?2 mb2` BKTQ`ib mylib mM/2` MQi?2` MK2X

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

8Xj8X3 h?2 /22T 2M/


h?2 BMi`Q/m+iQ`v +?Ti2` K2MiBQM2/ `2+m`bBp2 K+`Qb- #mi Bi /B/ MQi ;Bp2 i?2 7mHH biQ`vX _2+m`bBp2
K+`Qb `2 mb27mH 7Q` MQi?2` `2bQM, 1+? `2+m`bBp2 BMpQ+iBQM ;Bp2b vQm MQi?2` QTTQ`imMBiv
iQ Tii2`M@Ki+? i?2 K+`Qb `;mK2MibX
b M 2ti`2K2 2tKTH2- Bi Bb TQbbB#H2- i?Qm;? ?`/Hv /pBb#H2- iQ BKTH2K2Mi i?2 "BirBb2 *v+HB+
h;9d miQKiQM rBi?BM _mbib K+`Q bvbi2KX
9d ?iiT,ff2bQHM;bXQ`;frBFBf"BirBb2n*v+HB+nh;

8Xj8X J*_Pa

kjR

macro_rules! bct {
// cmd 0:

d ... => ...

(0, $($ps:tt),* ; $_d:tt)


=> (bct!($($ps),*, 0 ; ));
(0, $($ps:tt),* ; $_d:tt, $($ds:tt),*)
=> (bct!($($ps),*, 0 ; $($ds),*));
// cmd 1p:

1 ... => 1 ... p

(1, $p:tt, $($ps:tt),* ; 1)


=> (bct!($($ps),*, 1, $p ; 1, $p));
(1, $p:tt, $($ps:tt),* ; 1, $($ds:tt),*)
=> (bct!($($ps),*, 1, $p ; 1, $($ds),*, $p));
// cmd 1p:

0 ... => 0 ...

(1, $p:tt, $($ps:tt),* ; $($ds:tt),*)


=> (bct!($($ps),*, 1, $p ; $($ds),*));
// halt on empty data string
( $($ps:tt),* ; )
=> (());
}

1t2`+Bb2, mb2 K+`Qb iQ `2/m+2 /mTHB+iBQM BM i?2 #Qp2 /2}MBiBQM Q7 i?2

8Xj8XN

bct!

K+`QX

*QKKQM K+`Qb

>2`2 `2 bQK2 +QKKQM K+`Qb vQmHH b22 BM _mbi +Q/2X


TMB+5
h?Bb K+`Q +mb2b i?2 +m``2Mi i?`2/ iQ TMB+X uQm +M ;Bp2 Bi  K2bb;2 iQ TMB+ rBi?,
panic!("oh no!");

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

let v = vec![1, 2, 3, 4, 5];

Ai HbQ H2ib vQm KF2 p2+iQ`b rBi? `2T2iBM; pHm2bX 6Q` 2tKTH2-  ?mM/`2/ x2`Q2b,
let v = vec![0; 100];

kjk

*>Sh1_ 8X auLhs L. a1JLhA*a

bb2`i5 M/ bb2`in2[5


h?2b2 irQ K+`Qb `2 mb2/ BM i2bibX assert! iF2b  #QQH2M- M/
M/ +QKT`2b i?2KX h`mi? Tbb2b- bm++2bb panic!bX GBF2 i?Bb,

assert_eq!

iF2b irQ pHm2b

// 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(())
}

h?Bb Bb +H2M2` i?M /QBM; i?Bb,


use std::fs::File;
fn foo() -> std::io::Result<()> {
let f = File::create("foo.txt");
let f = match f {
Ok(t) => t,
Err(e) => return Err(e),
};
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

8XjeX _q SPALh1_a

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

*>Sh1_ 8X auLhs L. a1JLhA*a

/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;

>Qr2p2`- /2`272`2M+BM; QM2 Bb MQiX h?Bb rQMi rQ`F,


let x = 5;
let raw = &x as *const i32;
println!("raw points at {}", *raw);

Ai ;Bp2b i?Bb 2``Q`,


error: dereference of unsafe pointer requires unsafe function or block [E0133]
println!("raw points at{}", *raw);
^~~~

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);

6Q` KQ`2 QT2`iBQMb QM `r TQBMi2`b- b22 i?2B` SA /Q+mK2MiiBQM93 X


93 ?iiT,ff/Q+X`mbi@HM;XQ`;fbi/fT`BKBiBp2XTQBMi2`X?iKH

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*-

_272`2M+2b M/ `r TQBMi2`b

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

Bb mb2/ BM irQ +QMi2tibX h?2 }`bi

kje

*>Sh1_ 8X auLhs L. a1JLhA*a

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

8XjdXR q?i /Q2b b72 K2M\


a72- BM i?2 +QMi2ti Q7 _mbi- K2Mb /Q2bMi /Q Mvi?BM; mMb72X 1bv5
PFv- H2ib i`v ;BM, r?i Bb MQi b72 iQ /Q\ >2`2b  HBbi,

.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

.2`272`2M+2  `r TQBMi2`


_r TQBMi2`b H2i vQm /Q `#Bi``v TQBMi2` `Bi?K2iB+- M/ +M +mb2  MmK#2` Q7 /Bz2`2Mi K2KQ`v
b72iv M/ b2+m`Biv Bbbm2bX AM bQK2 b2Mb2b- i?2 #BHBiv iQ /2`272`2M+2 M `#Bi``v TQBMi2` Bb QM2
Q7 i?2 KQbi /M;2`Qmb i?BM;b vQm +M /QX 6Q` KQ`2 QM `r TQBMi2`b- b22 i?2B` b2+iBQM Q7 i?2 #QQF
Ub2+iBQM 8Xje- T;2 kjjVX
8k +QMbi@M/@biiB+X?iKHObiiB+
8j +QMbi@M/@biiB+X?iKHObiiB+

kj3

*>Sh1_ 8X auLhs L. a1JLhA*a

*HH mMb72 7mM+iBQMb


h?Bb Hbi #BHBiv rQ`Fb rBi? #Qi? bT2+ib Q7
7`QK BMbB/2 M mMb72 #HQ+FX

unsafe,

vQm +M QMHv +HH 7mM+iBQMb K`F2/

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,

$ curl -s https://static.rust-lang.org/rustup.sh | sh -s -- --channel=nightly

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

*>Sh1_ eX LA:>hGu _lah


.msi

M/ Bi rBHH ;Bp2 vQm M mMBMbiHH QTiBQMX

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,

rustc 1.0.0-nightly (f11f3e7ba 2015-01-04) (built 2015-01-06)

A7 vQm /B/- _mbi ?b #22M BMbiHH2/ bm++2bb7mHHv5 *QM;`ib5


h?Bb BMbiHH2` HbQ BMbiHHb  +QTv Q7 i?2 /Q+mK2MiiBQM HQ+HHv- bQ vQm +M `2/ Bi Q|BM2X PM
lLAs bvbi2Kb- /usr/local/share/doc/rust Bb i?2 HQ+iBQMX PM qBM/Qrb- Bib BM  share/doc
/B`2+iQ`v- BMbB/2 r?2`2p2` vQm BMbiHH2/ _mbi iQX
A7 MQi- i?2`2 `2  MmK#2` Q7 TH+2b r?2`2 vQm +M ;2i ?2HTX h?2 2bB2bi Bb i?2 O`mbi A_* +?MM2H
QM B`+XKQxBHHXQ`;d - r?B+? vQm +M ++2bb i?`Qm;? JB##Bi3 X *HB+F i?i HBMF- M/ vQmHH #2 +?iiBM;
rBi? Qi?2` _mbi+2Mb U bBHHv MB+FMK2 r2 +HH Qm`b2Hp2bV- M/ r2 +M ?2HT vQm QmiX Pi?2` ;`2i
`2bQm`+2b BM+Hm/2 i?2 mb2`b 7Q`mKN - M/ ai+F Pp2`~QrRy X
8 ?iiTb,ff;Bi?m#X+QKf`mbi@HM;f`mbiO#mBH/BM;@7`QK@bQm`+2
e ?iiT,ffrrrX`mbi@HM;XQ`;fBMbiHHX?iKH
d B`+,ffB`+XKQxBHHXQ`;fO`mbi

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

eXRX *PJSAG1_ SGl:ALa

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

i?i BKTH2K2Mib _QKM MmK2`H BMi2;2` HBi2`HbX

#![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;

// trait for expr_usize

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

*>Sh1_ eX LA:>hGu _lah

static NUMERALS: &'static [(&'static str, u32)] = &[


("M", 1000), ("CM", 900), ("D", 500), ("CD", 400),
("C",

100), ("XC",

90), ("L",

50), ("XL",

40),

("X",

10), ("IX",

9), ("V",

5), ("IV",

4),

("I",

1)];

let text = match args {


[TtToken(_, token::Ident(s, _))] => token::get_ident(s).to_string(),
_ => {
cx.span_err(sp, "argument should be a single identifier");
return DummyResult::any(sp);
}
};
let mut text = &*text;
let mut total = 0;
while !text.is_empty() {
match NUMERALS.iter().find(|&&(rn, _)| text.starts_with(rn)) {
Some(&(rn, val)) => {
total += val;
text = &text[rn.len()..];
}
None => {
cx.span_err(sp, "invalid Roman numeral");
return DummyResult::any(sp);
}
}
}
MacEager::expr(cx.expr_u32(sp, total))
}
#[plugin_registrar]
pub fn plugin_registrar(reg: &mut Registry) {
reg.register_macro("rn", expand_rn);
}

h?2M r2 +M mb2

rn!()

HBF2 Mv Qi?2` K+`Q,

#![feature(plugin)]
#![plugin(roman_numerals)]
fn main() {
assert_eq!(rn!(MMXV), 2015);
}

h?2 /pMi;2b Qp2`  bBKTH2

fn(&str) -> u32

`2,

eXRX *PJSAG1_ SGl:ALa

k9j

h?2 U`#Bi``BHv +QKTH2tV +QMp2`bBQM Bb /QM2 i +QKTBH2 iBK2X


AMTmi pHB/iBQM Bb HbQ T2`7Q`K2/ i +QKTBH2 iBK2X
Ai +M #2 2ti2M/2/ iQ HHQr mb2 BM Tii2`Mb- r?B+? 2z2+iBp2Hv ;Bp2b  rv iQ /2}M2 M2r
HBi2`H bvMit 7Q` Mv /i ivT2X
AM //BiBQM iQ T`Q+2/m`H K+`Qb- vQm +M /2}M2 M2r deriveR8 @HBF2 ii`B#mi2b M/ Qi?2` FBM/b Q7
2ti2MbBQMbX a22 Registry::register_syntax_extensionRe M/ i?2 SyntaxExtension 2MmKRd X 6Q`
 KQ`2 BMpQHp2/ K+`Q 2tKTH2- b22 regex_macrosR3 X
hBTb M/ i`B+Fb
aQK2 Q7 i?2 K+`Q /2#m;;BM; iBTbRN `2 TTHB+#H2X
uQm +M mb2 syntax::parseky iQ im`M iQF2M i`22b BMiQ ?B;?2`@H2p2H bvMit 2H2K2Mib HBF2 2tT`2bbBQMb,
fn expand_foo(cx: &mut ExtCtxt, sp: Span, args: &[TokenTree])
-> Box<MacResult+'static> {
let mut parser = cx.new_parser_from_tts(args);
let expr: P<Expr> = parser.parse_expr();

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

rBHH BKK2/Bi2Hv #Q`i +QKTBHiBQMX Aib #2ii2` iQ BMbi2/ +HH


M/ `2im`M DummyResultke - bQ i?i i?2 +QKTBH2` +M +QMiBMm2 M/ }M/ 7m`i?2`

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

*>Sh1_ eX LA:>hGu _lah

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

eXRXj GBMi THm;BMb


SHm;BMb +M 2ti2M/ _mbib HBMi BM7`bi`m+im`2jR rBi? //BiBQMH +?2+Fb 7Q` +Q/2 bivH2- b72iv- 2i+X
uQm +M b22 src/test/auxiliary/lint_plugin_test.rsjk 7Q`  7mHH 2tKTH2- i?2 +Q`2 Q7 r?B+? Bb
`2T`Q/m+2/ ?2`2,
declare_lint!(TEST_LINT, Warn,
"Warn about items named 'lintme'");
struct Pass;
impl LintPass for Pass {
fn get_lints(&self) -> LintArray {
lint_array!(TEST_LINT)
}
fn check_item(&mut self, cx: &Context, it: &ast::Item) {
let name = token::get_ident(it.ident);
if name.get() == "lintme" {
cx.span_lint(TEST_LINT, it.span, "item is named 'lintme'");
}
}
}
#[plugin_registrar]
pub fn plugin_registrar(reg: &mut Registry) {
reg.register_lint_pass(box Pass as LintPassObject);
}

h?2M +Q/2 HBF2


#![plugin(lint_plugin_test)]
fn lintme() { }

rBHH T`Q/m+2  +QKTBH2` r`MBM;,


foo.rs:4:1: 4:16 warning: item is named 'lintme', #[warn(test_lint)] on by default
foo.rs:4 fn lintme() { }
^~~~~~~~~~~~~~~

h?2 +QKTQM2Mib Q7  HBMi THm;BM `2,


jR ?iiT,ff/Q+X`mbi@HM;XQ`;f`272`2M+2X?iKHOHBMi@+?2+F@ii`B#mi2b

jk ?iiTb,ff;Bi?m#X+QKf`mbi@HM;f`mbif#HQ#fKbi2`fb`+fi2bifmtBHB`vfHBMinTHm;BMni2biX`b

eXkX ALGAL1 aa1J"Gu


QM2 Q` KQ`2

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-

BM+Hm/BM; i?Qb2 T`QpB/2/

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
);

Mv mb2 Q7 asm Bb 72im`2 ;i2/ U`2[mB`2b


`2[mB`2b M unsafe #HQ+FX

#![feature(asm)]

QM i?2 +`i2 iQ HHQrV M/ Q7 +Qm`b2

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

Bb i?2 QMHv `2[mB`2/ T`K2i2` M/ Kmbi #2  HBi2`H bi`BM; UBX2X

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

*>Sh1_ eX LA:>hGu _lah

#![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

`2 QKBii2/ 7`QK MQr QMXV

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}"
);
# } }

q?Bi2bT+2 HbQ /Q2bMi Kii2`,


# #![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/,

eXkX ALGAL1 aa1J"Gu

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

*>Sh1_ eX LA:>hGu _lah

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-

Bb bT2+B}+ iQ _mbiX h?2 7Q`Ki Bb +QKK b2T`i2/ HBi2`H bi`BM;b UBX2X


Aib mb2/ iQ bT2+B7v bQK2 2ti` BM7Q #Qmi i?2 BMHBM2 bb2K#Hv,

options

:"foo", "bar", "baz"VX

*m``2Mi pHB/ QTiBQMb `2,


RX pQHiBH2 @ bT2+B7vBM; i?Bb Bb MHQ;Qmb iQ __asm__ __volatile__ (...) BM ;++f+HM;X
kX HB;Mbi+F @ +2`iBM BMbi`m+iBQMb 2tT2+i i?2 bi+F iQ #2 HB;M2/  +2`iBM rv UBX2X aa1V M/
bT2+B7vBM; i?Bb BM/B+i2b iQ i?2 +QKTBH2` iQ BMb2`i Bib mbmH bi+F HB;MK2Mi +Q/2
jX BMi2H @ mb2 BMi2H bvMit BMbi2/ Q7 i?2 /27mHi hhX
# #![feature(asm)]
# #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
# fn main() {
let result: i32;
unsafe {
asm!("mov eax, 2" : "={eax}"(result) : : : "intel")
}
println!("eax is currently {}", result);
# }

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]

Bb Tbb2/ i?2 +QKKM/ HBM2 T`K2i2`b BM i?2 bK2 7Q`Ki b *,

#![feature(lang_items, start, no_std, libc)]


#![no_std]
// Pull in the system libc library for what crt0.o likely requires

eXjX LP ah.GA"

k9N

extern crate libc;


// Entry point for this program
#[start]
fn start(_argc: isize, _argv: *const *const u8) -> isize {
0
}
// These functions and traits are used by the compiler, but not
// for a bare-bones hello world. These are normally
// provided by libstd.
#[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!

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

*>Sh1_ eX LA:>hGu _lah

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

*>Sh1_ eX LA:>hGu _lah

fn offset<T>(dst: *const T, offset: isize) -> *const T;


}

b rBi? Mv Qi?2` 66A 7mM+iBQMb- i?2b2 `2 Hrvb

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)
}

eXeX GALE _:a

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

*>Sh1_ eX LA:>hGu _lah

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

72im`2 ;i2- r?B+? 2M#H2b i?Bb mMbi#H2 72im`2X

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

eXdX "1L*>J_E h1aha

k88

test tests::it_works ... ignored


test tests::bench_add_two ... bench:

1 ns/iter (+/- 0)

test result: ok. 0 passed; 0 failed; 1 ignored; 1 measured

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);
});
}

;Bp2b i?2 7QHHQrBM; `2bmHib


running 1 test
test bench_xor_1000_ints ... bench:

0 ns/iter (+/- 0)

test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured

k8e

*>Sh1_ eX LA:>hGu _lah

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:

131 ns/iter (+/- 3)

test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured

>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

"Qt avMit M/ Sii2`Mb

*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 {

eX3X "Ps auLhs L. Shh1_La

k8d

Some(box n) if n < 0 => {


println!("Box contains negative number {}", n);
},
Some(box n) if n >= 0 => {
println!("Box contains non-negative number {}", n);
},
None => {
println!("No box");
},
_ => unreachable!()
}
}

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

*>Sh1_ eX LA:>hGu _lah

#![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);
}

h?Bb ;Bp2b vQm ~2tB#BHBiv rBi?Qmi b+`B}+BM; T2`7Q`KM+2X


uQm Kv i?BMF i?i i?Bb ;Bp2b mb i2``B#H2 T2`7Q`KM+2, `2im`M  pHm2 M/ i?2M BKK2/Bi2Hv #Qt
Bi mT \5 AbMi i?Bb Tii2`M i?2 rQ`bi Q7 #Qi? rQ`H/b\ _mbi Bb bK`i2` i?M i?iX h?2`2 Bb MQ +QTv
BM i?Bb +Q/2X main HHQ+i2b 2MQm;? `QQK 7Q` i?2 box- Tbb2b  TQBMi2` iQ i?i K2KQ`v BMiQ foo
b x- M/ i?2M foo r`Bi2b i?2 pHm2 bi`B;?i BMiQ i?2 Box<T>X
h?Bb Bb BKTQ`iMi 2MQm;? i?i Bi #2`b `2T2iBM;, TQBMi2`b `2 MQi 7Q` QTiBKBxBM; `2im`MBM; pHm2b
7`QK vQm` +Q/2X HHQr i?2 +HH2` iQ +?QQb2 ?Qr i?2v rMi iQ mb2 vQm` QmiTmiX

eXN

aHB+2 Sii2`Mb

A7 vQm rMi iQ Ki+? ;BMbi  bHB+2 Q` ``v- vQm +M mb2

&

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),
_ => {},
}
}

eXRyX aaP*Ah1. *PLahLha

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

72im`2- vQm +M /2}M2 +QMbiMib HBF2 i?Bb,

#![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

rBHH ?p2 iQ /2}M2

#![feature(associated_consts)]
trait Foo {
const ID: i32;
}

IDX

qBi?Qmi i?2 /2}MBiBQM,

key

*>Sh1_ eX LA:>hGu _lah

impl Foo for i32 {


}

;Bp2b
error: not all trait items implemented, missing: `ID` [E0046]
impl Foo for i32 {
}

 /27mHi pHm2 +M #2 BKTH2K2Mi2/ b r2HH,


#![feature(associated_consts)]
trait Foo {
const ID: i32 = 1;
}
impl Foo for i32 {
}
impl Foo for i64 {
const ID: i32 = 5;
}
fn main() {
assert_eq!(1, i32::ID);
assert_eq!(5, i64::ID);
}

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);

AM i?2 2tKTH2 #Qp2

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

rQmH/ HQQF HBF2 i?Bb,

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

_2;BQM #b2/ K2KQ`v KM;2K2Mi BM *v+HQM2R


a72 KMmH K2KQ`v KM;2K2Mi BM *v+HQM2k
hvT2+Hbb2b, KFBM; /@?Q+ TQHvKQ`T?BbK H2bb / ?Q+j
J+`Qb i?i rQ`F iQ;2i?2`9
h`Bib, +QKTQb#H2 mMBib Q7 #2?pBQ`8
HBb #m`vBM;e @ q2 i`B2/ bQK2i?BM; bBKBH` M/ #M/QM2/ BiX
1ti2`MH mMB[m2M2bb Bb mMB[m2 2MQm;?d
lMB[m2M2bb M/ _272`2M+2 AKKmi#BHBiv 7Q` a72 S`HH2HBbK3
_2;BQM "b2/ J2KQ`v JM;2K2MiN

*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

*>Sh1_ 3X *.1JA* _1a1_*>


GM;m;2 bmTTQ`i 7Q` 7bi M/ `2HB#H2 K2bb;2 TbbBM; BM bBM;mH`Biv PaRR
a+?2/mHBM; KmHiBi?`2/2/ +QKTmiiBQMb #v rQ`F bi2HBM;Rk
h?`2/ b+?2/mHBM; 7Q` KmHiBT`Q;`KKBM; KmHiBT`Q+2bbQ`bRj
h?2 /i HQ+HBiv Q7 rQ`F bi2HBM;R9
.vMKB+ +B`+mH` rQ`F bi2HBM; /2[m2R8 @ h?2 *?b2fG2p /2[m2
qQ`F@}`bi M/ ?2HT@}`bi b+?2/mHBM; TQHB+B2b 7Q` bvM+@}MBb? ibF T`HH2HBbKRe @ JQ`2 ;2M@
2`H i?M 7mHHv@bi`B+i rQ`F bi2HBM;
 Cp 7Q`FfDQBM +HKBivRd @ +`BiB[m2 Q7 Cpb 7Q`FfDQBM HB#``v- T`iB+mH`Hv Bib TTHB+iBQM
Q7 rQ`F bi2HBM; iQ MQM@bi`B+i +QKTmiiBQM
a+?2/mHBM; i2+?MB[m2b 7Q` +QM+m``2Mi bvbi2KbR3
*QMi2MiBQM r`2 b+?2/mHBM;RN
"HM+2/ rQ`F bi2HBM; 7Q` iBK2@b?`BM; KmHiB+Q`2bky
h?`22 Hv2` +F2kR
LQM@#HQ+FBM; bi2H@?H7 rQ`F [m2m2bkk
_2;2Mib, 2tT`2bbBM; M/ +QKTQbBM; }M2@;`BM2/ +QM+m``2M+vkj
H;Q`Bi?Kb 7Q` b+H#H2 bvM+?`QMBxiBQM Q7 b?`2/@K2KQ`v KmHiBT`Q+2bbQ`bk9

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

You might also like