LINUX.ORG.RU

Не знаю rust, но мнение имею.

Так, как написано, только через match поди. Что-нибудь типа: match res { X(field) => field }

Но вообще, в языках с алгебраическими типами структурные обёртки обычно делают с именованными полями, чтобы не надо было каждый раз матчить.

nezamudich ★★
()

Как-то так.

fn main() {
    let res = match f(true) {
        Ok(s) => {
            let X(answer) = s;
            answer
        }
        Err(_) => return,
    };
    println!("{}", res);
}

struct X(String);
fn f(b : bool ) -> Result<X, ()> {
    match b {
        true => Ok(X("ok res".to_string())), 
        false => Err(())
    }   
}

Weres ★★★
()

Ну, например, с помощью метода `map`:

#[derive(Debug)]
struct X(String);

fn f(b: bool) -> Result<X, ()> {
    match b {
        true => Ok(X("ok res".to_string())), 
        false => Err(())
    }   
}   

fn main() {
    let res = f(true);
    println!("{:?}", res.map(|X(x)| x)); //=> Ok("ok res")
}

quantum-troll ★★★★★
()
Последнее исправление: quantum-troll (всего исправлений: 1)

struct X(String);

fn f(b : bool ) -> Result<X> {
      ...   
}   

if let X(res) = f(true) {
    println!("{:?}", res);
}
MyTrooName ★★★★★
()

Всем огромное - Спасибо. )

Разобрался.

Может ещё кто подскажет что значит:

error: cannot move out of borrowed content

?

Спасибо.

denisE
() автор топика
Ответ на: комментарий от unt1tled

здесь, дети, мы видим половину интерпретатора лиспа

И что тут от лиспа вообще?

DarkEld3r ★★★★★
()

сначала подумал: «что за говно, вообще?», потом прочитал тэг и сразу стало не интересно

anonymous
()
Ответ на: комментарий от nezamudich

При чём тут конструкторы? Какие вообще конструкторы? В Rust их нет. Тем более что речь вообще не о структурах, а о tuple struct.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от intelfx

При чём тут конструкторы? Какие вообще конструкторы? В Rust их нет.

Конструкторы данных. Залез и посмотрел специально доку, есть они: https://doc.rust-lang.org/stable/reference.html#enumerations

Тем более что речь вообще не о структурах, а о tuple struct.

Странный ты какой-то. Как может не идти речь о структурах, когда tuple struct — это такой вид структуры такой? https://doc.rust-lang.org/stable/reference.html#structures

Впрочем, лучше не отвечай.

nezamudich ★★
()
Ответ на: комментарий от mix_mix

Понял, да. Где-нибудь сказано, зачем вообще существуют отдельно struct и enum? struct же по сути частный случай enum всего-лишь. Его можно было бы сделать включающейся/выключающейся оптимизацией в компиляторе, а не отдельную синтаксическую конструкцию городить.

nezamudich ★★
()
Ответ на: комментарий от nezamudich

Конструкторы данных. Залез и посмотрел специально доку, есть они: https://doc.rust-lang.org/stable/reference.html#enumerations

Это не конструктор в привычном (плюсовом) смысле... я вообще не понимаю, что они называют словом «constructor» — неужели конкретный элемент enum'а?

В любом случае, к единичным tuple struct оно не относится...

Как может не идти речь о структурах, когда tuple struct — это такой вид структуры такой?

A tuple structure is a nominal tuple type

tuple struct — это разновидность tuple, а не разновидность struct...

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от nezamudich

Согласно доке enum — это и то, и другое:

Кстати, (сейчас) сущности внутри enum считаются «значениями», а не типами. То есть написать для них методы или реализовать трейты нельзя.

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

Речь про Dog/Cat из примера выше? Ну это правильно, вообще говоря. Альтернативным объявлением для struct X(String) должно быть тогда что-нибудь такое:

enum X {
    X (String)
}

nezamudich ★★
()
Ответ на: комментарий от nezamudich

Ну это правильно, вообще говоря.

Почему?

Альтернативным объявлением для struct X(String) должно быть тогда что-нибудь такое:

И что это даст? Просто сэкономим одно ключевое слово? По моему, проще не станет, да и несколько менее красиво получается.

DarkEld3r ★★★★★
()
Ответ на: комментарий от denisE

как быть?

Покажи пример того, что тебе надо. Вообще чтобы возвращать ссылку надо гарантировать, что она будет жива после возврата из функции. Очевидно, что вот так написать нельзя:

fn foo() -> &i32 {
    &10
}
Но это и логично - мы возвращаем ссылку на стековую переменную. Вот так можно:
fn f1(a: &i32) -> &i32 {
    a
}

static N: i32 = 5;
fn f2() -> &'static i32 {
    &N
}

struct Test {
    a: i32,
}

fn f3(test: &Test) -> &i32 {
    &test.a
}

struct T<'a, 'b> {
    v1: &'a i32,
    v2: &'b i32,
}

fn get_v1<'a, '_>(t: &T<'a, '_>) -> &'a i32 {
    t.v1
}
В первом случае мы получили на вход ссылку с каким-то лайфтаймом, её же и возвращаем. Во втором случае возвращаем ссылку на статик переменную, а они живут всё время жизни программы. В третьем время жизни структуры и её членов совпадает. Ну и в последнем случае у нас есть структура с двумя ссылками - мы просто говорим, что время жизни возвращаемой ссылки будет соответствовать времени жизни конкретного поля структуры.

А лучше почитай официальный мануал.

DarkEld3r ★★★★★
()
Последнее исправление: DarkEld3r (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.