【学習10日目】データ型 複合型 タプル型

3.2.2 複合型
1) タプル型 (The Tuple Type)
タプルは、複数の型の何らかの値を一つの複合型にまとめ上げる一般的な手段です。
セットを作る。


let tup = (25, 2.5, "twenty-five"); //タプルをセット(数字、文字列混在OK)
let (x, y, z) = tup; //タプル内要素を順番にx,y,zに入れる (分配と呼ぶ)
println!("{} {} {}", x, y, z); // 引き出す個数は1個でも2個でもOK
上はx, y, zで引っ張り出す場合。
以下の順番=添字(0,1,2…)での呼び出しも可

let tup = (25, 2.5, "twenty-five");
let first_tup = tpu.0
println!("{}", first_tup);

【学習9日目】データ型 のこりから

3.2.1.2 浮動小数点型
floating-point number

イヤな言葉が出てきたが、これはまったく分からない。
浮動小数点とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
5のマイナス5乗ってなんですか?マイナスの累乗の仕組みについて教え... - Yahoo!知恵袋

たとえば 12.3 を表現するときに
123 × 10-1
10-1 は 1/101だから =0.1 か。
123 × 0.1 = 12.3
なんで、こんな回りくどいことを…。

Rust の浮動小数点型は、f32 とf64 で、それぞれ32 ビットと64 ビットサイズです。基準型はf64 です。

f32 が単精度浮動小数点数、f64 が倍精度浮動小数点数です。

浮動小数点数 - Wikipedia
単精度浮動小数点数では、符号部 1 ビット ・ 指数部 8 ビット ・ 仮数部 23 ビット
倍精度浮動小数点数では、符号部 1 ビット ・ 指数部 11 ビット ・ 仮数部 52 ビット

こいつについては一旦ここまでにしておこう。

3.2.1.3 数値演算
足し算、引き算、掛け算、割り算は ベタ打ちそのままで行ける。
余り(%) は何に使うかわからん。

3.2.1.4 論理値型

他の多くの言語同様、Rust の論理値型も取りうる値は二つしかありません: true とfalse です。Rust の論理値型は、bool と指定されます。


fn main() {
let t = true;
let f: bool = false; // 明示的型注釈付きで
}

3.2.1.5 文字型
文字列ではなく、文字
char型
char型はシングルクォートで囲む。

今日はここまで
明日は3.2.2 複合型から再開。

【学習8日目】データ型/整数型

the book 、読むのをHTML版からPDF版にしてわからないところにマーキング。
https://doc.rust-jp.rs/book-ja-pdf/book.pdf



データ型

スカラースカラー=大きさのみで表され、方向をもたない量
整数型(Integer) 小数部分のない数値
符号付き(プラス、マイナスあり)
符号なし (正のみ)

大きさ(bit) と 符号あり・なし

範囲
i 型 (符号付き・Signed)

u型は (符号なし・Unsigned)

※nんとこにbit数を入れる

2の補数とは - 意味をわかりやすく - IT用語辞典 e-Words


累乗の読み方 : ことばの広場

ある数を X とすると、X の累乗は Xn と表すことができる。このとき X を底(base)、n を「べき指数」(power exponent)と呼ぶ。

子供の頃は勉強大嫌いだったので、いま勉強するハメに。

i64 の場合(符号付き64ビット)は
-(264-1) ~ 264-1-1 の範囲の数字
=
ー9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 までの範囲の数字
=個数でいうと
18,446,744,073,709,551,616 (1,844京6,744兆737億955万1,616)個の数字を得られる。

Rust の基準型は一般的にいい選択肢になります。整数型の基準はi32 型です

Rust の整数リテラル(表し方?) 以下が可能、このようき書いてもよい、ということ???
( )内は例
10 進数 (98_222)
16 進数 (0xff)
8 進数 (0o77)
2 進数 (0b1111_0000)
バイト( u8 だけ) (b'A')

きょうはここまで

【学習7日目】変数と可変性

まずは、ずっと「あれ~どうやるんだろう」と思っていたが調べなかったことあれこれ

teraterm+tmuxでペインサイズ変更とコピー | tm23forest.com
tmuxのペインの大きさ調整(起動後) Ctrl+B → Alt+(方向キー) 5行、5文字単位

ペインのリサイズ - tmux | nju33
こちらはprefix (Ctrl+B→ :) その後 tmuxのステータスバーにカーソルが移るので、そこで「resize-pane -UDLR (方向) 数値」で1行、1文字単位で微調整可能。



さて数当てゲームについての説明をもう一度読み直した。たったあれだけのコードだが、説明を読むと中身が詰まりまくっている。これから次に進むのが不安だが、ともかく前に進もう。
今日はつづき「3. 一般的なプログラミングの概念」に入る。

この章では、ほとんど全てのプログラミング言語で見られる概念を講義し、それらがRustにおいて、 どう動作するかを見ていきます。多くのプログラミング言語は、その核心において、いろいろなものを共有しています。 この章で提示する概念は、全てRustに固有のものではありませんが、Rustの文脈で議論し、 これらの概念を使用することにまつわる仕様を説明します。
具体的には、変数、基本的な型、関数、コメント、そして制御フローについて学びます。 これらの基礎は全てのRustプログラムに存在するものであり、それらを早期に学ぶことにより、強力な基礎を築くことになるでしょう。

変数と可変性
以下がある。

  • let x = 5; (不変変数、不変な変数というのも妙だが)
  • let mut x = 5; (可変変数 mutable)
  • const MAX_POINTS: u32 = 100_000; (定数、要注釈、定数名は大文字_大文字がルール)

シャドーイング
これは初っ端から難しい。シャドーイングで同じ変数名の値を上書きできるなら不変じゃねーだろと思うが、読み進めよう。

シャドーイングは、変数をmutにするのとは違います。なぜなら、letキーワードを使わずに、 誤ってこの変数に再代入を試みようものなら、コンパイルエラーが出るからです。letを使うことで、 値にちょっとした加工は行えますが、その加工が終わったら、変数は不変になるわけです。mutと上書きのもう一つの違いは、再度letキーワードを使用したら、実効的には新しい変数を生成していることになるので、 値の型を変えつつ、同じ変数名を使いまわせることです。

ここはしっかり理解しないとあとで面倒になりそう。ここだけじゃなく、全部のステップがそうでしょうけど。

あとここの↓


fn main() {
let x = 5;

let x = x + 1;

{
let x = x * 2;
println!("The value of x in the inner scope is: {}", x);
}

println!("The value of x is: {}", x);
}

途中ににいきなり{ }でかこまれたのが入る、その入り方が分からない。
なぜ{ } で囲まなくてはいけないか。(最後のprintlnで入っている値を2番めのletに戻すためか? あとで実験)

あと、今回のサンプルコードを Cargo new --bin でつくったの、この --bin は何か、はおいおい。か。

今日のまとめ
let を使う変数の上書き。letで定義し直す。←これがシャドーイング(??)


let x = 1;
let x = 2;

let mutで可変にしておく場合。直で書き替え可


let mut x = 1;
x = 2;

※ただし変数の型を変更することは出来ない。

変数宣言(let)、そのあとにそこに入れるものを書くなりなんなり。順番がある。
例)


let mut guess = String::new(); ←まず宣言
io::stdin()
.read_line(&mut guess) ←そして入れる
.expect("Failed to read line");

今日はここまで。明日は3.2. データ型

おまけ
viのモード切替面倒くさい。。。。

【学習6日目】数当てゲームのコードのおさらい

いつか学習xx日目の数字を重複するだろう。それがいつの日か。
今日は数当てゲームのコードのおさらい、の前にVimのRust用プラグインのようなもの…についてネット調べ。
まずは列挙
GitHub - rust-lang/rust.vim: Vim configuration for Rust.

GitHub - rust-lang/rustfmt: Format Rust code

GitHub - rust-lang/rust-analyzer: A Rust compiler front-end for IDEs

あとなんかneovimというのがあるのを初めて知った。
GitHub - neovim/neovim: Vim-fork focused on extensibility and usability
rust-analyzer install / neovim

さて、これらをどうやってつなげるのだ?
わからないのでvimのことはひとまず中断。

nvim (プレーン) on FreeBSD, にWinからPower Shell でSSH

まずは朝食を食べながら、これを眺める。初学者として思ったことそのまま列挙

  • 改行、インデントなしでダーッと一行になっていたらまず読めない。整形大事。
  • インデントは、それがなにかの中に入っているという証。
  • 処理のリストなどは改行したほうがわかりやすい。
  • 文中の( ) { } = => などの前後のスペースは必須なのか、気になる。実験してみよう。
  • ピリオド、コンマが果たしている「機能」について知りたい。
  • セミコロンはわかりやすい。すべてはセミコロンで終わっている。matchを除いては...。
  • 記号ありなし、ひとつ欠けていたらダメとか、ぞっとする。
  • 冒頭のuseのところは計り知れないので言われたままに書いておけばいいのでしょう。use std:: となっていたら標準ライブラリにふくまれているもの(でいいのかな。)
  • 「::」での繋がりとか、「.」での繋がりとか訳わからなくて嫌な感じだ。(JavaScriptの document.writte を思い出して嫌な気分になる。
  • io::stdin() の.expect...を用意しないとエラーになるというのはいまのところはそういうものだと。read_lineがResult型で、云々カンヌン。
  • let guess 以下の Ok(num) => num, このnumがどこへ行くのか分からない。判定だから別にどこへも行かなくてもイイのか。ではなぜExitとかじゃなくて「num」なんだろう。"num"はこの行にしか登場しない。
  • ("You guessed: {}", guess); このコンマの後に変数名で、その値が{}の中に表示されるというこのルール。あたりまえのように書かれていて嫌なカンジダ
  • 最後のこれが美しい。

nvimはしばらくプレーンで使って、必要だったらプラグインを入れていこう。
今日は終了。

読んだ記事メモ
いちからvimのrust開発環境を構築していく❗️(rust.vim, coc.nvim)
これが無いと個人的に業務が辛いツール紹介(fzf, vim, tmux) ~ひきこもりターミナルライフ~ - Qiita
Rust開発用のVimの設定
neovim とは何か? | Vim入門
Neovim の設定を綺麗に整理してみた - Qiita

【学習5日目】loop, break


loop {

}

loopの中に入れる前と後でのmatchの以下の変化が面白かった

変更前


match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => println!("You win!"),
}

変更後


match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => {
println!("You win!");
break;
}
}
break を入れる前のmatchのアームは => の後、いずれも末尾が「,」で終わっていたが、
breakを入れるときに => { } で囲み、末尾に「,」はつけない。

期待された入力とは違うものがタイプされた場合の処理の部分

変更前


let guess: u32 = guess.trim().parse().expect("Please type a number!");

変更後


let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};

  • parseがResult型を返すこと
  • ResultがOkとErrの列挙子を持つ列挙型であること
  • Err(_) アンダースコアはすべての値を受け付けます

このErr(_) => continue, でなぜloopの最初に戻れるのかが分からない。
let は変数の定義だと思うが、その中にコマンド(?)を入れられるのがよく分からない。

今日はここまで。
明日はこの guess_numberのコード全体の仕組みを、いまの段階で理解出来るまで読み直す。
分からない部分はメモする。の予定

おまけ
. ←ピリオド period
, ←コンマ comma
: ←コロン colon
;セミコロン semi-colon

【学習4日目】match, cmp

enum ってなんだっけか。
→これらのResult型は列挙型になります。 列挙型はenumとも呼ばれ、取りうる値として決まった数の列挙子(variant)を持ちます。
うむなんだかよくわからないが。

予想と秘密の数字を比較する

match式は複数のアーム(腕)で構成されます。
各アームのパターンを順に照合していきます。

符号なし整数型とは、整数を格納するデータ型の一種で、0と正の数のみを表現できる整数型。
【Rust入門】基本データ型(プリミティブ型)について

明日は
ループで複数回の予想を可能にする