2013-06-11 12 views

答えて

19

あり、組み込みには、このようなオペレータはありませんが、それは定義するのは特に難しいことではありません。

use std::ops::Shr; 

struct Wrapped<T>(T); 

impl<A, B, F> Shr<F> for Wrapped<A> 
    where F: FnOnce(A) -> B 
{ 
    type Output = Wrapped<B>; 

    fn shr(self, f: F) -> Wrapped<B> { 
     Wrapped(f(self.0)) 
    } 
} 

fn main() { 
    let string = Wrapped(1) >> (|x| x + 1) >> (|x| 2 * x) >> (|x: i32| x.to_string()); 
    println!("{}", string.0); 
} 
// prints `4` 

Wrapped新しいタイプの構造体は、Shrインスタンスを許可するように純粋である、そうでない場合、我々はそれを実装する必要がありますので、ジェネリック(すなわちimpl<A, B> Shr<...> for A)で動作しません。慣用錆が演算子を使用する代わりに、このメソッドを呼び出すmapなる


注意。標準的な例については、Option::mapを参照してください。

+0

これは美しいです! –

+0

各ステップの括弧は必要ですか?私は操作の順序が何であるかについてはあまりよく分かりません。 "Shr"とは何ですか?それはあなたが "シフト右"演算子をオーバーロードする方法ですか?私たちは別のものを定義できますか? '|>'と言ってください。 – mpen

+0

@Mark no、あなたは新しい演算子を定義することはできません。はい、括弧が必要です。 '|&x | x + 1 >> |&x | 2 * x'は '|&x | x +(1 >>(|&x | 2 * x)) 'となり、' 1'をクロージャで右にシフトすることは意味をなさない(そして、期待通りにタイプチェックもしない)。 – huon

3

これらの演算子は、私が知っている限り、Rustには存在しません。これまでのところ、私はそれらの必要性をほとんど感じていないし、Rust構文のコアをかなり小さく保つ努力もある。たとえば、Rustは明示的なメッセージパッシング演算子を使用していましたが、これらは削除されました。

オペレータのオーバーロードを使用して、必要に応じて同様の機能を実現したり、独自の作成機能またはパイプ転送機能を作成することができます。 Rustチームが標準ライブラリにこれを含めることができるのであれば、私は驚くことはありません。

-1

他のポスターが言ったように、そのような演算子はRustに存在せず、おそらく追加されません。リンクしているページに記載されているパイプフォワード演算子は、データフローを容易にします。そのために、錆の方法は、タスクを生成し、データチャネルを使用してそれらの間で情報を送信することです。

タスクは他の言語のスレッドと似ていますが、より厳しい(したがって安全な)メモリ共有ルールがあります。例として、タスクとポート/チャネルを使用して2つのプロセス間のデータフローを促進するサビプログラムがあります。注 - このコードは、この概念は、あなたのプログラムを実行する必要がどのようなデータフローモデル化するために拡張することができるバージョン0.6

extern mod std; 

// Import the relevant pipes structs and the stream fn 
use core::pipes::{stream, Port, Chan}; 
use std::comm::DuplexStream; 

// This function shows the simplest case of using a 
// channel and a pipe 
fn pipes() { 
    // Create a new stream 
    let (port, chan): (Port<int>, Chan<int>) = stream(); 
    // Spawn off a task to send '10' through the channel 
    do spawn { chan.send(10); } 
    // The recv call will block until data is present 
    println(int::to_str(port.recv())); 
} 

// This function will serve as the logic for the 
// data flow task below 
fn plus_one(channel: &DuplexStream<int, int>) { 
    let mut value: int; 
    // Add one and send back the result until 0 is encountered 
    loop { 
    value = channel.recv(); 
    channel.send(value + 1); 
    if value == 0 { break; } 
    } 
} 

fn main() { 
    // DuplexStream, as the name implies, allows bidirectional 
    // information flow 
    let (from_child, to_child) = DuplexStream(); 

    do spawn { plus_one(&to_child); }; 

    from_child.send(22); 
    from_child.send(23); 
    from_child.send(24); 
    from_child.send(25); 
    from_child.send(0); 

    for 4.times { 
    let answer = from_child.recv(); 
    println(int::to_str(answer)); 
    } 
} 

に対してコンパイルされました。 Actor Modelの点で問題を再構想することは役に立ちます。 irc.mozilla.orgの

  1. Official Docs
  2. Rust for Rubyists
  3. #rust:あなたは言語で動作するよう最後に、私はあなたがご相談をお勧めしたいウェブの周りに本当に便利なリソースの数があります

欲しいものは、Rustコミュニティへようこそ!