[Chapter 5-2]Rust構造例プログラム



長方形の幅を計算するプログラムを作成しましょう.
長方形の幅を計算するには、Cargoで表される長方形の長さと幅を入力します. rectangles という名前の新しいバイナリプロジェクトを作成します.cargo new rectangles --binfilename: src/main.rs
fn main() {
    let length1 = 50;
    let width1 = 30;

    println!(
        "The area of the rectangle is {} square pixels.",
        area(length1, width1)
    );
}

fn area(length: u32, width: u32) -> u32 {
    length * width
}
cargo runを使用すると、次の結果が得られます.
The area of the rectangle is 1500 square pixels.

調整による調整


上記のコードをよりよく変更できます.area関数の2つのパラメータは関連しているが、コード内の任意の位置では表現されていない.この点を明確にするには、ブラウスを使用します.
fn main() {
    let rect1 = (50, 30);

    println!(
        "The area of the rectangle is {} square pixels.",
        area(rect1)
    );
}

fn area(dimensions: (u32, u32)) -> u32 {
    dimensions.0 * dimensions.1
}
一方、図例には要素の名前がないため、あまり明確ではない場合があります.図例の値にインデックスとしてアクセスする必要があるため、計算が混乱する可能性があります.面積を求めるのではなく、画面に長方形を描くと、問題が発生します.

構造体を使用した階層化:意味の追加[こうぞうたいをしよう:いみのついか]


構造体を使用して、データの名前を付け、意味を与えることができます.
struct Rectangle {
    length: u32,
    width: u32,
}

fn main() {
    let rect1 = Rectangle { length: 50, width: 30 };

    println!(
        "The area of the rectangle is {} square pixels.",
        area(&rect1)
    );
}

fn area(rectangle: &Rectangle) -> u32 {
    rectangle.length * rectangle.width
}
パラメータを持つように、area関数を変更しました.これは、Rectangle構造体インスタンスの不変参照者タイプである.構造体の所有権を取得するのではなく、借用する必要があるため、関数呼び出し時に&mainの所有権を維持し、rect1の使用を継続します.

派生traitによる有用な機能の追加

struct Rectangle {
    length: u32,
    width: u32,
}

fn main() {
    let rect1 = Rectangle { length: 50, width: 30 };

    println!("rect1 is {}", rect1);
以上のコードは、Rectangleのインスタンスを出力しようとするコードである.コードを実行すると、エラーには次のメッセージが表示されます.
error[E0277]: the trait bound `Rectangle: std::fmt::Display` is not satisfied
構造体を使用する場合:  println!  これは、この出力をフォーマットする方法が明確ではないためです.ユーザーがカンマや括弧などを使うかどうかは不明です.Rustはあなたのニーズを推測したくない.
次のヘルプは、エラーメッセージから入手できます.
note: `Rectangle` cannot be formatted with the default formatter; try using
`:?` instead if you are using a format string
に適用  println!  呼び出しマクロ  println!("rect1 is {:?}", rect1);  という形で使いましょう.  { }  私.  : ?  次のことを意味します.  println!  Debugという出力フォーマットを使用したいことをお伝えします.
ただし、変更したコードを実行してもエラーが発生します.
error: the trait bound `Rectangle: std::fmt::Debug` is not satisfied

note: `Rectangle` cannot be formatted using `:?`; if it is defined in your
crate, add `#[derive(Debug)]` or manually implement it
構造体の機能をアクティブにするには、事前に明確に同意しなければならない.#[derive(Debug)]構文は、構造体定義の前に追加されます.
#[derive(Debug)]
struct Rectangle {
    length: u32,
    width: u32,
}

fn main() {
    let rect1 = Rectangle { length: 50, width: 30 };

    println!("rect1 is {:?}", rect1);
}
rect1 is Rectangle { length: 50, width: 30 }
println!スターリング内では{ : ? }ではなく{ : # ? }を使用することができる.出力は次のとおりです.
rect1 is Rectangle {
    length: 50,
    width: 30
}