if
ν
μ€νΈμμ λ³κ²½ λΆκ°λ₯νκ² μ°¨μ©νλ κ²½μ° μ°¨μ©μ μ 체 if
ννμμ λν΄ μ§μλ©λλ€. μ΄λ μ μμ λ³κ²½ κ°λ₯ν μ°¨μ©μΌλ‘ μΈν΄ μ°¨μ© κ²μ¬κΈ°κ° μ€ν¨ν¨μ μλ―Έν©λλ€.
μ΄λ match ννμμμ μ°¨μ©νκ³ ν μ€ νλμμ κ°λ³ μ°¨μ©μ΄ νμν κ²½μ°μλ λ°μν μ μμ΅λλ€.
κ°μ₯ κ°κΉμ΄ μμͺ½ @mut
κ° κ³ μ λλλ‘ νλ ifκ° μμλ₯Ό λΉλ¦° μλ₯Ό λ³΄λ €λ©΄ μ¬κΈ°λ₯Ό μ°Έμ‘°νμμμ€. κ·Έλ° λ€μ κ°λ³μ μΌλ‘ μ°¨μ©ν΄μΌ νλ remove_child()
κ° μΆ©λν©λλ€.
https://github.com/mozilla/servo/blob/master/src/servo/layout/box_builder.rs#L387 -L411
@Wyveraldμ μ λ°μ΄νΈλ μ
fn main() {
let mut vec = vec!();
match vec.first() {
None => vec.push(5),
Some(v) => unreachable!(),
}
}
μμ° μ€λΉλ₯Ό μν μ§λͺ
λλ μ΄κ²μ μ μ μλκ±°λ μ΄μ λ²μ κ³Ό νΈνλλ€κ³ λΆλ₯Ό κ²μ λλ€.
μμ μ
[09:57:06]
[10:02:06]
μ½λκ° μ¬κ΅¬μ±λμμ§λ§ λ€μμ λ΄κ° μνν΄μΌ νλ λΉλ¦Ό κ²μ¬κΈ°μ ꡬ체μ μΈ νμ μ λλ€.
https://github.com/metajack/servo/commit/5324cabbf8757fa68b1aa36548b992041be94ef9
https://github.com/metajack/servo/commit/7234635aa580c8a821003882e77d8e043d247687
μ½κ°μ ν λ‘ νμ, μ¬κΈ°μ μ§μ§ λ¬Έμ λ μ°¨μ© κ²μ¬κΈ°κ° λ³μΉμ μΆμ νκΈ° μν΄ λ Έλ ₯νμ§ μκ³ μ°¨μ©μ΄ λ²μλ₯Ό λ²μ΄λ λλ₯Ό κ²°μ νκΈ° μν΄ νμ μ§μ μμ€ν μ μμ‘΄νλ€λ κ²μ λλ€. λλ μ΄κ²μ λ³κ²½νκΈ°λ₯Ό κΊΌλ €ν©λλ€. μ μ΄λ λ¨κΈ°μ μΌλ‘λ κ·Έλ μ§ μμ΅λλ€. μλνλ©΄ λ¨Όμ ν΄κ²°νκ³ μΆμ λ€λ₯Έ λ§μ λ―Έν΄κ²° λ¬Έμ κ° μκ³ λͺ¨λ λ³κ²½μ μ°¨μ© κ²μ¬κΈ°μ μλΉν μμ μ΄ λ κ²μ΄κΈ° λλ¬Έμ λλ€. λ€λ₯Έ κ΄λ ¨ μμ λ€μ μμΈν μ€λͺ μ λ¬Έμ #6613μ μ°Έμ‘°νμμμ€.
λ¬΄μ¨ μΌμ΄ μΌμ΄λκ³ μλμ§ λ λͺ ννκ² νκΈ° μν΄ μ€λ₯ λ©μμ§λ₯Ό κ°μ ν μ μλμ§ κΆκΈν©λλ€. μ΄ν λ²μλ λΉκ΅μ μ΄ν΄νκΈ° μ½μ§λ§, λ΄κ° μ°μ°ν λ°κ²¬ν μ΄ λ¬Έμ μ μμμ λ¬΄μ¨ μΌμ΄ μΌμ΄λκ³ μλμ§ κ²°μ½ λΆλͺ νμ§ μμμ΅λλ€.
μ΄μ ν/μ§λͺ μ μ κ±°νλ λ²κ·ΈμΌ λΏμ λλ€.
λ¨Ό λ―Έλμ μ΄μ νλ‘ λ°μλ€μ¬μ§
λΆλ₯ λ²ν
μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ κ°μ₯ μ’μ λ°©λ²μ λν΄ λͺ κ°μ§ μκ°μ νμ΅λλ€. λ΄ κΈ°λ³Έ κ³νμ κ°μ΄ "μ΄μ€μΌμ΄ν"ν λμ κ°λ μ κ°λ κ²μ λλ€. κ·Έ κ°λ μ 곡μννλ €λ©΄ μ½κ°μ μμ μ΄ νμν©λλ€. κΈ°λ³Έμ μΌλ‘ λΉλ¦° ν¬μΈν°κ° μμ±λλ©΄ μ΄ ν¬μΈν°κ° νμΆνλμ§ μΆμ ν©λλ€. ν¬μΈν°κ° μ£½μμ λ ν¬μΈν°κ° μ΄μ€μΌμ΄νλμ§ μμ κ²½μ° μ΄λ λμΆμ μ’ λ£νλ κ²μΌλ‘ κ°μ£Όλ μ μμ΅λλ€. μ΄ κΈ°λ³Έ μμ΄λμ΄λ "let p = &...; use-pa-bit-but-never-again; expect-loan-to-be-expired-here;"μ κ°μ κ²½μ°λ₯Ό λ€λ£Ήλλ€. λΆμμ μΌλΆλ λΉλ¦° ν¬μΈν°λ₯Ό ν¬ν¨νλ λ°ν κ°μ΄ μμ§ μ΄μ€μΌμ΄νλμ§ μμ κ²μΌλ‘ κ°μ£Όλ μ μλ κ²½μ°λ₯Ό λνλ΄λ κ·μΉμ΄ λ κ²μ λλ€. μ΄κ²μ "match table.find(...) { ... None => { expect-table-not-to-be-loaned-here; } }"μ κ°μ κ²½μ°λ₯Ό λ€λ£Ήλλ€.
μ΄ λͺ¨λ κ²μ κ°μ₯ ν₯λ―Έλ‘μ΄ λΆλΆμ λ¬Όλ‘ μ΄μ€μΌμ΄ν κ·μΉμ
λλ€. κ·μΉμ ν¨μμ νμμ μ μλ₯Ό κ³ λ €ν΄μΌ νκ³ νΉν μλͺ
μ΄ μ 곡νλ μ§μμ νμ©ν΄μΌ νλ€κ³ μκ°ν©λλ€. μλ₯Ό λ€μ΄, λλΆλΆμ μ΄μ€μΌμ΄ν λΆμμ foo(p)
μ κ°μ νΈμΆμ λ³Ό κ²½μ° μ΄μ€μΌμ΄ν p
ν¬μΈν°λ₯Ό κ³ λ €ν©λλ€. κ·Έλ¬λ λ°λμ κ·Έλ κ² ν νμλ μμ΅λλ€. ν¨μκ° λ€μκ³Ό κ°μ΄ μ μΈλ κ²½μ°:
fn foo<'a>(x: &'a T) { ... }
κ·Έλ¬λ©΄ μ€μ λ‘ foo
κ° a
μλͺ
λ³΄λ€ λ μ€λ p
λ₯Ό μ μ§νμ§ μλλ€λ κ²μ μκ³ μμ΅λλ€. κ·Έλ¬λ bar
μ κ°μ ν¨μλ μ΄μ€μΌμ΄ν μ²λ¦¬λ‘ κ°μ£Όλμ΄μΌ ν©λλ€.
fn bar<'a>(x: &'a T, y: &mut &'a T)
λ°λΌμ μλ§λ μ΄μ€μΌμ΄ν κ·μΉμ λ°μΈλ©λ μλͺ
μ΄ λ³κ²½ κ°λ₯ν μμΉμ λνλλμ§ μ¬λΆλ₯Ό κ³ λ €ν΄μΌ ν©λλ€. μ΄κ²μ μ¬μ€μ μ ν κΈ°λ° λ³μΉ λΆμμ ν ννμ
λλ€. λΉμ·ν μΆλ‘ μ΄ ν¨μ λ°ν κ°μλ μ μ©λλ€κ³ μκ°ν©λλ€. λ°λΌμ find
λ μ΄μ€μΌμ΄νλμ§ μμ κ²°κ³Όλ₯Ό λ°ννλ κ²μΌλ‘ κ°μ£Όλμ΄μΌ ν©λλ€.
fn find<'a>(&'a self, k: &K) -> Option<&'a V>
κ·Έ μ΄μ λ 'a
κ° find
μ λ°μΈλ©λμ΄ μκΈ° λλ¬Έμ 'a
Self
λλ K
μ ν 맀κ°λ³μμ λνλ μ μκΈ° λλ¬Έμ κ°λ₯νλ€λ κ²μ μκ³ μμ΅λλ€. t κ·Έκ²λ€μ μ μ₯λλ©°, λ³κ²½ κ°λ₯ν μμΉμλ λνλμ§ μμ΅λλ€. (μ€λ μ¬μ©λλ κ²κ³Ό λμΌν μΆλ‘ μκ³ λ¦¬μ¦μ μ μ©ν μ μμΌλ©° μλͺ
μ΄ λ³κ²½ κ°λ₯ν μμΉμ λνλλμ§ μ¬λΆλ₯Ό μλ €μ£Όλ #3598 μμ μ μΌλΆλ‘ μ¬μ©λ©λλ€.)
μ΄μ λν΄ μκ°νλ λ λ€λ₯Έ λ°©λ²μ λμΆμ΄ _μ‘°κΈ°_ λ§λ£λ κ²μ΄ μλλΌ λμΆμ λ²μκ° (μΌλ°μ μΌλ‘) μ 체 μλͺ μ΄ μλλΌ λΉλ¦° _λ³μ_μ μ°κ²°λμ΄ μμλκ³ λ³μκ° λ€μκ³Ό κ°μ κ²½μ°μλ§ μ 체 μλͺ μΌλ‘ μΉκ²©λλ€λ κ²μ λλ€. _νμΆ_.
μ¬μ°¨μ
μ μ½κ°μ ν©λ³μ¦μ΄μ§λ§ λ€μν λ°©μμΌλ‘ μ²λ¦¬ν μ μμ΅λλ€. λ€μ λΉλ¦¬λ κ²μ λΉλ¦° ν¬μΈν°μ λ΄μ©μ λΉλ¦΄ λμ
λλ€. μ»΄νμΌλ¬κ° κ±°μ λͺ¨λ λ©μλ νΈμΆμ μ΄λ₯Ό μλμΌλ‘ μ½μ
νκΈ° λλ¬Έμ _νμ_ λ°μν©λλ€. λΉλ¦° ν¬μΈν° let p = &v
μ let q = &*p
μ κ°μ μ¬λΉλλ₯Ό κ³ λ €νμμμ€. q
μ΄ μ£½μμ λ p
λ€μ μ¬μ©ν μ μμΌλ©΄ μ’μ κ²μ
λλ€. κ·Έλ¦¬κ³ p
μ q
κ° λͺ¨λ μ£½μλ€λ©΄ λ€μμ μ¬μ©ν μ μμ΅λλ€. v
λ€μ( p
λλ q
μ΄μ€μΌμ΄νκ° μλ€κ³ κ°μ ). μ¬κΈ°μ ν©λ³μ¦μ΄μλ κ²½μ°μ΄λ€ q
νμΆ, p
μ μλͺ
κΉμ§ νμΆμ κ³ λ €ν΄μΌν©λλ€ q
λ§λ£λ©λλ€. κ·Έλ¬λ λλ μ΄κ²μ΄ μ°λ¦¬κ° μ€λ μ²λ¦¬νλ λ°©λ²μ μμ°μ€λ½κ² _somewhat_μ λ΄λ¦¬λ μκ° : μ¦, μ»΄νμΌλ¬ λ
ΈνΈκ° q
λΉλ¦°λ₯Ό p
μ
λλ€ (μ²μμ) μλͺ
"Q"(λν, λ³μ μ체μ) κ·Έλ¦¬κ³ q
κ° μ΄μ€μΌμ΄νλμ΄μΌ νλ κ²½μ° μ 체 μ΄ν μλͺ
μΌλ‘ μΉκ²©λ©λλ€. λλ λ°μ΄ν° νλ¦μμ κΉλ€λ‘μ΄ λΆλΆμ΄ ν¬μ μ½μ
ν μμΉλ₯Ό μκ³ μλ€κ³ μκ°ν©λλ€. λ€μ λΉλ¦΄ κ²½μ° p
κ° μ£½μΌλ©΄ p
λν ν¬μ μ¦μ μ½μ
ν μ μμ΅λλ€. μ€ κΈμ, λλ μ΄κ²μ λ λ§μ μκ°μ λλΉνμ§ μμ κ²μ
λλ€. κ·Έκ²μ κ°λ₯ν κ² κ°μ΅λλ€. κ·Έλ¦¬κ³ μ΅μ
μ κ²½μ° μΌλ°μ μΈ μν©μ μ ν©ν λ κ°λ¨ν μ루μ
μ΄ μμ΅λλ€(μ: p
κ° νμ λμ νμΆνλ€κ³ μκ°νμμμ€. of q
, q
λμΆ νμΆ μ¬λΆμ κ΄κ³μμ΄).
μ΄μ¨λ λ λ§μ μκ°μ΄ νμνμ§λ§ μ΄κ²μ΄ μ΄λ»κ² μλνλμ§ λ³΄κΈ° μμνμ΅λλ€. λλ μ¬μ ν #2202μ #8624κ° μμ λ λκΉμ§ μ΄μ κ°μ νμ₯μ μμνλ κ²μ κΊΌλ €νλλ°, μ΄λ λ°λ‘ μ°¨μ©μ λ κ°μ§ μλ €μ§ λ¬Έμ μ λλ€. λν μμ€ν μ νμ₯νκΈ° μ μ 건μ μ± μ¦λͺ μ λν΄ λ λ§μ μ§μ μ μ΄λ£¨κ³ μΆμ΅λλ€. νμλΌμΈμ μλ λ€λ₯Έ νμ₯μλ #6268μ λλ€.
μ΄ λ²κ·Έμ κ±Έλ Έλ€κ³ μκ°ν©λλ€. λ΄ μ¬μ© μ¬λ‘ λ° ν΄κ²° λ°©λ²:
λ€μμ μ΄ λ²κ·Έμ λ λ€λ₯Έ μμ λλ€(μ μκ°μλ).
use std::util;
enum List<T> {
Cons(T, ~List<T>),
Nil
}
fn find_mut<'a,T>(prev: &'a mut ~List<T>, pred: |&T| -> bool) -> Option<&'a mut ~List<T>> {
match prev {
&~Cons(ref x, _) if pred(x) => {}, // NB: can't return Some(prev) here
&~Cons(_, ref mut rs) => return find_mut(rs, pred),
&~Nil => return None
};
return Some(prev)
}
λλ μ°κ³ μΆλ€:
fn find_mut<'a,T>(prev: &'a mut ~List<T>, pred: |&T| -> bool) -> Option<&'a mut ~List<T>> {
match prev {
&~Cons(ref x, _) if pred(x) => return Some(prev),
&~Cons(_, ref mut rs) => return find_mut(rs, pred),
&~Nil => return None
}
}
x
μ°¨μ
μ μ°λ¦¬κ° μ μ΄ νκ°λ₯Ό λ§μΉμ λ§μ μ¬λΌμ§μ§λ§ λ¬Όλ‘ μ§κΈμ μ°¨μ
μ΄ μ 체 μΌμΉμ λν΄ νμ₯λλ€λ μΆλ‘ μ
λλ€.
λλ μ΄κ²μ μ΄λ»κ² μ½λ©ν μ§μ λν΄ λ λ§μ μκ°μ νλ€. λ΄ κΈ°λ³Έ κ³νμ κ° λμΆμ λν΄ μ΄μ€μΌμ΄νλ λ²μ κ³Ό μ΄μ€μΌμ΄νλμ§ μμ λ²μ μ λ κ°μ§ λΉνΈκ° μλ€λ κ²μ λλ€. μ²μμλ μ΄μ€μΌμ΄νλμ§ μμ λ²μ μ μΆκ°ν©λλ€. μ°Έμ‘°κ° μ΄μ€μΌμ΄νλλ©΄ μ΄μ€μΌμ΄νλ λΉνΈλ₯Ό μΆκ°ν©λλ€. λ³μ(λλ μμ λ±)κ° μ£½μΌλ©΄ μ΄μ€μΌμ΄νλμ§ μμ λΉνΈλ₯Ό μ’ λ£νμ§λ§ μ΄μ€μΌμ΄νλ λΉνΈ(μ€μ λ κ²½μ°)λ κ·Έλλ‘ λ‘λλ€. λλ μ΄κ²μ΄ λͺ¨λ μ£Όμ μλ₯Ό ν¬ν¨νλ€κ³ λ―Ώμ΅λλ€.
cc @flaper87
μ΄ λ¬Έμ κ° μ΄μ ν΄λΉν©λκΉ?
use std::io::{MemReader, EndOfFile, IoResult};
fn read_block<'a>(r: &mut Reader, buf: &'a mut [u8]) -> IoResult<&'a [u8]> {
match r.read(buf) {
Ok(len) => Ok(buf.slice_to(len)),
Err(err) => {
if err.kind == EndOfFile {
Ok(buf.slice_to(0))
} else {
Err(err)
}
}
}
}
fn main() {
let mut buf = [0u8, ..2];
let mut reader = MemReader::new(~[67u8, ..10]);
let mut block = read_block(&mut reader, buf);
loop {
//process block
block = read_block(&mut reader, buf); //error here
}
λλ₯Ό μ°Έμ‘°
#9113μ μ’μ μ
λλ₯Ό μ°Έμ‘°
λ΄κ° ν릴 μλ μμ§λ§ λ€μ μ½λλ μ΄ λ²κ·Έλ₯Ό μΉλ κ² κ°μ΅λλ€.
struct MyThing<'r> {
int_ref: &'r int,
val: int
}
impl<'r> MyThing<'r> {
fn new(int_ref: &'r int, val: int) -> MyThing<'r> {
MyThing {
int_ref: int_ref,
val: val
}
}
fn set_val(&'r mut self, val: int) {
self.val = val;
}
}
fn main() {
let to_ref = 10;
let mut thing = MyThing::new(&to_ref, 30);
thing.set_val(50);
println!("{}", thing.val);
}
μ΄μμ μΌλ‘λ set_val νΈμΆλ‘ μΈν λ³κ²½ κ°λ₯ν μ°¨μ©μ΄ ν¨μκ° λ°νλλ μ¦μ μ’ λ£λ©λλ€. ꡬ쑰체(λ° κ΄λ ¨ μ½λ)μμ 'int_ref' νλλ₯Ό μ κ±°νλ©΄ λ¬Έμ κ° μ¬λΌμ§λλ€. νλμ΄ μΌκ΄μ±μ΄ μμ΅λλ€.
@SergioBenitez λλ κ·Έκ²μ΄ κ°μ λ¬Έμ λΌκ³ μκ°νμ§ μμ΅λλ€. &mut self
μ°Έμ‘°μ μλͺ
μ΄ κ΅¬μ‘°μ²΄μ μλͺ
κ³Ό λμΌνλλ‘ λͺ
μμ μΌλ‘ μμ²νκ³ μμ΅λλ€.
νμ§λ§ μ΄λ κ² ν νμλ μμ΅λλ€. set_val()
μ νμ νμνμ§ μμ΅λλ€.
fn set_val(&mut self, val: int) {
self.val = val;
}
μμ νκΈ° λ§€μ° κΉλ€λ‘μ΄ λ λ€λ₯Έ μ¬λ‘λ₯Ό μ°Ύμμ΅λλ€.
/// A buffer which breaks chunks only after the specified boundary
/// sequence, or at the end of a file, but nowhere else.
pub struct ChunkBuffer<'a, T: Buffer+'a> {
input: &'a mut T,
boundary: Vec<u8>,
buffer: Vec<u8>
}
impl<'a, T: Buffer+'a> ChunkBuffer<'a,T> {
// Called internally to make `buffer` valid. This is where all our
// evil magic lives.
fn top_up<'b>(&'b mut self) -> IoResult<&'b [u8]> {
// ...
}
}
impl<'a,T: Buffer+'a> Buffer for ChunkBuffer<'a,T> {
fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]> {
if self.buffer.as_slice().contains_slice(self.boundary.as_slice()) {
// Exit 1: Valid data in our local buffer.
Ok(self.buffer.as_slice())
} else if self.buffer.len() > 0 {
// Exit 2: Add some more data to our local buffer so that it's
// valid (see invariants for top_up).
self.top_up()
} else {
{
// Exit 3: Exit on error.
let read = try!(self.input.fill_buf());
if read.contains_slice(self.boundary.as_slice()) {
// Exit 4: Valid input from self.input. Yay!
return Ok(read)
}
}
// Exit 5: Accumulate sufficient data in our local buffer (see
// invariants for top_up).
self.top_up()
}
}
β¦ μ 곡:
/path/to/mylib/src/buffer.rs:168:13: 168:17 error: cannot borrow `*self` as mutable more than once at a time
/path/to/mylib/src/buffer.rs:168 self.top_up()
^~~~
/path/to/mylib/src/buffer.rs:160:33: 160:43 note: previous borrow of `*self.input` occurs here; the mutable borrow prevents subsequent moves, borrows, or modification of `*self.input` until the borrow ends
/path/to/mylib/src/buffer.rs:160 let read = try!(self.input.fill_buf());
^~~~~~~~~~
<std macros>:1:1: 3:2 note: in expansion of try!
/path/to/mylib/src/buffer.rs:160:28: 160:56 note: expansion site
/path/to/mylib/src/buffer.rs:170:6: 170:6 note: previous borrow ends here
/path/to/mylib/src/buffer.rs:149 fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]> {
...
/path/to/mylib/src/buffer.rs:170 }
μ΄κ²μ κΈ°λ³Έμ μΌλ‘ #12147κ³Ό λμΌν©λλ€. read
λ³μλ λ΄λΆ λ²μμ 묻ν μμ§λ§ return
read
μ μλͺ
μ μ 체 ν¨μμ μλͺ
μ λ°μΈλ©ν©λλ€. λλΆλΆμ λͺ
λ°±ν ν΄κ²° λ°©λ²μ μ€ν¨ν©λλ€.
Buffer
μΈν°νμ΄μ€λ λ΄κ° λ λ²μ§Έλ‘ μ ν¨μ±μ κ²μ¬ν λ°μ΄ν°λ₯Ό λ°ννλ€κ³ 보μ₯νμ§ μκΈ° λλ¬Έμ input.fill_buf
λ λ² νΈμΆν μ μμ΅λλ€. λ΄κ° μ΄κ²μ _do_ νλ©΄ μ½λκ° κΈ°μ μ μΌλ‘ μ¬λ°λ₯΄μ§ μμ§λ§ μ ν κ²μ¬κΈ°λ μ΄λ₯Ό λ§μ‘±μ€λ½κ² μ λ¬ν©λλ€.top_up
μ λν΄ λ§μ κ²μ ν μ μμ΅λλ€. 볡μ‘ν λ°©μμΌλ‘ λͺ¨λ κ²μ λ³κ²½ν΄μΌ νλ μ¬μ
ν μ½λμ΄κΈ° λλ¬Έμ
λλ€.if let
_then_ bind?λ₯Ό ν
μ€νΈν μ μλ κ²½μ° μ μΈ).'a
μ μ½ μ‘°κ±΄μ΄ μ΄μμ μΌλ‘ read
λ€μ μ νλμ΄μλ μ λλ κ²μ²λΌ λκ»΄μ§λλ€. νμ§λ§ λ μ¬κΈ° λ΄ λ¨Έλ¦¬ μμ μμ΄μ. λ€μμλ if let
λ₯Ό μλνκ² μ΅λλ€.
κΈμμ, if let
λ μ΄μ ―λ°€ λΉλμ ν¬ν¨λμ§ μμμ§λ§, μλ§λ AST μ¬μμ±μΌ λΏμ΄λ―λ‘ match
μ κ°μ λ°©μμΌλ‘ μ€ν¨ν κ² κ°μ΅λλ€. μ¬κΈ°μμλ μλ).
unsafe
μ¬μ©νμ§ μκ³ μ§ννλ λ°©λ²μ μ λͺ¨λ₯΄κ² μ΅λλ€.
λ΄ νμ¬ ν΄νΉμ λ€μκ³Ό κ°μ΅λλ€.
impl<'a,T: Buffer+'a> Buffer for ChunkBuffer<'a,T> {
fn fill_buf<'a>(&'a mut self) -> IoResult<&'a [u8]> {
// ...
{ // Block A.
let read_or_err = self.input.fill_buf();
match read_or_err {
Err(err) => { return Err(err); }
Ok(read) => {
if read.contains_slice(self.boundary.as_slice()) {
return Ok(unsafe { transmute(read) });
}
}
}
}
self.top_up()
μ¬κΈ°μ μ΄λ‘ μ read
( self.input
μ λ°μΈλ©λ¨)μ μλͺ
μ μμ νκ³ self.input
λ₯Ό μμ νλ self
κΈ°λ°μΌλ‘ μ μλͺ
μ μ¦μ μ μ©νλ€λ κ²μ
λλ€. self.input
. μ΄μμ μΌλ‘λ read
κ° λΈλ‘ A μ κ°μ μ΄ν μλͺ
μ κ°κΈ°λ₯Ό μνκ³ return
μ λ¬νκΈ° λλ¬Έμ _lexical_ λΈλ‘ μμ€κΉμ§ λμ΄μ¬λ¦¬λ κ²μ μνμ§ μμ΅λλ€. λΆλͺ
ν μλͺ
κ²μ¬κΈ°λ μ¬μ ν κ²°κ³Όκ° 'a
μ νΈνλλ μλͺ
μ κ°μ§κ³ μμμ μ¦λͺ
ν΄μΌ νμ§λ§ μ΄κ²μ΄ LIFETIME( read
)μ΄ LIFETIME( 'a
κ³Ό ν΅ν©λμ΄μΌ ν¨μ μλ―Ένλ μ΄μ λ₯Ό μ΄ν΄νμ§ λͺ»ν©λλ€
λ΄κ° μμ²λκ² νΌλμ€λ½κ±°λ λ΄ μ½λκ° λμ°νκ² μμ νμ§ μμ μ μμ΅λλ€. :-) νμ§λ§ μ무 λ¬Έμ μμ΄ return self.input.fill_buf()
λ₯Ό νΈμΆν μλ§ μλ€λ©΄ μ΄κ²μ΄ μλν΄μΌ ν κ² κ°μ΅λλ€. κ·Έ μ§κ΄μ 곡μννλ λ°©λ²μ΄ μμ΅λκΉ?
@emk λ°λΌμ μ΄κ²μ SEME μμ(μ¦, μ΄νκ° μλ μμ)μ΄ μ μ΄λ μ체μ μΌλ‘ μμ λμ§ μλ "νλ μ½λ"μ λλ€. μ»΄νμΌλ¬μμ μ μμ νλ λ°©λ²μ λν λͺ κ°μ§ μμ΄λμ΄κ° μμ§λ§ SEME μμμ λν μ¬μν νμ₯μ λλ€. μΌλ°μ μΌλ‘ μ½λλ₯Ό μ¬κ΅¬μ±νμ¬ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©λ²μ΄ μμ΅λλ€. λ΄κ° κ·Έκ²μ κ°μ§κ³ λκ³ μ’μ μλ₯Ό λ§λ€ μ μλμ§ λ³΄μ.
μ΄κ²μ΄ 1.0μ λν΄ μ¬κ²ν λκ³ μλμ§ μκ³ μΆμ΅λλ€. μ΄κ²μ μ΅κ·Όμ _λ§μ_ μ¬λΌμ€κ³ μμΌλ©°, 1.0μ΄ κ΄μ¬μ λͺ¨μΌκ² λλ©΄ μ΄κ²μ΄ νμ΄νΌμ»·μμ μμ²λ‘ μ¬λΌμ§κΉ λλ ΅μ΅λλ€. Rustμ κ°μ₯ λμ λκ³ νμ κ° λ κΈ°λ₯μΈ μ°¨μ©μ μΈλ ¨λκ³ μ¬μ© κ°λ₯νλλ‘ νλ κ²μ΄ λ§€μ° μ€μν©λλ€.
RFCμ μ΄μ λν κΈ°κ°μ΄ μμ΅λκΉ?
@nikomatsakis λμμ΄λλ€λ©΄ Entry APIμμ μλνμ§ μλ μ€μ κ°λ¨ν μκ° μμ΅λλ€.
use std::collections::SmallIntMap;
enum Foo<'a>{ A(&'a mut SmallIntMap<uint>), B(&'a mut uint) }
fn main() {
let mut map = SmallIntMap::<uint>::new();
do_stuff(&mut map);
}
fn do_stuff(map: &mut SmallIntMap<uint>) -> Foo {
match map.find_mut(&1) {
None => {}, // Definitely can't return A here because of lexical scopes
Some(val) => return B(val),
}
return A(map); // ERROR: borrowed at find_mut???
}
@bstrie @pcwalton κ³Ό @zwarich λ μ΄ μμ μ μ€μ λ‘ κ΅¬ννλ λ° μκ°μ 보λμ΅λλ€(RFCκ° ν¨κ» μ 곡λ μ μμ). κ·Έλ€μ μμλ³΄λ€ ν¨μ¬ λ λ§μ μμ μ΄ νμνλ€λ κ²μ μλ―Ένλ μμμΉ λͺ»ν 볡μ‘μ±μ μ§λ©΄νμ΅λλ€. μ΄λ¬ν μ νμ΄ μ€μνκ³ μΈμ΄μ 첫μΈμμ μν₯μ μ€ μ μλ€λ μ μ λͺ¨λ λμνλ€κ³ μκ°ν©λλ€. κ·Έλ¬λ μ΄λ―Έ μμ λ μ΄μ λ²μ κ³Ό νΈνλμ§ μλ λ³κ²½ μ¬νκ³Ό κ· νμ λ§μΆκΈ°κ° μ΄λ ΅μ΅λλ€.
1.0μμ μ΄κ²μ΄ ν΄κ²°λμ§ μμΌλ©΄ μ΄ λ¬Έμ κ° μ°¨μ© κ²μ¬ AFAIKμμ λ³Έμ§μ μΌλ‘ ν΄κ²°ν μ μλ λ¬Έμ κ° μλ λ μ¬λλ€μ΄ μ°¨μ© κ²μ¬ μ κ·Ό λ°©μμ μ μ μΌλ‘ λΉλνκ² λ μ’ λ₯μ κ²μ΄λΌκ³ μκ°ν©λλ€.
@blaenk λΉλ¦° 체컀λ₯Ό λΉλνμ§ μλ κ²μ μ΄λ ΅μ΅λλ€. μ λ λ§€μΌ μ΄κ²κ³Ό μ μ¬ν(@Gankroμ κ°μ) λ¬Έμ λ₯Ό κ²ͺμμ΅λλ€. μΌλ°μ μΈ μ루μ μ΄ νμ (μ: ν΄κ²° λ°©λ²)/λλ μ½λλ₯Ό λ³΄λ€ "λΆλ³"νκ³ κΈ°λ₯μ μΌλ‘ μ¬κ΅¬μ±νκΈ° μν μ£ΌμμΌ λ μ€λ§μ€λ½μ΅λλ€.
@mtanski λ€, νμ§λ§ μλͺ»μ μ°¨μ© κ²μ¬κΈ° AFAIKμ _does_ μμ΅λλ€. κ·Έκ²μ λΉλνλ κ²μ μ³μ§ μμ΅λλ€. λ΄κ° λ§νλ κ²μ μ κ· μ΄λ―Όμλ€μ΄ κ·Έκ²μ΄ μ°¨μ νμΈ _μ κ·Όλ²_κ³Ό κ΄λ ¨λ λ³Έμ§μ μ΄κ³ κ·Όλ³Έμ μ΄λ©° ν΄κ²°ν μ μλ λ¬Έμ λΌκ³ λ―Ώκ² ν μ μκ³ AFAIKλ μλͺ»λ λ―Ώμμ΄λΌκ³ λ―Ώκ² ν μ μλ€λ κ²μ λλ€.
κ²½μ°: "let p = &...; use-pa-bit-but-never-again; μμ λμΆ λ§κΈ°μΌ;" νμ¬λ‘μλ ν΄λΉ μ°¨μ©μ λν λ²μ λμ μλμΌλ‘ μ μΈνλ kill(p) λͺ λ Ήμ΄ νμ©λ©λλ€. μ΄ν λ²μ μμλ μ΄ λͺ λ Ήμ΄κ° νμνμ§ μμ κ²½μ° μ΄ λͺ λ Ήμ΄λ₯Ό 무μνκ±°λ μ΄νμ pμ μ¬μ¬μ©μ΄ κ°μ§λλ©΄ μ€λ₯λ‘ νλκ·Έλ₯Ό μ§μ ν μ μμ΅λλ€.
/* (wanted) */
/*
fn main() {
let mut x = 10;
let y = &mut x;
println!("x={}, y={}", x, *y);
*y = 11;
println!("x={}, y={}", x, *y);
}
*/
/* had to */
fn main() {
let mut x = 10;
{
let y = &x;
println!("x={}, y={}", x, *y);
}
{
let y = &mut x;
*y = 11;
}
let y = &x;
println!("x={}, y={}", x, *y);
}
μ΄λ₯Ό μννλ μ곑μ drop() λ©μλκ° μμ΅λλ€. νμ§λ§ μλ κ² κ°λ€
λ³κ²½ κ°λ₯ν μ°¨μ©μ λκΈ° μν΄.
2015λ 4μ 5μΌ μΌμμΌ μ€ν 1μ 41λΆ axeoth [email protected]μ΄ λ€μκ³Ό κ°μ΄ μΌμ΅λλ€.
/* (μν¨) _//_fn main() { let mut x = 10; νμ y = &mut x; println!("x={}, y={}", x, _y); *y = 11; println!("x={}, y={}", x, *y);}_/
/* ν΄μΌ */fn main() {let mut x = 10; { let y = &x; println!("x={}, y={}", x, *y); } { let y = &mut x; *y = 11; } let y = &x; println!("x={}, y={}", x, *y);
}
β
μ΄ μ΄λ©μΌμ μ§μ λ΅μ₯νκ±°λ GitHubμμ νμΈνμΈμ.
https://github.com/rust-lang/rust/issues/6393#issuecomment -89848449.
https://github.com/rust-lang/rfcs/issues/811 μ μ°¬μ±νμ¬ μ’ λ£
@metajack μλ³Έ μ½λμ λν λ§ν¬λ 404μ λλ€. μ΄ λ²κ·Έλ₯Ό μ½λ μ¬λλ€μ μν΄ μΈλΌμΈμΌλ‘ ν¬ν¨ν μ μμ΅λκΉ?
μ½κ°μ νκΈ° νμ μ΄κ²μ΄ μλ³Έ μ½λμ λμΌνλ€κ³ μκ°ν©λλ€.
https://github.com/servo/servo/blob/5e406fab7ee60d9d8077d52d296f52500d72a2f6/src/servo/layout/box_builder.rs#L374
λλ μ΄ λ²κ·Έλ₯Ό μ κ³ ν λ μ¬μ©ν ν΄κ²° λ°©λ²μ
λλ€. λ³κ²½ μ μ μλ μ½λλ λ€μκ³Ό κ°μ΅λλ€.
https://github.com/servo/servo/blob/7267f806a7817e48b0ac0c9c4aa23a8a0d288b03/src/servo/layout/box_builder.rs#L387 -L399
μ΄λ¬ν νΉμ μκ° λ Ήμ¨ 1.0 μ΄μ λ²μ μ΄μκΈ° λλ¬Έμ νμ¬ μΌλ§λ κ΄λ ¨μ±μ΄ μλμ§ μ λͺ¨λ₯΄κ² μ΅λλ€.
@metajack μ΄ λ¬Έμ μ 맨 μμ λ§€μ° κ°λ¨ν(1.0 μ΄ν) μμ κ° μμΌλ©΄ μ’μ κ²μ λλ€. μ΄ λ¬Έμ λ μ΄μ https://github.com/rust-lang/rfcs/issues/811μ μΌλΆμ λλ€.
fn main() {
let mut nums=vec![10i,11,12,13];
*nums.get_mut(nums.len()-2)=2;
}
λλ λ΄κ° λΆννλ κ²μ΄ λ€μκ³Ό κ°λ€κ³ μκ°νλ€.
https://is.gd/yfxUfw
κ·Έ νΉλ³ν κ²½μ°λ μ΄μ μλνλ κ²μΌλ‘ 보μ λλ€.
@vitiral λ΄κ° μ μ©νλ€κ³ μκ°νλ μ€λλ μ Rustμ μ:
fn main() {
let mut vec = vec!();
match vec.first() {
None => vec.push(5),
Some(v) => unreachable!(),
}
}
None
μμ΄ μ°¨μ©μ μ€ν¨νμ΅λλ€.
ν₯λ―Έλ‘κ²λ Some
μμμ int
λ₯Ό μΊ‘μ²νμ§ μμΌλ©΄(μ: Some(_)
) μ»΄νμΌλ©λλ€.
@wyverland μ€ μΌ, μ΄μ μ³€λλ° κ½€
@metajack ν΄λΉ μμ λ₯Ό ν¬ν¨νλλ‘ μ²« λ²μ§Έ κ²μλ¬Όμ νΈμ§ν μ μμ΅λκΉ?
μμ§ μΌκ°μ μ μ€λμ§λ μμμ§λ§ μ΄κ²μ΄ μ΄μ μ»΄νμΌλλ€κ³ λ§νκ³ μΆμ΅λλ€.
#![feature(nll)]
fn main() {
let mut vec = vec!();
match vec.first() {
None => vec.push(5),
Some(v) => unreachable!(),
}
}
κ°μ₯ μ μ©ν λκΈ
μμ§ μΌκ°μ μ μ€λμ§λ μμμ§λ§ μ΄κ²μ΄ μ΄μ μ»΄νμΌλλ€κ³ λ§νκ³ μΆμ΅λλ€.