さて、Rustは公式にも、C++と同等程度のパフォーマンスを出しつつ、メモリセーフで並列化可能なプログラムを書くための言語として開発が進められていると書かれています。そして、実際C++と似通った概念も多いので、C++とRustの違いを明確にするため、以下にC++の概念とRustの概念を極力、対になるように列挙してみました。
mod = namespace
& = const& (Rustの参照とC++の参照は同じ。ただし、Rustはデフォルトでimmutable)
&mut = &
デリファレンスと参照化(ポインタ化)は同じ演算子でできる。宣言と演算子で意味が変わらない分、Rustの方が親切(unsafe時は、その限りではない)(C++でナマのポインタを扱う人は稀だろうから、これは当てはまらないかも)
fn method(&mut self) = void method()
fn method(&self) = void method() const
fn new() -> SomeType = SomeType() (コンストラクタは、ファクトリメソッドとして定義)
(デストラクタはfn drop(self)と書くのが通例のよう。Clone traitを実装してると挙動変わるかも?基本的にデストラクタは、スコープ外に抜けさせて作用させるので、明示的にdropするのは、RAIIを使ってる時ぐらいみたい。それも、リソースを解放するよという意思表示の意味が強そう)
fn staticMethod() -> () = static void staticMethod() (特殊変数selfを第1引数に取らないメソッドは、staticメソッドとして解釈される。Rustのコンストラクタはこの性質を利用したもの。デフォルトコンストラクタをnewと書くのは、単なる習慣みたい)
std::boxed::Box = std::unique_ptr (メモリの所有権を持つスマートポインタ)
他にもReference Countを使用したスマポもある。
std::boxed::Box = std::unique_ptr (メモリの所有権を持つスマートポインタ)
他にもReference Countを使用したスマポもある。
/*****
use std::os;
fn main() {
let args = os::args();
let arg1 = match args.len() {
1 => args[0],...
/*****
int main(int argc, char* argv[])
{
char* arg1 = (argc == 1) ? argv[0] :...
*****/
(main関数は、引数も戻り値もなしがRust流。コマンドライン引数には、std::osモジュール経由でアクセスする)
/*****
impl Add for SomeType {
type Result = SomeType;
type Result = SomeType;
pub fn add(self, rhs: SomeType) -> SomeType {...
/*****
class SomeType
{
public:
static SomeType operator+(SomeType rhs)
{....
*****/
(オペレータのオーバーロードは、対応するtraitをimplすることで行う。+演算子がaddメソッド呼び出しのsyntactic sugarになっている)
(まだ追記するかも...)
(まだ追記するかも...)