Rust 入門
Rust入門
わからない単語や概念、実装についてまとめていく。
「実践Rustプログラミング入門」や「詳解Rustプログラミング」を教材にしていく。
現時点でわからない単語のリスト
- ベアメタル言語
- ゼロコストの抽象(Rustの哲学)
- ヒープ
- スタック
- 共有参照
- 参照カウント
- ポインタ型
- セマンティクス
- データ指向プログラミング
- ディスパッチ(メソッドをディスパッチする)
- ライフタイム省略(lifetime elision)
- ハイジェニックマクロ(hygenic macro)
- 移動の意味(move semantics)
- 代数的データ型(algebric data types)
- デリファレンス(参照の目的、アドレスの目的が少しわかった。)
まずベアメタルとは
ベアメタル(英: bare metal)とは、計算機科学では、オペレーティングシステム (OS) を介さずに、ロジックハードウェア上で直接命令を実行するコンピュータを指す。ベアマシン(英: bare machine)とも呼ばれる。bareとは「裸」のことで、OS等の「衣」を纏っていない、という意味。
Wikiより。
Bare metal programming とは
**What Does Bare-Metal Programming Mean? **
Bare-metal programming is a term for programming that operates without various layers of abstraction or, as some experts describe it, "without an operating system supporting it." Bare-metal programming interacts with a system at the hardware level, taking into account the specific build of the hardware.
だそう。
以下DeepLで翻訳した文章。
ベアメタル・プログラミングとは?
ベアメタルプログラミングとは、様々な抽象化レイヤーなしで動作するプログラミングのことで、"オペレーティングシステムのサポートなし "と表現する専門家もいます。ベアメタルプログラミングは、ハードウェアの特定のビルドを考慮しながら、ハードウェアレベルでシステムと相互作用する。
Rustの根幹となる考え方
ゼロコスト抽象化
記述中...
難しいから先送り
「実践Rustプログラミング入門」のチャプター4にてCLIツールの「clap」を使っているのだが、仕様が大きく異なっており、躓いた。
以下のリンクが参考になり大変助かった。
The Bookより
定数の名前がMAX_POINTSで、値が100,000にセットされた定数定義の例をご>覧ください。
(Rustの定数の命名規則は、 全て大文字でアンダースコアで単語区切りすることです):
同上より引用
では、どの整数型を使うべきかはどう把握すればいいのでしょうか?
もし確信が持てないのならば、 Rustの基準型は一般的にいい選択肢になります。
整数型の基準はi32型です: 64ビットシステム上でも、 この型が普通最速になります。
isizeとusizeを使う主な状況は、何らかのコレクションにアクセスすることです。
Rustの関数と変数の命名規則は、スネークケース(訳注: some_variableのような命名規則)を使うのが慣例です。
スネークケースとは、全文字を小文字にし、単語区切りにアンダースコアを使うことです。
↑
Goとは異なる点。比較すること自体がおかしいかも知れないが、Goが一番慣れているので。
fn main() {
let x = 5;
let y = {
let x = 3;
x + 1
};
println!("The value of y is: {}", y);
}
今回の場合、4に評価されるブロックです。
その値が、let文の一部としてyに束縛されます。 今まで見かけてきた行と異なり、文末にセミコロンがついていないx + 1の行に気をつけてください。
式は終端にセミコロンを含みません。式の終端にセミコロンを付けたら、文に変えてしまいます。
そして、文は値を返しません。 次に関数の戻り値や式を見ていく際にこのことを肝に銘じておいてください。
The Book chapter 3-3より。
式と文について理解を深める必要がある。
今までのスクラップを振り返って、座学寄りすぎると感じたので、実践で躓いたところを記述していく形式にする。
actix-web でJSONのdatetimeをバインドする方法がわからない。
serde_jsonだった。
use chrono::{format, NaiveDate, TimeZone, Utc};
pub fn parse_and_transform_date(date_str: String) -> Result<i64, format::ParseError> {
let date = NaiveDate::parse_from_str(&*date_str, "%Y-%m-%d %H:%M:%S")?;
let date_parsed: i64 = Utc
.from_utc_date(&date)
.and_hms_milli(0, 0, 1, 0)
.timestamp_millis()
.clamp(
Utc.ymd(2016, 1, 1)
.and_hms_milli(0, 0, 0, 0)
.timestamp_millis(),
Utc::now().timestamp_millis(),
);
Ok(date_parsed)
}
次は借用、所有権で躓いている。
その前にCopy、clone()で引っかかった。