Menu
CoddyTech

From dan Into

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Rust di Coddy. Pelajaran 57 dari 61.

Mengonversi antar tipe adalah tugas umum di Rust. Trait From menyediakan cara standar untuk menentukan bagaimana suatu tipe dapat dibuat dari tipe lain. Saat kamu mengimplementasikan From, kamu otomatis mendapatkan trait Into secara gratis.

Untuk mengimplementasikan From, kamu menentukan cara membuat tipe milikmu dari tipe lain:

struct Meters(f64);
struct Kilometers(f64);

impl From<Kilometers> for Meters {
    fn from(km: Kilometers) -> Self {
        Meters(km.0 * 1000.0)
    }
}

Sekarang kamu bisa melakukan konversi menggunakan fungsi from atau method into:

let distance = Kilometers(5.0);

// Menggunakan From secara eksplisit
let m1 = Meters::from(distance);

// Menggunakan Into (berfungsi karena From sudah diimplementasikan)
let distance = Kilometers(3.0);
let m2: Meters = distance.into();

method into() memerlukan anotasi tipe karena Rust perlu mengetahui tipe tujuan konversimu. Pola ini sangat berguna saat kamu memiliki struct pembantu yang perlu dikonversi menjadi tipe utamamu, seperti mengonversi data konfigurasi menjadi object yang telah diinisialisasi, atau mengubah input mentah menjadi struktur yang telah divalidasi.

challenge icon

Tantangan

Mudah

Mari bangun sistem konversi suhu menggunakan trait From! Kamu akan membuat dua tipe suhu, Celsius dan Fahrenheit, lalu menerapkan konversi di antara keduanya menggunakan trait konversi standar Rust.

Kamu akan mengatur kodemu dalam dua file:

  • temperature.rs: Definisikan dua struct newtype publik, Celsius dan Fahrenheit, yang masing-masing membungkus f64. Terapkan trait From untuk mengonversi Celsius menjadi Fahrenheit menggunakan rumus: fahrenheit = celsius × 1.8 + 32.0. Tambahkan juga method value ke setiap struct yang mengembalikan nilai f64 di dalamnya.
  • main.rs: Gunakan module suhu dan tunjukkan kedua pendekatan konversi. Buat nilai Celsius dari input yang diberikan, lalu konversikan menjadi Fahrenheit menggunakan Fahrenheit::from(). Buat nilai Celsius lainnya dan konversikan menggunakan method .into(). Cetak kedua hasilnya.

Rumus konversi dari Celsius ke Fahrenheit adalah: kalikan dengan 1.8 lalu tambahkan 32. Ingat, menerapkan From<Celsius> for Fahrenheit otomatis memberikan trait Into<Fahrenheit> pada Celsius secara gratis!

Kedua suhu dicetak sebagai bilangan bulat: lakukan cast pada setiap f64 dengan as i64, yang memotong angka desimal ke arah nol. Jadi, input 36.6 dicetak sebagai 36C, dan suhu Fahrenheit 97.88 yang dihasilkan dicetak sebagai 97F. Tidak ada angka yang dibulatkan ke atas.

Output-mu harus menampilkan kedua konversi dalam format ini:

From: {celsius1}C = {fahrenheit1}F
Into: {celsius2}C = {fahrenheit2}F

Contohnya, dengan input 0 dan 100:

From: 0C = 32F
Into: 100C = 212F

Dan dengan input 25 dan -40:

From: 25C = 77F
Into: -40C = -40F

Kamu akan menerima dua input: nilai Celsius pertama (parse sebagai f64) dan nilai Celsius kedua (parse sebagai f64).

Coba sendiri

mod temperature;

use temperature::{Celsius, Fahrenheit};

fn main() {
    // Baca input
    let mut input1 = String::new();
    std::io::stdin().read_line(&mut input1).expect("Failed to read line");
    let celsius1: f64 = input1.trim().parse().expect("Invalid number");
    
    let mut input2 = String::new();
    std::io::stdin().read_line(&mut input2).expect("Failed to read line");
    let celsius2: f64 = input2.trim().parse().expect("Invalid number");
    
    // TODO: Buat nilai Celsius dari celsius1
    // TODO: Konversikan ke Fahrenheit menggunakan Fahrenheit::from()
    
    // TODO: Buat nilai Celsius lain dari celsius2
    // TODO: Konversikan ke Fahrenheit menggunakan .into()
    
    // TODO: Cetak hasilnya dalam format:
    // From: {celsius1}C = {fahrenheit1}F
    // Into: {celsius2}C = {fahrenheit2}F
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Rust online