2016-11-03 10 views
0

は、それは割り当て、単一の式で比較するのが一般的です:式で代入と比較を組み合わせることはできますか? Cで

私は、このようルーストに表現することができることを理解したよう
n = n_init; 
do { 
    func(n); 
} while ((n = n.next) != n_init); 

:Cバージョンと同じように機能し

n = n_init; 
loop { 
    func(n); 
    n = n.next; 
    if n == n_init { 
     break; 
    } 
} 

(ループの本体がcontinueを使用しないと仮定します)。

ルストでこれを表現するために、より簡潔な方法はありますか、理想的な上記の例ですか?この質問の目的のために

、所有権を引き受けるか、ボローチェッカーを満たすことは問題ではありません。これらの要件を満たすのは開発者次第です。 - 私は錆にループのこのスタイルのかなり多くを移動しているよしかし、私は

n = n_init; 
loop { 
    func(&vec[n]); 
    n = vec[n].next; 
    if n == n_init { 
     break; 
    } 
} 

これは、錆の例は、慣用的な錆であることを明らかに思えるかもしれません:整数として例えば

、それを表現するためのより良い/異なる方法があるかどうかを知りたいと思った。

+0

パターンをイテレータにラップすることを考えていますので、次のようにします: 'some_iter(n_init){func(n)}' –

+2

完全な例を投稿してください。スニペットを投稿するたびに、関連するタイプが何であるかを推測する必要があります。彼らは 'コピー'ですか?彼らは何かの所有権を持っていますか?私たちは知らない!私たちは知らない! –

+0

@Matthieu Mを表現することができるフロー制御のどのような種類に興味があります、それは他の側面からそらすため、私はむしろ私の質問の正確なタイプが含まれていない、とその部分は、私はむしろ自分自身を管理します。 – ideasman42

答えて

5

ルストで反復を表現する慣用の方法はIteratorを使用することです。したがって、あなたはn = n.nextを行うイテレータを実装して、イテレータを反復するforループを使用します。

struct MyIter<'a> { 
    pos: &'a MyData, 
    start: &'a MyData, 
} 
impl<'a> Iterator for MyIter<'a> { 
    type Item = &'a MyData; 
    fn next(&mut self) -> Option<&'a MyData> { 
     if self.pos as *const _ == self.start as *const _ { 
      None 
     } else { 
      let pos = self.pos; 
      self.pos = self.pos.next; 
      Some(pos) 
     } 
    } 
} 

その代わりに第二から出発しての最初の要素から開始することができるように、このイテレータを適応させるために、読者に運動として残っています。

2

錆はifwhileでパターンマッチングをサポートしています。

  • 代わりに、ブール条件を有していると、テストはパターンがパターンマッチングの一部として
  • に一致した場合、あなたにマッチした値をバインド成功したと考えられています名前このよう

、代わりにブール条件を有しているとあなたはOption ...

を構築している場合
fn check(next: *mut Node, init: *mut Node) -> Option<*mut Node>; 

let mut n = n_init; 
loop { 
    func(n); 
    if let Some(x) = check(n.next, n_init) { 
     n = x; 
    } else { 
     break; 
    } 
} 

しかし、代わりにIteratorを使用できる場合は、はるかに慣用的です。

+0

興味深いですが(場合によっては良い解決策かもしれませんが)、これは、フロー制御をあまり明確にしないで、初期値に達すると単純に破棄する回り込みと間接の答えとなります。 – ideasman42

+0

@ ideasman42:完全に合意しましたが、条件に代入したい場合は、それが私が考えることができる唯一のパターンです(私はその使用を推奨しません)。 –

関連する問題