From ve Into
Coddy'nin Rust Journey'sinin Object Oriented Programming bölümünün bir parçası. Ders 57 / 61.
Türler arasında dönüşüm yapmak Rust'ta yaygın bir görevdir. From trait'i, bir türün başka bir türden nasıl oluşturulabileceğini tanımlamak için standartlaştırılmış bir yol sağlar. From'u uyguladığınızda, Into trait'ini automatically free olarak elde edersiniz.
From uygulamak için türünüzü başka bir türden nasıl oluşturacağınızı tanımlarsınız:
struct Meters(f64);
struct Kilometers(f64);
impl From<Kilometers> for Meters {
fn from(km: Kilometers) -> Self {
Meters(km.0 * 1000.0)
}
}
Artık from işlevini veya into yöntemini kullanarak dönüştürme yapabilirsiniz:
let distance = Kilometers(5.0);
// From'u açıkça kullanma
let m1 = Meters::from(distance);
// Into kullanma (From uygulandığı için çalışır)
let distance = Kilometers(3.0);
let m2: Meters = distance.into();
into() method bir tür annotation gerektirir; çünkü Rust hangi türe dönüştürdüğünü bilmelidir. Bu pattern, yapılandırma verilerini başlatılmış bir nesneye dönüştürmek veya ham input'u doğrulanmış bir yapıya dönüştürmek gibi, ana türlerinize dönüştürülmesi gereken yardımcı struct'lara sahip olduğunuzda özellikle kullanışlıdır.
Görev
KolayFrom trait'ini kullanarak bir sıcaklık dönüşüm sistemi oluşturalım! İki sıcaklık türü, Celsius ve Fahrenheit, oluşturacak ve Rust'ın standart dönüşüm trait'lerini kullanarak bunlar arasında dönüşümler implement edeceksin.
Kodunu iki dosya arasında organize edeceksin:
temperature.rs: Her ikisi de birf64saran iki public newtype struct,CelsiusveFahrenheit, Define et.Celsius'uFahrenheit'a dönüştürmek içinFromtrait'ini, şu formula'yı kullanarak implement et:fahrenheit = celsius × 1.8 + 32.0. Ayrıca her struct'a, innerf64'ü returns eden birvaluemethod'u ekle.main.rs: temperature module'ünü dahil et ve her iki dönüşüm yaklaşımını göster. Sağlanan input'tan birCelsiusdeğeri Create et, ardındanFahrenheit::from()kullanarak bunuFahrenheit'a dönüştür. Başka birCelsiusdeğeri Create et ve.into()method'unu kullanarak dönüştür. Her iki sonucu Print et.
Celsius'tan Fahrenheit'a dönüşüm formula'sı şöyledir: 1.8 ile çarp ve 32 ekle. From<Celsius> for Fahrenheit implement etmenin, Celsius üzerinde Into<Fahrenheit> trait'ini otomatik olarak free şekilde verdiğini Remember!
Her iki sıcaklık da tam sayılar olarak Print edilir: her f64 değerini as i64 ile cast et; bu, ondalık kısmı sıfıra doğru keser. Bu nedenle 36.6 input'u 36C olarak Print edilir ve dönüştüğü 97.88 Fahrenheit derecesi 97F olarak Print edilir. Hiçbir değer yukarı yuvarlanmaz.
Çıktın her iki dönüşümü şu format'ta göstermelidir:
From: {celsius1}C = {fahrenheit1}F
Into: {celsius2}C = {fahrenheit2}FÖrneğin, input'lar 0 ve 100 olduğunda:
From: 0C = 32F
Into: 100C = 212FVe input'lar 25 ve -40 olduğunda:
From: 25C = 77F
Into: -40C = -40Fİki input alacaksın: ilk Celsius değeri (f64 olarak parse et) ve ikinci Celsius değeri (f64 olarak parse et).
Kendin dene
mod temperature;
use temperature::{Celsius, Fahrenheit};
fn main() {
// Girdiyi oku
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: celsius1'den bir Celsius değeri oluştur
// TODO: Fahrenheit::from() kullanarak Fahrenheit'e dönüştür
// TODO: celsius2'den başka bir Celsius değeri oluştur
// TODO: .into() kullanarak Fahrenheit'e dönüştür
// TODO: Sonuçları şu formatta yazdır:
// From: {celsius1}C = {fahrenheit1}F
// Into: {celsius2}C = {fahrenheit2}F
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Object Oriented Programming bölümündeki tüm dersler
1Metotlar ve Davranış
Uygulama Bloklarına GirişSelf ParametresiDeğiştirilebilir Metotlarİlişkili FonksiyonlarBirden Fazla Uygulama BloğuMetot ZincirlemeÖzet - Dikdörtgen Eylemleri4Proje: Sanal Evcil Hayvan
Evcil Hayvanı TanımlamaEvcil Hayvanı Besleme2Kapsülleme ve Modüller
Modül TemelleriPublic Anahtar KelimesiPrivate AlanlarGetter'larSetter'larÖzet - Güvenli Kasa5Generic Yapılar
Generic Struct'larGeneric MetotlarÇoklu Generic TürlerGeneric FonksiyonlarÖzet - Koordinat Noktası8Sınırlandırıcı Olarak Trait'ler
Trait Sınırlandırıcı SözdizimiÇoklu SınırlandırıcılarWhere CümleciğiTrait'ler ile Tip DöndürmeÖzet - Generic Yazıcı11Rust'ta Tasarım Kalıpları
Newtype KalıbıKompozisyonDrop Trait'iFrom ve IntoÖzet - Smart Pointer Mock3İleri Seviye Enum'lar
Veri İçeren Enum'larEnum MetotlarıVeri Varyantlarını EşlemeOption Enum'ına Yeniden BakışÖzet - Shape Enum6Trait Tanımlama
Trait Nedir?Traitleri UygulamaVarsayılan UygulamalarVarsayılanları Geçersiz KılmaParametreli TraitlerÖzet - Media PlayerKendi başına pratik yap: Online Rust derleyicisi