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.
Tantangan
MudahMari 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,CelsiusdanFahrenheit, yang masing-masing membungkusf64. Terapkan traitFromuntuk mengonversiCelsiusmenjadiFahrenheitmenggunakan rumus:fahrenheit = celsius × 1.8 + 32.0. Tambahkan juga methodvalueke setiap struct yang mengembalikan nilaif64di dalamnya.main.rs: Gunakan module suhu dan tunjukkan kedua pendekatan konversi. Buat nilaiCelsiusdari input yang diberikan, lalu konversikan menjadiFahrenheitmenggunakanFahrenheit::from(). Buat nilaiCelsiuslainnya 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}FContohnya, dengan input 0 dan 100:
From: 0C = 32F
Into: 100C = 212FDan dengan input 25 dan -40:
From: 25C = 77F
Into: -40C = -40FKamu 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
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Method dan Perilaku
Pengantar Blok ImplementasiParameter SelfMethod MutableFungsi TerkaitBeberapa Blok ImplementasiMethod BerantaiRangkuman: Aksi Persegi Panjang4Proyek: Hewan Peliharaan Virtual
Mendefinisikan Hewan PeliharaanMemberi Makan Hewan Peliharaan2Enkapsulasi dan module
Dasar-Dasar moduleKata Kunci publicField privateGetterSetterRekap: Loker AmanLatihan sendiri: Compiler Rust online