From ve Into
Coddy'nin Rust Journey'sinin Nesne Yönelimli Programlama 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 sağlar. From özelliğini uyguladığınızda, Into özelliğini otomatik olarak ve ücretsiz şekilde 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() yöntemi, Rust'un hangi türe dönüştürme yaptığınızı bilmesi gerektiğinden bir tür belirtimi gerektirir. Bu kalıp, 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, ana türlerinize dönüştürülmesi gereken yardımcı yapı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 gerçekleştireceksin.
Kodunu iki dosyaya ayıracaksın:
temperature.rs: Her ikisi de birCelsiussaran,Fahrenheitvef64adında iki genel newtype struct tanımla.Fromdeğerini şu formülü kullanarakCelsiusdeğerine dönüştürmek içinFahrenheittrait'ini uygula:fahrenheit = celsius × 1.8 + 32.0. Ayrıca her struct'a, içindekivaluedeğerini döndüren birf64yöntemi ekle.main.rs: Sıcaklık modülünü içe aktar ve her iki dönüşüm yaklaşımını göster. Verilen girdiden birCelsiusdeğeri oluştur, ardından bunuFahrenheitkullanarakFahrenheit::from()değerine dönüştür. Başka birCelsiusdeğeri oluştur ve bunu.into()yöntemiyle dönüştür. Her iki sonucu da yazdır.
Celsius'dan Fahrenheit'a dönüşüm formülü şöyledir: 1.8 ile çarp ve 32 ekle. From<Celsius> for Fahrenheit uygulamanın, Into<Fahrenheit> üzerinde Celsius trait'ini otomatik olarak ve ücretsiz şekilde sağladığını unutma!
Her iki sıcaklık da tam sayı olarak yazdırılır: her f64 değerini as i64 ile dönüştür; bu işlem ondalık kısmı sıfıra doğru keser. Bu nedenle 36.6 girdisi 36C olarak yazdırılır ve dönüştüğü 97.88 derece Fahrenheit değeri 97F olarak yazdırılır. Yukarı yuvarlama yapılmaz.
Çıktın her iki dönüşümü de şu biçimde göstermelidir:
From: {celsius1}C = {fahrenheit1}F
Into: {celsius2}C = {fahrenheit2}FÖrneğin, 0 ve 100 girdileriyle:
From: 0C = 32F
Into: 100C = 212F25 ve -40 girdileriyle:
From: 25C = 77F
Into: -40C = -40Fİki girdi alacaksın: ilk Celsius değerini (f64 olarak ayrıştır) ve ikinci Celsius değerini (f64 olarak ayrıştır).
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.
Nesne Yönelimli Programlama 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