day 37 @go 構造体のフィールドにアクセス

ドットでアクセスする。myStruct.value

day 36 @go struct

定義方法 type MyStruct struct { first_field int second_field *int }

day 36 @rust trait①

・traitの定義とtraitの実装方法 trait MyTrait { fn shared_function(&self); } impl MyTrait for MyStruct { fn shared_function(&self) { // do something } } ・メソッドのデフォルト動作を決めておく trait MyTrait { fn shared_function(&self) { prin…

day 35 @go ポインター

・ポインター型の表現 アスタリスクの後ろに型をつける。 *Type var intPointer *int ・変数のアドレスの取得方法 &を使う &variable var num = 10 var int_pointer *int = &num ・参照はずしによって中身を扱う *を使う *variable var int_pointer = &num *…

day 35 @rust ジェネリクス

・ジェネリック関数 fn function(val: T) -> T { ~~ } ・ジェネリック構造体 struct MyStruct { val: T, } ・ジェネリック列挙型 enum MyEnum { A(T), } ・ジェネリックメソッド impl MyStruct { ~ }メソッドに関しては重要なのはimplの後にもつけること。

day 34 @go defer

defer はstack形式で実行される。つまり一番最後のdeferから実行されていく。 func main() { defer fmt.Println("1") defer fmt.Println("2") defer fmt.Println("3") defer fmt.Println("4") defer fmt.Println("5") } 出力は 5 4 3 2 1

day 34 @rust 回復可能なエラーを発生させる。

・回復可能なエラーはResultを使うResultはenumで OkとErrの2つがある。・?オペレータ Resultを返す関数の後ろにつける。 もし関数が成功すれば中身の値を取り出して返す。 失敗すれば失敗をreturnする。 fn sample() -> Result<String, fs::io::Error> { let s = String::new(); f</string,>…

day 33 @go defer

defer 式 とすることで遅延処理を書くことができる。 a := 1 defer fmt.Println(a + 1) a += 2 // printed 2 上記のように引数に対しての評価はその場でされる。

day 33 @rust panicマクロ

回復不可能なエラーを発生させるのに使う。 引数はメッセージpanic!("hoge hoge error occure");スタックとレースをするには BACKTRACE=1 cargo run とする。

day 32 @go 条件省略 switch

switchの条件が省略されたときはtrueが適用される。 switch { case a > b: hoge() case a == b : hogehoge() default: hogex3() }

day 32 @rust hash map

生成方法 1つめ HashMap::new() 2つめ vec1.iter().zip(vec2.iter()).collect();要素の取得 getメソッドを使う。所有権はhashmapに移動する。for (key, value) in hm { ~~ } の形で繰り返しができる。insertで値の上書きが可能。キーがあるなしで操作を変更…

day 31 @go switch

switchは上から下へ条件の吟味をする。

day 31 @rust string

・文字列の作成方法 String::new() String::from("~") ディスプレイを実装しているデータ型ならto_string() ・文字列の連結 .push_str("~") .push('a') +演算子 formatマクロ ・文字列に対してインデックス記法でのアクセスはできない。 ・文字列に対してス…

day 30 @go short statement

if v := 1; v < 10 { // vを使える。 } else { // ここでもvを使える。 } vはelseでも使える。

day 30 @rust コレクション1 vec

・ベクトル の作り方 1 Vec::new() 2 vec![a, b, c]ベクトルが破棄されるとその要素も破棄される。要素のへのアクセス インデックス記法もしくはgetメソッド要素の追加 pushメソッドv = vec![a, b,c];のとき for i in &v {} とすることでiterate可能複数の型…

day 29 @go short statement if

goではifの中で変数の初期化ができるif i := 1; i fmt.Println(i) } ことのきiのスコープはif中のステートメントのみ。

day 29 @rust モジュールの分割

・ファイルの分割 // lib.rs mod mod_a; // mod_a.rs pub fn hello() { println!("hello"); } src I- lib.rs L mod_a.rs・ディレクトリ を用いた分割。 // lib.rs mod mod_a; // mod_a.rs pub mod mod_b; // mod_a/mod_b.rs pub fn hello() { println("hello…

day 28 @go if

c系の言語と同じ。ただ条件を()で囲む必要はない。 if condition { }

day 28 @rust インポート

use を使ってインポートする。慣習として関数に関しては親モジュールをインポートして使い。 構造体、列挙型に関してはフルパスで指定する.参照名のエイリアスにはasを使う。 use A::B as C;pub useの組み合わせでインポートしたものをそのモジュールの一部…

day 27 @go loop

go ではループにもforを使う package main import "fmt" func main() { cnt := 0 for { cnt += 1 fmt.Println(cnt) if cnt == 10 { break } } }

day 27 @rust pub & super

pub 対象の物をパブリックなものにする。 構造体、モジュール、関数、列挙型とうに使える。pub mod { ~~ }super モジュールの使用時に指定するパスにおいてファイルシステムの".."と同じ役割をする。構造体のアクセス権 フィールドごと、メソッドごとに指定…

day 26 @go forループで必要な物

forでは初期化部分と継続条件部分と事後処理部分があるが実際には継続条件さえあれば良い package main import "fmt" func main() { cnt := 0 for ; cnt < 100; ; { cnt += 10 } fmt.Println(cnt) }

day 26 @rust モジュールのパス

モジュールの読み込みのパスには絶対パスとしての使い方と相対パスとしての使い方がある。絶対パスを使うにはパッケージ名、もしくはcrateキーワードを使う。相対パスではselfとsuperを使う。

day 25 @go for

goで繰り返し処理をするにはforを使う。基本的には昔ながらのforで for 初期化; 継続条件; 繰り返し後の処理 { 何かする。 } のように書く。違いは条件などを()で囲まないところくらい。 package main import "fmt" func main() { for i := 0; i < 10; i++ {…

day 25 @rust mod

モジュールはmodキーワードで作成する。 mod A { mod B { // some definitions. } fn Hello() { println!("?Hello¿"); } } 上記のようにモジュールを定義する。 モジュールないに定義できるものは、 · module · struct · enum · constant · function · trait

day 24 @go 便利な数値const

数値をconstで使うとコンテキストによって変わる。もしfloatの引数として使えばfloatにintで使えばintになる。 package main import "fmt" func plus_one(x float64) float64 { return x + 1.0 } func plus_two(x int) int { return x + 1 } const num = 1 <…

day 24 @rust パッケージ

パッケージの作成 Cargo new パッケージ名パッケージには0もしくは1つのライブラリを含めることができる。 パッケージには最低でも1つ以上のバイナリを含めることができる。その場合はsrc/binにどうにかこうにかするらしい。通例としてビルドするときのエン…

day 23 @go type interface

go では変数宣言時に型を代入演算子の右側の式から推論する。 しかし右側の式でリテラルを使って値を生成したときは値が決まっている。var i uint = 3 var j = i これはiがuintとかいてあるのでuintになるがvar j = 3 とするとintになる。 このように3.4とす…

day 23 @rust match

match大体はcaseと同じ基本構文 fn main() { var i = 'c'; match i { 'a' => println!("azasu"), 'b' => println!("baseball"), 'c' => { // {}で複数行の処理もできる。 println!("champion"); println!("victory"); }, _ => (), // _は任意の値という意味…

day 22 @go キャスト

基本構文 Type(value) のように書いてキャストする。 goではキャストする際は明示的に行わなければならない。 func main() { var num int = 3 var num2 uint = uint(num) }