Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

From 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 bir f64 değerini sarmalayan iki genel (public) newtype struct—Celsius ve Fahrenheit—tanımlayın. fahrenheit = celsius × 1.8 + 32.0 formülünü kullanarak Celsius değerini Fahrenheit değerine dönüştürmek için From trait'ini uygulayın. Ayrıca her struct'a, içindeki f64 değerini döndüren bir value metodu 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 bir Celsius değeri oluşturun, ardından Fahrenheit::from() kullanarak bunu Fahrenheit'a dönüştürün. Başka bir Celsius değ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 = 212F

Ve 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
}
quiz iconKendini test et

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