Open15

Rustをちゃんと勉強してわかったことまとめ

泡沫京水泡沫京水

asキーワード

asキーワードは、TypeScriptのasと同じで、型キャストを行う構文

泡沫京水泡沫京水

unsafeキーワード

メモリの安全性を損なうコードを記述した際にコンパイラがエラーを出すことを回避するためのもの。
ゆえに un safe

泡沫京水泡沫京水

整数型

uとつく型が符号なし(unsigned)整数
iとつく型が符号あり(signed)整数

整数リテラル

バイナリリテラル

文字列変換

泡沫京水泡沫京水

ポインタ型

メモリの直接操作をする

  • Raw Pointer型
    • アドレスそのものを扱う
    • そのアドレスが有効な領域を参照していることや有効なデータが格納されていることが保証されないことを考慮する必要がある
    • C/C++で利用するメモリアドレスを操作するポインタと同様
  • Reference型
    • 任意の方の値へのアドレスを参照するために使用
      • 生のポインタとは違い、参照先アドレスが有効な領域であり、データが格納されていることが保証されている

宣言

ポインタを扱う変数を宣言するためには、*constのキーワードを利用して変数宣言する

let 変数名: *const 型名 = &変数名

ポインタが指し示す値を変更可能にするには、*mutキーワードを利用して変数宣言し
ポインタを渡す場合は、&mutキーワードを利用する

let 変数名: *mut 型名 = &mut 変数名

可変ポインタ

ポインタを使う変数もmutキーワードを利用し、別のポインタを代入して利用できる

泡沫京水泡沫京水

unsafeブロック内でポインタを利用したデータアクセスのことを参照外しという

泡沫京水泡沫京水

制御式

条件分岐

if-else

if 条件式 {}

if 条件式 {} else {}

if-else-if

if 条件式 {} else if 条件式 {} else {}
/* else-if と elseの間にはいくらでもelse-ifを置ける */

if-let

三項演算子みたいな使い方をする

let 変数名 = if 条件式 {[条件があった時の処理;] 返す値} else if 条件式{ [条件があった時の処理;] 返す値} else {[どの条件にも合わなかったときの処理;] 返す値}
/* else-if と elseの間にはいくらでもelse-ifを置ける */
泡沫京水泡沫京水

パターンマッチング

match式 (switch文みたいなもの)

match{
    パターン => {処理;},
    パターン => {処理;},
    パターン => {処理;},
    _ => {どのパターンに一致しなかったときの処理;}
}

match-let式 (switchと三項演算子を足したみたいなもの)


泡沫京水泡沫京水

RangeとOR演算子

これまでのmatch式は
1つのパターンを評価した結果で処理をする形式

分岐評価は以下のことが可能

  • Rangeを利用した範囲指定
  • OR演算子を利用した複数式の評価で分岐

OR演算子の利用は、「パターンm | パターンn」のような記述ができ、範囲指定とOR演算子を組み合わせることもできる

泡沫京水泡沫京水

繰り返し

forループ

  • カウンタを利用して決まった回数のループ処理をする方法
    for カウンタ処理名 in カウンタ変数がとりうる範囲 { 繰り返す処理 } 
    
  • 配列、スライスなどの多数の要素を先頭から順番に取り出す方法
    for 1つの要素を受け取る変数 in 配列やスライスなど { 繰り返す処理 }
    
泡沫京水泡沫京水

ちょっと脇道にそれて

勉強も兼ねて、RustでNotion APIを扱うための
notioncrateを使おうと思ったが、それを使って実装した記事が見当たらんくてぴえん。
そのため、自分で実装していくために、学んでいくことにした。

泡沫京水泡沫京水

notion::NotionApi::new(api_token: String)に対して、
Notion APIを使う上で作成したTokenを渡して、インスタンスを作成する

use notion::NotionApi;

#[tokio::main]
async fn main(){
    dotenvy::dotenv().expect(".env file not found");
    let client = NotionApi::new(dotenvy::var("NOTION_KEY").unwrap()).expect("取得に失敗しました");
}