【Rust】Rust練習問題集に問題を追加しました

【Rust】Rust練習問題集に問題を追加しました

Rust練習問題集

【Rust/rustup/multirust/rustc】uninstallしたい!「rustup cannot be installed alongside [Rust|multirust]. Please uninstall first」rustcが邪魔してrustupがinstallできない場合1つの方法

【Rust/rustup/multirust/rustc】uninstallしたい!「rustup cannot be installed alongside [Rust|multirust]. Please uninstall first」rustcが邪魔してrustupがinstallできない場合1つの方法

ものにするぞー

Q4

fn main() {
    let a = { 10 + 20; };
    println!("a is {}", a);
}

はエラーが起きます。正しくなおして、原因を教えてください

A4

ブロック内にセミコロンを入れると文になります。
()と言う値が変数aに入ってしまう
このaはprintln!マクロで表示ができないのでコンパイルエラーになります

関数を式として扱った場合

fn main() {
   // 関数は式になる
    let a = add(10, 20);
    println!("a is {}", a);
}

Q5
for文を使って1から10まで加算し、合計が代入されているsumを表示してください

A5

fn main() {
    let mut sum = 0;
    for i in 0..10 {
        sum += i ;
    }
    println!("sum is {}", sum);
    //sum is 45
}

Q6
このエラーを解決してください

error[E0384]: cannot assign twice to immutable variable `sum`
 --> src/main.rs:4:9
  |
2 |     let sum = 0;
  |         ---
  |         |
  |         first assignment to `sum`
  |         help: make this binding mutable: `mut sum`
3 |     for i in 0..10 {
4 |         sum += i;
  |         ^^^^^^^^ cannot assign twice to immutable variable

error: aborting due to previous error

For more information about this error, try `rustc --explain E0384`.
error: could not compile `hello`.

A6

fn main() {
    let sum = 0;
    for i in 0..10 {
        sum += i;
    }
    println!("sum is {}", sum);
}

Q7
ビット演算子とはなんですか?

A7
コンピューターの0と1のビット単位を計算するための特別な演算子

  • CPUは主に8ビット(1バイト)の単位で計算を行う(0と1の8桁でで表現すること8ビットを1バイトとする)

Q8
”hello”をprintするだけの関数no_paramをmain関数の中で呼び出してください。

A8

fn main() {
    no_param();
}

fn no_param () {
    println!("hello");
}

Q9
1と2を引数x, yとして渡してそれらを出力する関数を定義して実行してください

A9

fn main() {
    tow_param(1, 2);
}

fn tow_param (x:i32, y:i32) {
    println!("x is {}, y is {}", x, y);
}

Q10
1と2を引数x, yとして渡し、それを合計した数を返す関数を定義して、実行、受け取った値を出力してください

fn main() {
    let xy = add_param(1, 2);
    println!("xy is {}", xy)
}

fn add_param (x:i32, y:i32) -> i32 {
    println!("x is {}, y is {}", x, y);
    x + y
}

Q11
i32型のxフィールドを持つSampleを作り、
Sampleが持つメソッド、int(xに1を加算した値を返す)、add(引数を取り、xに引数と加算した値を返す)の2つ定義して呼び出してください

A11

  • main関数の中でコンストラクタでxを初期化し、
  • int関数xを引数にとり、1を足したi32型の値を返す
  • add関数 xを引数にとりxフィールドにxを足した値を返す
  • 呼び出し時の値はなんでもよい
struct Sample {
    x: i32
}
impl Sample {
    fn new (x: i32) -> Sample {
        Sample{x: x}
    }
    fn int(&self) -> i32 {
        self.x + 1
    }
    fn add(&self, x: i32) -> i32 {
        self.x + x
    }
}

fn main() {
    let a = Sample::new(1);
    let ans = a.int();
    println!("ans is {}", ans);
    let ans2 = a.add(30);
    println!("ans2 is {}", ans2);

}

Q12
xを引数にとって、mainブロック内に定義されたi32型のnumと加算するクロージャー(関数内で定義された関数)を実行して出力してください
A12

fn main() {
    let num = 1;
    let add = |x|{num + x};
    let ans = add(2);
    println!("x is {}", ans);
}

Q13
こちらはコンパイルエラーになります

fn main() {
    let x = String::from("a");
    let y = x;
    println!("x is {}, y is {}", x, y);
}

xの値をyに束縛、その後xを表示しようとしています。
何故だか教えてください。また正しく書いてください

A13
xの所有権はyに移っているためxは参照するものがありません。
もしxの参照先を渡したい場合
&xとします

fn main() {
    let x = String::from("a");
    let y = &x;
    println!("x is {}, y is {}", x, y);
}

こちら

fn main() {
    let x = String::from("a”); // ここは_xとする必要がありますが問題の伝え易さのためそうしています
    let x = String::from("b");
    println!("x is {}", x);
}

のように同じ変数名で定義し直すことをなんと言いますか。

A14
シャドーイング
後から値を変更できる
最初のlet xの定義を覆い隠すシャドーイングすることができる
最初のxと次のxは別物
束縛する方は数値でも文字列でも可能

Q15
こちらはコンパイルエラーになります

fn main() {
    let x = String::from("a”);
    println!("x is {}", x);
    x = String::from("b");
    println!("x is {}", x);
}

何故ですか、またxが再束縛なように修正してください

A15
Rustではletで宣言された変数は再束縛できません。(変数なのに)
後から再束縛する必要がある場合、宣言時mutをつける必要があります

fn main() {
    let mut x = String::from("a");
    println!("x is {}", x);
    x = String::from("b");
    println!("x is {}", x);
}

「武骨日記の」プライバシーポリシーに関して
プライバシーポリシー
個人情報取り扱いに関して

サイトTOP
私は何者か
29歳よしもと芸人がWebデザイナー未経験で学校に通い5年後フリーランスのフロントエンドエンジニアになるためにやった9つのこと
フロント記事
フロントエンドエンジニア
フロントエンド記事(タグ)
TypeScript
TypeScript練習問題集
【TypeScript】TypeSript中級者になる為に知っておくと良い108個のこと
JavaScript練習問題
styled-componentsの使い方
SCSS問題集
GraphQL「Apollo x Relay-Style-Cursor-Pagination(リレースタイルカーソルページネーション)」
recomposeと仲良くなりたい
機動戦士FlowType
初めてReactNativeWebを触ってみて
Ramda.jsシグネチャの読み方
環境変数の話
いちごタルトの作り方
フロントエンドエンジニア豚汁の作り方


「武骨日記の」プライバシーポリシーに関して
プライバシーポリシー

株式会社TerraceTechについて
最近起業しました。
株式会社TerraceTech

SNS
しずかなインターネット kenjimorita
インド旅 instagram
適当な日常写真 instagram
シュールさーん instagram
シュールさーん LINEスタンプ
もりたけんじTwitter
ネタ帳Twitter
note

FaceBook -kennji.morita-

わたしが結成しているWebチームではWeb未経験者、フリーランスの方へのお仕事を紹介しています。
また個人レッスンしてほしい生徒も募集中です。
もしご興味ある方はチャットからご連絡ください。

※業務連絡やお久しぶり連絡もチャットからお願いします。