ドットでアクセスする。myStruct.value
定義方法 type MyStruct struct { first_field int second_field *int }
・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…
・ポインター型の表現 アスタリスクの後ろに型をつける。 *Type var intPointer *int ・変数のアドレスの取得方法 &を使う &variable var num = 10 var int_pointer *int = &num ・参照はずしによって中身を扱う *を使う *variable var int_pointer = &num *…
・ジェネリック関数 fn function(val: T) -> T { ~~ } ・ジェネリック構造体 struct MyStruct { val: T, } ・ジェネリック列挙型 enum MyEnum { A(T), } ・ジェネリックメソッド impl MyStruct { ~ }メソッドに関しては重要なのはimplの後にもつけること。
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
・回復可能なエラーはResultを使うResultはenumで OkとErrの2つがある。・?オペレータ Resultを返す関数の後ろにつける。 もし関数が成功すれば中身の値を取り出して返す。 失敗すれば失敗をreturnする。 fn sample() -> Result<String, fs::io::Error> { let s = String::new(); f</string,>…
defer 式 とすることで遅延処理を書くことができる。 a := 1 defer fmt.Println(a + 1) a += 2 // printed 2 上記のように引数に対しての評価はその場でされる。
回復不可能なエラーを発生させるのに使う。 引数はメッセージpanic!("hoge hoge error occure");スタックとレースをするには BACKTRACE=1 cargo run とする。
switchの条件が省略されたときはtrueが適用される。 switch { case a > b: hoge() case a == b : hogehoge() default: hogex3() }
生成方法 1つめ HashMap::new() 2つめ vec1.iter().zip(vec2.iter()).collect();要素の取得 getメソッドを使う。所有権はhashmapに移動する。for (key, value) in hm { ~~ } の形で繰り返しができる。insertで値の上書きが可能。キーがあるなしで操作を変更…
switchは上から下へ条件の吟味をする。
・文字列の作成方法 String::new() String::from("~") ディスプレイを実装しているデータ型ならto_string() ・文字列の連結 .push_str("~") .push('a') +演算子 formatマクロ ・文字列に対してインデックス記法でのアクセスはできない。 ・文字列に対してス…
if v := 1; v < 10 { // vを使える。 } else { // ここでもvを使える。 } vはelseでも使える。
・ベクトル の作り方 1 Vec::new() 2 vec![a, b, c]ベクトルが破棄されるとその要素も破棄される。要素のへのアクセス インデックス記法もしくはgetメソッド要素の追加 pushメソッドv = vec![a, b,c];のとき for i in &v {} とすることでiterate可能複数の型…
goではifの中で変数の初期化ができるif i := 1; i fmt.Println(i) } ことのきiのスコープはif中のステートメントのみ。
・ファイルの分割 // 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…
c系の言語と同じ。ただ条件を()で囲む必要はない。 if condition { }
use を使ってインポートする。慣習として関数に関しては親モジュールをインポートして使い。 構造体、列挙型に関してはフルパスで指定する.参照名のエイリアスにはasを使う。 use A::B as C;pub useの組み合わせでインポートしたものをそのモジュールの一部…
go ではループにもforを使う package main import "fmt" func main() { cnt := 0 for { cnt += 1 fmt.Println(cnt) if cnt == 10 { break } } }
pub 対象の物をパブリックなものにする。 構造体、モジュール、関数、列挙型とうに使える。pub mod { ~~ }super モジュールの使用時に指定するパスにおいてファイルシステムの".."と同じ役割をする。構造体のアクセス権 フィールドごと、メソッドごとに指定…
forでは初期化部分と継続条件部分と事後処理部分があるが実際には継続条件さえあれば良い package main import "fmt" func main() { cnt := 0 for ; cnt < 100; ; { cnt += 10 } fmt.Println(cnt) }
モジュールの読み込みのパスには絶対パスとしての使い方と相対パスとしての使い方がある。絶対パスを使うにはパッケージ名、もしくはcrateキーワードを使う。相対パスではselfとsuperを使う。
goで繰り返し処理をするにはforを使う。基本的には昔ながらのforで for 初期化; 継続条件; 繰り返し後の処理 { 何かする。 } のように書く。違いは条件などを()で囲まないところくらい。 package main import "fmt" func main() { for i := 0; i < 10; i++ {…
モジュールはmodキーワードで作成する。 mod A { mod B { // some definitions. } fn Hello() { println!("?Hello¿"); } } 上記のようにモジュールを定義する。 モジュールないに定義できるものは、 · module · struct · enum · constant · function · trait
数値を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 <…
パッケージの作成 Cargo new パッケージ名パッケージには0もしくは1つのライブラリを含めることができる。 パッケージには最低でも1つ以上のバイナリを含めることができる。その場合はsrc/binにどうにかこうにかするらしい。通例としてビルドするときのエン…
go では変数宣言時に型を代入演算子の右側の式から推論する。 しかし右側の式でリテラルを使って値を生成したときは値が決まっている。var i uint = 3 var j = i これはiがuintとかいてあるのでuintになるがvar j = 3 とするとintになる。 このように3.4とす…
match大体はcaseと同じ基本構文 fn main() { var i = 'c'; match i { 'a' => println!("azasu"), 'b' => println!("baseball"), 'c' => { // {}で複数行の処理もできる。 println!("champion"); println!("victory"); }, _ => (), // _は任意の値という意味…
基本構文 Type(value) のように書いてキャストする。 goではキャストする際は明示的に行わなければならない。 func main() { var num int = 3 var num2 uint = uint(num) }