IT技術に関する情報掲載サイト

プログラミングに関することを掲載します。

Rustの関数

次は、関数です。

 

 

命名規則

まずは、関数の命名規則ですが、スネークケースを使っており、全文字を小文字にし、単語区切りは、アンダースコアを使います。

引数

サンプルを見るのが一番なので、以下となります。

fn main() {
another_function(5);
}

fn another_function(x: i32) {
println!("The value of x is: {}", x); // xの値は{}です
}

 注意するところとしては、仮引数(関数を定義する側の引数)は、型を宣言しなければなりません。

文と式

こういう考え方があるのは知らんかったです。

  • 文とは、なんらかの動作をして値を返さない命令です。
  • 式は結果値に評価されます。ちょっと例を眺めてみましょう。

戻り値のある関数

この考え方もめすらしいのでは。

関数は、それを呼び出したコードに値を返すことができます。→のあとに型を書いて宣言します。関数の戻り値ですが、returnを使わずに関数本体のブロックの最後の式の値で戻り値を指定することもできます。

fn five() -> i32 {
 5
}

fn main() {
 let x = five();

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

また、こんな例もあります。

・うまくいく場合

fn main() {
 let x = plus_one(5);

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

fn plus_one(x: i32) -> i32 {
 x + 1
}

 

・だめな場合

fn main() {
 let x = plus_one(5);

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

fn plus_one(x: i32) -> i32 {
 x + 1;
}

 違うところがどこかというと、関数の中のx+1のセミコロンがあるかないかです。なぜ、セミコロンがある場合がエラーとなるかというとセミコロンがあると文になってしまい、戻り値を返さず、関数の→でi32と型を宣言しているのに、型がちがうとエラーがでます。

Rustの関数の戻り値は、なかなか癖があって覚えにくいかもしれません

Rustのデータ型

 

まず、基本のデータ型と関数について勉強した。

データ型

Rustの特徴としては、変数に対するデータを型をきっちり決めないといけない静的型付き言語だからです。

どんな型があるかというと大きく分けて

スカラー

スカラー型は、単独の値を表します。Rustには、4つのスカラー型があります。整数、浮動小数点数、論理値、文字です。注意することとしては、文字で、なダブルクォーテーションマークを使用する文字列に対して、シングルクォートで指定されることに注意してください

fn main() {
 let c = 'z';
 let z = 'ℤ';
 let heart_eyed_cat = '😻'; //ハート目の猫
}

 複合型

複合型は、複数の値を一つの形にまとめることができます。種類は、2つあって、ダブル型と配列型があります。

ダブル型

複数の型の何らかの値を一つの複合型にまとめ上げる一般的な手段です。それぞれ型がちがう変数を格納できます。

fn main() {
let tup: (i32, f64, u8) = (500, 6.4, 1);
}

※型注釈は、指定しなくてもいいです。

取り出し方は、各変数ごとにわけて取り出す場合は、

fn main() {
let tup = (500, 6.4, 1);

let (x, y, z) = tup;

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

 

となり、一つずつ指定する場合は、

fn main() {
let x: (i32, f64, u8) = (500, 6.4, 1);

let five_hundred = x.0;

let six_point_four = x.1;

let one = x.2;
}

 となります。

配列

複数の値のコレクションを得ることができます。タプルと違うところは、配列の全要素は、 同じ型でなければなりません。Rustの配列は、固定長なので、一度宣言してしまったら、サイズを変更することができません。ダブルとの使い分けは月などの追加したり削除したりすることがない場合に配列を使用するのがいいかもしれません。

要素の取り出し方としては、

fn main() {
 let a = [1, 2, 3, 4, 5];

 let first = a[0];
 let second = a[1];
}

 となります。ただし、PHPとは違くて、キーに変数を置くことはできないようです。

だめな例:

fn main() {
let a = [1, 2, 3, 4, 5];
let index = 10;

let element = a[index];

println!("The value of element is: {}", element); // 要素の値は{}です
}

 ちょっと不便ですが、添え字が配列長よりも大きいので、エラーとなるよう

 

Rustの変数と可変性について

Rustの特徴として、変数は、標準で不変になっており、以下のようコードの場合は、エラーとなります。

 

fn main() {
 let x = 5;
 println!("The value of x is: {}", x); // xの値は{}です
 x = 6;
 println!("The value of x is: {}", x);
}

変数が不変であるということは、値が名前に束縛され、その値を変えることができません。

ただ、だからといって絶対不変でなければいけないというわけでもなく、mutってというものを使うと、可変にできます。

let mut x = 5;

 

でも、変数と定数の違いはなんだろうとプログラミングをやっている人だったら、疑問に思うかもしれません。一番の違いは、定数は、プログラムが走る期間、定義されたスコープ内でずっと有効です。従いまして、プログラミングでいろいろと使用される可能性がある値は、変数より、定数に定義したほうが、あとあと、メンテンスする際に楽になるかと思います。

 

もう一つ、Rustの変数の扱いで面白い機能が「シャドーイング」という機能があります。これは、簡単にいうと前に定義した変数と同じ名前の変数を新しく宣言でき、新しい変数は、前の変数を覆い隠すことができます。例えば、こんなコードになります。

 

fn main() {
 let x = 5;

 let x = x + 1;

 let x = x * 2;

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

このコードをみるとわかりますように変数の前に、letをつけてあげれば、覆い隠すことができます。mutと同じ機能のように感じてしまうかもしれませんが、違いは、まず、一時的に変数を可変にしたいときは、letを使うといいです。もう一つの違いは、再度letキーワードを使用したら、実効的には新しい変数を生成していることになるので、 値の型を変えつつ、同じ変数名を使いまわせることです。mutを使うとデータ型がstrかnumかなど気にする必要があるケースがあります。

 

 変数と可変性については、Rustの基本のところなので、しっかり理解するといいかもしれません。

 

doc.rust-jp.rs

 

Rustのプロジェクト管理ツール Cargo

はじめに

Rustには、プロジェクト管理ツールとして、Cargoが最初から備わってます。Cargoは、Rustのビルドシステムの機能もあります。

つかい方としては、まず、Cargoがインストールされているか確認するのは、以下です。

$cargo -version

で、Cargoのバージョンが表示されます。なにも表示されなかったり、エラーが出たら、Cargoがなにかしらの理由でインストールされていないようです。

 

Cargoでプロジェクトの作成

まず、プロジェクトをつくってみましょう。プロジェクトをつくるフォルダに移動して、

$ cargo new hello_cargo

と実行するおプロジェクトフォルダができるので
$ cd hello_cargo

に移動しましょう

Cargoプロジェクトをビルドし、実行する

まずは、ビルドをしてみます。

$ cargo build
Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 2.85 secs

実行するのは、簡単で、

$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
Running `target/debug/hello_cargo`
Hello, world!

とすればできます。

もし、ビルドはせず、チェックだけ実行させたいのでしたら、

$ cargo check
Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 0.32 secs

このcargo checkは、長いプログラミングをする際に途中で問題なくビルドできるか確認するためにも使っているようです。

また、本番用にファイルをつくるのには、

$ cargo build --release

と実行するとtarget/buildに実行可能ファイルが作成されます。

 

Cargoに関する詳細は、

doc.rust-lang.org

にのってます。

 

 

Rustをはじめてみました

AWSがRustを使える人を採用し始めましたというニュースをみて、とりあえず、Rustをはじめてみました。

Rustは、日本語の公式サイトがあり、とりあえずは、そこをみてみることにしてみた。

<Rust公式サイト>

www.rust-lang.org

色々便利だということを書いているけど、プログラマだったら、まずは、インストールをしてみることにした。

インストールの仕方は、

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

で完了。インストール中に、質問を聞かれるけど、デフォルトにすればOKです。

 

次に、公式ドキュメントがあるようなので、そこで、やり方は学ぼうかとみてみると、ここは英語だった。

doc.rust-lang.org

 

 日本語版も見つけました

doc.rust-jp.rs

でもとりあえず、言語を最初に学ぶときに必ず、やる”Hello,world”をやってみた。

 

ファイルをつくる

1は、ファイル名をmain.rsとして、

fn main() {
println!("Hello, world!");
}

と記述

コンパイル

以下のコマンドを実行して、コンパイル

$ rustc main.rs

 実行

あとは、同じところにmainというファイルができているので、それを実行するだけ。

$ ./main
Hello, world!

 Hello,world!って出力されたら、完了です。

 

とってもかんたんです。

メール送受信する際に、認証エラーになる

あるタイミングで、メール送受信ができなくなって調べてみた。

postfixやCourier POP3の再起動をしてみたが、なかなかうまくいかない。

 

maillogログをみてみると

courier-pop3d: authdaemon: s_connect() failed: Connection refused
courier-pop3d: [Hint: perhaps authdaemond is not running?]

とでている

調べてみると、authdaemondが動いていないからみたいだ。

どうやって、authdaemondを起動させればいいのか、わからないので、しらべたところ、/etc/init.d/courier-authdaemonを再起動させたら、うまくいった

 

どうもサーバに負荷があったときがあり、その時に、異常終了したかもしれません。

 

シェルの正規表現を使って複数行を削除する方法

シェルのsed関数を使って、複数行を削除する方法は、以下です。

 

sed -r "/削除したい行のはじめ/,/削除したい行の最後/d"

 

例えば、

 

はじめまして

こんにちはよろしくお願いいたします

今日もいい天気ですね

 

という文章があって、こんにちはからいたしますまでを削除したい場合は、

sed -r "/こんにちは/,/いたします/d"

となります。

-r は拡張正規表現をつかうということになります。