if
ãã¹ãã§äžå€ã«åçšããå Žåãåçšã¯if
åŒå
šäœã«ããã£ãŠæç¶ããŸãã ããã¯ãå¥å
ã®å€æŽå¯èœãªåçšã«ãããåçšãã§ãã«ãŒã倱æããããšãæå³ããŸãã
ããã¯ãäžèŽåŒã§åçšããããããã®ã¢ãŒã ã§å€æŽå¯èœãªåçšãå¿ èŠãªå Žåã«ãçºçããå¯èœæ§ããããŸãã
ifãããã¯ã¹ãåçšããäŸã«ã€ããŠã¯ããããåç
§ããŠãã ãããããã«ãããæãè¿ãäžåãã®@mut
ãããªãŒãºããŸãã 次ã«ãå¯å€çã«åçšããå¿
èŠããã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
ã«ãã€ã³ããããŠããããã Self
ãŸãã¯K
ã¿ã€ãã®ãã©ã¡ãŒã¿ãŒã«è¡šç€ºã§ããªãããã§ãããããã«ä¿åãããå€æŽå¯èœãªå Žæã«ã¯è¡šç€ºãããŸããã ïŒçŸåšäœ¿çšãããŠãããã®ãšåãæšè«ã¢ã«ãŽãªãºã ãé©çšã§ããŸããããã¯ãã©ã€ãã¿ã€ã ãå€æŽå¯èœãªå Žæã«è¡šç€ºããããã©ããã瀺ãããã«ãïŒ3598ã®ä¿®æ£ã®äžéšãšããŠäœ¿çšãããŸãïŒ
ããã«ã€ããŠèããå¥ã®æ¹æ³ã¯ãããŒã³ã_æ©æã«æéåãã«ãªããšããããšã§ã¯ãªããããŒã³ã®ç¯å²ãïŒéåžžïŒåçšããã_å€æ°_ã«é¢é£ä»ããããŠéå§ãããå šæéã§ã¯ãªããå€æ°ãæå¹æéå šäœã«ææ Œãããå Žåã®ã¿ã§ãã _escapes_ã
ååçšã¯å°ãè€éã§ãããããŸããŸãªæ¹æ³ã§åŠçã§ããŸãã ååçšãšã¯ãåçšãããã€ã³ã¿ãŒã®å
容ãåçšããããšã§ããã³ã³ãã€ã©ãŒãã»ãšãã©ãã¹ãŠã®ã¡ãœããåŒã³åºãã«èªåçã«æ¿å
¥ãããããåçšã¯åžžã«çºçããŸãã åçšãããã€ã³ã¿let p = &v
ãšlet q = &*p
ãããªååçšã«ã€ããŠèããŠã¿ãŸãã q
ãæ»ãã ãšãã«ãããäžåºŠp
䜿çšã§ããã°ããã®ã§ããã p
ãšq
äž¡æ¹ãæ»ãã å Žåã¯ãåã³v
ïŒ p
ãq
ãšã¹ã±ãŒãããªããšä»®å®ïŒã ããã§ã®è€éãã¯ã q
ããšã¹ã±ãŒããããå Žåã q
æå¹æéãåãããŸã§ã p
ããšã¹ã±ãŒãããããšèŠãªãããå¿
èŠãããããšã§ãã ã€ãŸããã³ã³ãã€ã©ã®ããŒãããšïŒããããç§ã¯ããã®ç§ãã¡ãä»æ¥ãããåŠçããæ¹æ³ãã_somewhat_èªç¶ã«èœã¡ããšæããŸãq
åããp
ïŒæåã¯ïŒå¯¿åœãQãïŒããããçšãå€æ°èªäœã®ïŒãããŠq
ããšã¹ã±ãŒãããå¿
èŠãããå Žåãããã¯å®å
šãªã¬ãã·ã«ã«ã©ã€ãã¿ã€ã ã«ããã¢ãŒããããŸãã ããªãããŒãªéšåã¯ããŒã¿ãããŒã«ãããšæããŸãããã«ãæ¿å
¥ããå Žæãç¥ã£ãŠããŸãã p
ãååçšãããå Žåã p
ã®ãã«ãããã«æ¿å
¥ããããšã¯ã§ããŸããã ãŸããç§ã¯ããã«ãã£ãšæéãç¡é§ã«ããããšã¯ãããŸãããããã¯å®è¡å¯èœã§ããããã§ãããããŠææªã®å Žåãäžè¬çãªç¶æ³ã«é©ããããç°¡åãªè§£æ±ºçããããŸãïŒäŸãã°ã p
ãç涯ã«ããã£ãŠéãããšèããŠãã ããq
ããŒã³ãéãããã©ããã«é¢ä¿ãªãã q
ïŒã
ãšã«ããããã£ãšèããå¿ èŠããããŸãããç§ã¯ãããã©ã®ããã«æ©èœããããèŠå§ããŠããŸãã ïŒ2202ãšïŒ8624ãä¿®æ£ããããŸã§ããã®ãããªæ¡åŒµæ©èœã«çæããã®ã¯ãŸã æ°ãé²ãŸãªãããããã¯ãborrowckã®2ã€ã®æ¢ç¥ã®åé¡ã§ããã ãŸããã·ã¹ãã ã®æ¡åŒµã«åãæããåã«ãå¥å šæ§ã®èšŒæã«ã€ããŠããã«é²å±ãããããšæããŸãã ã¿ã€ã ã©ã€ã³ã«ããä»ã®æ¡åŒµåã¯ïŒ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
åçšã¯ãè¿°èªã®è©äŸ¡ãçµäºãããšããã«ç¡å¹ã«ãªããšæšè«ããŸããããã¡ãããåçšã¯çŸåšãè©Šåå
šäœã«é©çšãããŸãã
ç§ã¯ãããã©ã®ããã«ã³ãŒãã£ã³ã°ãããã«ã€ããŠãã£ãšèããŸããã ç§ã®åºæ¬çãªèšç»ã¯ãããŒã³ããšã«ããšã¹ã±ãŒããããããŒãžã§ã³ãšãšã¹ã±ãŒããããŠããªãããŒãžã§ã³ã®2ã€ã®ãããããããšããããšã§ãã æåã«ããšã¹ã±ãŒããããŠããªãããŒãžã§ã³ãè¿œå ããŸãã åç §ããšã¹ã±ãŒããããšãããšã¹ã±ãŒããããããããè¿œå ããŸãã å€æ°ïŒãŸãã¯äžæçãªãã®ãªã©ïŒãæ©èœããªããªã£ãå Žåããšã¹ã±ãŒããããŠããªããããã匷å¶çµäºããŸããããšã¹ã±ãŒãããããããïŒèšå®ãããŠããå ŽåïŒã¯ãã®ãŸãŸã«ããŠãããŸãã ããã¯ãã¹ãŠã®äž»èŠãªäŸãã«ããŒããŠãããšæããŸãã
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
}
cc me
ïŒ9113ã®è¯ãäŸ
cc me
誀解ãããå¯èœæ§ããããŸããã次ã®ã³ãŒãããã®ãã°ã«ã¶ã€ãã£ãŠããããã§ãã
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
ã®åç¶æéãé¢æ°å
šäœã®åç¶æéã«ãã€ã³ãããŸãã æãããªåé¿çã®ã»ãšãã©ã¯å€±æããŸãïŒ
input.fill_buf
2ååŒã³åºãããšã¯ã§ããŸãããããã¯ã Buffer
ã€ã³ã¿ãŒãã§ã€ã¹ãã2åç®ã«æ€èšŒããã°ããã®ããŒã¿ãè¿ãããšãä¿èšŒããªãããã§ãã ãããè©ŠããŠã¿ããšãã³ãŒãã¯æè¡çã«æ£ãããããŸããããã¿ã€ããã§ãã«ãŒã¯åé¡ãªãåæ ŒããŸããtop_up
ã«ã€ããŠã¯ããŸãã§ããŸãããããã¯ããã¹ãŠãè€éãªæ¹æ³ã§å€æŽããå¿
èŠãããéªæªãªã³ãŒãã ããã§ããif let
ãã€ã³ãããã¹ãã§ããå Žåãé€ãïŒã'a
å¶çŽã¯ãçæ³çã«ã¯read
ãŸã§å®å
šã«äŒæãããã¹ãã§ã¯ãªãããã«æããŸãã ããããç§ã¯ããã§é ãæ±ããŠããŸãã 次ã«if let
ãè©ŠããŠã¿ãŸãã
ãããšã if let
ã¯æšå€ãã«ãã«çµã¿èŸŒãŸããŸãã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
ã«ãã€ã³ããããŠããïŒã®ã©ã€ãã¿ã€ã ãåé€ãã read
ãææããself.input
self
ã«åºã¥ããŠæ°ããã©ã€ãã¿ã€ã ãããã«é©çšãããšãããã®ã§ãã self.input
ã çæ³çã«ã¯ã read
ã®åå¥ã®æå¹æéããããã¯Aãšçãããã return
ã«æž¡ãããããšãã£ãŠãããã_lexical_ãããã¯ã¬ãã«ãŸã§åŒãäžããããªãããã«ããŸãã æããã«ãã©ã€ãã¿ã€ã ãã§ãã«ãŒã¯çµæã'a
ãšäºææ§ã®ããã©ã€ãã¿ã€ã ãæã£ãŠããããšã蚌æããå¿
èŠããããŸããããããLIFETIMEïŒ read
ïŒãLIFETIMEïŒ 'a
ïŒã
ç§ã倧ãã«æ··ä¹±ããŠããããŸãã¯ç§ã®ã³ãŒããã²ã©ãå®å
šã§ãªãå¯èœæ§ã¯ååã«ãããŸãã :-)ããããç§ãreturn self.input.fill_buf()
ããŸã£ããåé¡ãªãåŒã³åºãããšãã§ãããšããçç±ã ãã§ãããã¯ããŸãããã¯ãã ãšæããŠããŸãã ãã®çŽæã圢åŒåããæ¹æ³ã¯ãããŸããïŒ
@emkãªã®ã§ãããã¯SEMEé åïŒã€ãŸããéåå¥é åïŒãä¿®æ£ããªããããŒãã³ãŒããã§ãããå°ãªããšãããèªäœã§ã¯ä¿®æ£ãããŸããã ã³ã³ãã€ã©ã§ããŸãä¿®æ£ããæ¹æ³ã«ã€ããŠããã€ãã®ã¢ã€ãã¢ããããŸãããããã¯SEMEé åã®éèŠãªæ¡åŒµã§ãã éåžžãã³ãŒããåæ§ç¯ããããšã§ãããåé¿ããæ¹æ³ããããŸãã ç§ããããããã£ãŠãè¯ãäŸãçã¿åºãããšãã§ãããã©ããèŠãŠã¿ãŸãããã
ããã1.0ã§åæ€èšãããŠãããã©ããç¥ãããã®ã§ããã ããã¯æè¿_lot_ã«åºãŠããŠããã1.0ãæ¥ãã§æ³šç®ãéãããšããããçŽåãããèã®å·ã«è·³ãäžããã®ã§ã¯ãªãããšå¿é ããŠããŸãã Rustã®æãç®ç«ã¡ã話é¡ã«ãªã£ãŠããæ©èœãšããŠãåçšãæŽç·ŽãããŠäœ¿çšå¯èœã§ããããšãéåžžã«éèŠã§ãã
ãã®ããã®RFCã«æéæ ã¯ãããŸããïŒ
@nikomatsakis圹ç«ã€å Žåã¯ã
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ã«ãããŸãããããéé£ããã®ã¯ééãã§ã¯ãããŸããã ç§ãèšåããŠããã®ã¯ããããããªãé°æ¹¿ãªåçšãã§ãã¯_ã¢ãããŒã_ãšAFAIKã®èª€ã£ã信念ã«åºæã®ãæ ¹æ¬çãªã解決ã§ããªãåé¡ã§ãããšæ°åè ã«ä¿¡ãããããããããªããšããããšã§ãã
å ŽåïŒãp =ïŒ...; use-pa-bit-but-never-again; expect-loan-to-be-expired-here;ã ä»ã®ãšããããã®åçšã®ã¹ã³ãŒãã®çµäºãæåã§å®£èšãã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æ¥ã«ã¯ã13: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
ãããã®ç¹å®ã®äŸã¯Rust1.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
ã¢ãŒã ã¯borrowckã«å€±æããŸãã
äžæè°ãªããšã«ã Some
ã¢ãŒã ã§int
ããã£ããã£ããããšããªãå ŽåïŒã€ãŸãã Some(_)
䜿çšããå ŽåïŒãã³ã³ãã€ã«ãããŸãã
@wyverlandãããç§ã¯æšæ¥ãããæã£ããããªãè¿·æã§ãã
@metajackæåã®æçš¿ãç·šéããŠããã®äŸãå«ããããšãã§ããŸããïŒ
ãŸã æ¯æ©ãããããŠããŸãããããããã³ã³ãã€ã«ããããšèšãããã ãã§ãã
#![feature(nll)]
fn main() {
let mut vec = vec!();
match vec.first() {
None => vec.push(5),
Some(v) => unreachable!(),
}
}
æãåèã«ãªãã³ã¡ã³ã
ãŸã æ¯æ©ãããããŠããŸãããããããã³ã³ãã€ã«ããããšèšãããã ãã§ãã