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 özelliğ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 sunar. From özelliğini uyguladığınızda, Into özelliğini otomatik olarak ve ücretsiz bir şekilde elde edersiniz.
From özelliğini 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 fonksiyonunu veya into metodunu kullanarak dönüştürme yapabilirsiniz:
let distance = Kilometers(5.0);
// From'u açıkça kullanarak
let m1 = Meters::from(distance);
// Into kullanarak (From uygulandığı için çalışır)
let distance = Kilometers(3.0);
let m2: Meters = distance.into();
into() yöntemi, Rust'ın hangi türe dönüştürme yaptığınızı bilmesi gerektiğinden bir tür belirteci gerektirir. Bu desen, ana türlerinize dönüştürülmesi gereken yardımcı struct'lara sahip olduğunuzda —yapılandırma verilerini başlatılmış bir nesneye dönüştürmek veya ham girdiyi doğrulanmış bir yapıya dönüştürmek gibi— özellikle kullanışlıdır.
Görev
KolayFrom trait'ini kullanarak bir sıcaklık dönüştürme sistemi oluşturalım! İki sıcaklık türü—Celsius ve Fahrenheit—oluşturacak ve Rust'ın standart dönüştürme trait'lerini kullanarak aralarında dönüşümler gerçekleştireceksiniz.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
temperature.rs: Her ikisi de birf64değerini sarmalayan iki genel (public) newtype struct—CelsiusveFahrenheit—tanımlayın.fahrenheit = celsius × 1.8 + 32.0formülünü kullanarakCelsiusdeğeriniFahrenheitdeğerine dönüştürmek içinFromtrait'ini uygulayın. Ayrıca her struct'a, içindekif64değerini döndüren birvaluemetodu ekleyin.main.rs: Sıcaklık modülünüzü dahil edin ve her iki dönüştürme yaklaşımını da gösterin. Sağlanan girdiden birCelsiusdeğeri oluşturun, ardındanFahrenheit::from()kullanarak bunuFahrenheit'a dönüştürün. Başka birCelsiusdeğeri oluşturun ve bunu.into()metodunu kullanarak dönüştürün. Her iki sonucu da yazdırın.
Celsius'tan Fahrenheit'a dönüşüm formülü şöyledir: 1.8 ile çarpın ve 32 ekleyin. From<Celsius> for Fahrenheit uygulamanın, Celsius üzerinde Into<Fahrenheit> trait'ini size otomatik olarak kazandırdığını unutmayın!
Çıktınız her iki dönüşümü de şu formatta görüntülemelidir:
From: {celsius1}C = {fahrenheit1}F
Into: {celsius2}C = {fahrenheit2}FÖrneğin, 0 ve 100 girdileriyle:
From: 0C = 32F
Into: 100C = 212FVe 25 ile -40 girdileriyle:
From: 25C = 77F
Into: -40C = -40Fİki girdi alacaksınız: ilk Celsius değeri (f64 olarak ayrıştırın) ve ikinci Celsius değeri (f64 olarak ayrıştırın).
Kopya kağıdı
From özelliği, türler arasında dönüşüm yapmak için standartlaştırılmış bir yol sağlar. From özelliğini uyguladığınızda, Into özelliğini de otomatik olarak ücretsiz bir şekilde elde edersiniz.
From özelliğini uygulamak için, kendi türünüzün başka bir türden nasıl oluşturulacağını tanımlayın:
struct Meters(f64);
struct Kilometers(f64);
impl From<Kilometers> for Meters {
fn from(km: Kilometers) -> Self {
Meters(km.0 * 1000.0)
}
}
Dönüşümü from fonksiyonunu veya into metodunu kullanarak yapabilirsiniz:
let distance = Kilometers(5.0);
// Using From explicitly
let m1 = Meters::from(distance);
// Using Into (requires type annotation)
let distance = Kilometers(3.0);
let m2: Meters = distance.into();
into() metodu, Rust'ın hangi türe dönüştürme yaptığınızı bilmesi için bir tür belirtimi (type annotation) gerektirir.
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 değerinden bir Celsius değeri oluşturun
// TODO: Fahrenheit::from() kullanarak bunu Fahrenheit'a dönüştürün
// TODO: celsius2 değerinden başka bir Celsius değeri oluşturun
// TODO: .into() kullanarak bunu Fahrenheit'a dönüştürün
// TODO: Sonuçları şu formatta yazdırın:
// 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 Player