Menu
CoddyTech

From dan Into

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

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

Untuk mengimplementasikan From, kamu menentukan cara membentuk tipemu 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 kita 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 sebuah f64. Terapkan trait From untuk mengonversi Celsius menjadi Fahrenheit menggunakan rumus: fahrenheit = celsius × 1.8 + 32.0. Tambahkan juga method value ke setiap struct untuk mengembalikan nilai di dalamnya, yaitu f64.
  • main.rs: Sertakan module suhu dan tunjukkan kedua cara 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, dengan menerapkan From<Celsius> for Fahrenheit, kamu otomatis mendapatkan trait Into<Fahrenheit> pada Celsius secara gratis!

Kedua suhu dicetak sebagai bilangan bulat: konversikan setiap f64 dengan as i64, yang memotong angka desimal ke arah nol. Jadi, input 36.6 dicetak sebagai 36C, dan suhu 97.88 derajat Fahrenheit hasil konversinya 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