Soru Rust'un birden çok değeri döndüren işlevler için desteği var mı?


Rust, Go gibi birden çok değeri döndüren işlevler için yerel desteğe sahip mi?

func addsub(x, y int) (int, int) {
    return x + y, x - y
}

Simüle etmek için bir tuple kullanabiliriz. Rosetta Kodu Farklı dillerde çoklu değerlerin nasıl döndürüleceğini anlatıyor, ama Rust'u görmedim.


25
2017-08-28 04:47


Menşei




Cevaplar:


Bu benim için çalışıyor:

fn addsub(x: isize, y: isize) -> (isize, isize) {
    return (x + y, x - y);
}

Temelde Go ile aynıdır, ancak parantez gereklidir.


31
2017-08-29 17:09



En iyi çözüm, daha önce denemedim. Görünüşe göre benzetmek için tuple kullanmak zorundaydık. Teşekkürler! - sunny2016
Parantezler Go'da da gereklidir. ;) - weberc2
Hayır değiller. (Hakkında konuşuyordu. return Beyan.) - Timmmm


Rust'ta bir tuple birden fazla değerle dönebilirsiniz:

fn my_func() -> (u8, bool) {
    (1, true)
}

Bir değerden daha fazla geri dönen bir dil, büyük bir olasılıkla, çoğu çağrı kurallarında olduğu gibi bir tek veri veya bir başka veri yapısı ile öykünerek, geri dönüş değeri yalnızca bir kayıttadır.

Go hakkında bir şey söyleyemem, ancak bir tuple içinde birden fazla değeri taklit etmenin ve iadeyi yönetmek için sizi zorlayan derleme zamanının yüksek olasılıkları vardır.

Bunu yaparken pasla ilgili herhangi bir sorun görmüyorum çünkü OCaml ya da Haskell (ve diğerleri) bunu nasıl yönetiyorlar ve geri dönüş değerlerinde (ya da tuple) tip kontrolünü zorluyorlar. Dönüş değerlerini yönetmenin en yaygın yolu, iki veya daha fazla bağlamada tuple parçalarının ayrıştırılmasıdır (let (a, b) = tuple_2();).

Sadece iki sentim, beni düzeltmek için çekinmeyin.


17
2017-08-28 06:07



Sadece bir hassasiyet: Go bir tupple kullanmıyor, ancak çoklu yazmaçları kullanıyor. Görmek stackoverflow.com/questions/18622706/... - Denys Séguret
1.2.0'dan itibaren, sözdizimi let (a, b) = tuple_2(); - Amol


Rust'ta kullanmak zorunda değilsiniz. dönüş anahtar kelime:

fn addsub(x: isize, y:isize) -> (isize, isize) {
    (x + y, x - y) // use tuple to simulate it
}

5
2017-10-25 15:20



Soruyu cevaplamıyor (çözümün önemli kısmı parantezi içermelidir), ama insanlara Rust'un örtülü geri dönüşü olan ifadeye dayalı bir dil olduğunu hatırlamaya / hatırlatmaya değer. - zstewart


Aşağıda, dönüş değişkenlerini ayrı değişkenlere nasıl kolayca atayabileceğinizi gösteren bir örnek verilmiştir.

fn addsub(x: isize, y: isize) -> (isize, isize) {
    (x + y, x - y) // use tuple to simulate it
}

let (a, b) = addsub(1, 2);

0
2017-07-11 05:48