合成とパイプフォワード演算子(like in other languages)の両方がRustに存在しますか?もしそうなら、彼らはどのように見えるのでしょうか、一方は他方に優先されるべきですか?存在しない場合、なぜこの演算子は必要ではありませんか?Rustの合成演算子とパイプフォワード演算子
答えて
あり、組み込みには、このようなオペレータはありませんが、それは定義するのは特に難しいことではありません。
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
を参照してください。
これらの演算子は、私が知っている限り、Rustには存在しません。これまでのところ、私はそれらの必要性をほとんど感じていないし、Rust構文のコアをかなり小さく保つ努力もある。たとえば、Rustは明示的なメッセージパッシング演算子を使用していましたが、これらは削除されました。
オペレータのオーバーロードを使用して、必要に応じて同様の機能を実現したり、独自の作成機能またはパイプ転送機能を作成することができます。 Rustチームが標準ライブラリにこれを含めることができるのであれば、私は驚くことはありません。
他のポスターが言ったように、そのような演算子は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の
- Official Docs
- Rust for Rubyists
- #rust:あなたは言語で動作するよう最後に、私はあなたがご相談をお勧めしたいウェブの周りに本当に便利なリソースの数があります
欲しいものは、Rustコミュニティへようこそ!
- 1. 演算子( - - )()演算子C#
- 2. 演算子if演算子
- 3. XOR演算子とstd :: ostream演算子
- 4. Xval演算子と比較演算子?
- 5. 共有ポインタ[]演算子と++演算子
- 6. C++演算子()括弧 - 演算子Type()vs型演算子()
- 7. 演算子のオーバーロード演算
- 8. Pythonのビット演算子 '&' 演算子
- 9. 左結合演算子対右結合演算子
- 10. C++演算子+演算子+ =オーバーロード
- 11. は、Invoke演算子&演算子はKotlin
- 12. C++:演算子オーバーロード、演算子+
- 13. Java演算子 - > how ==演算子
- 14. Cでのラムダ計算:ブール演算子とNOT演算子
- 15. カサンドラビット演算と演算子(&、or not)
- 16. 算術演算子と関係演算子
- 17. Cプログラミング!算術演算子演算
- 18. DocumentBuilderFactoryと演算子
- 19. C++と++演算子
- 20. PHPと??演算子
- 21. オーバーロード演算子 `[]`と ':'
- 22. !=演算子とファイルストリーム
- 23. <<演算子とC++の文字列のオーバーロード+演算子
- 24. C#の演算子の演算順序
- 25. 演算子!()とif条件の演算子 - ()
- 26. Elastic検索のOR演算子とAND演算子
- 27. 多分合体演算子
- 28. 演算子結合性
- 29. ポストインクリメント演算子++
- 30. オーバーロード演算子+
これは美しいです! –
各ステップの括弧は必要ですか?私は操作の順序が何であるかについてはあまりよく分かりません。 "Shr"とは何ですか?それはあなたが "シフト右"演算子をオーバーロードする方法ですか?私たちは別のものを定義できますか? '|>'と言ってください。 – mpen
@Mark no、あなたは新しい演算子を定義することはできません。はい、括弧が必要です。 '|&x | x + 1 >> |&x | 2 * x'は '|&x | x +(1 >>(|&x | 2 * x)) 'となり、' 1'をクロージャで右にシフトすることは意味をなさない(そして、期待通りにタイプチェックもしない)。 – huon