AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-16895246

Pioneer_11's questions

Martin Hope
Pioneer_11
Asked: 2024-12-09 07:11:50 +0800 CST

Rust, faça algo se um grande número de resultados estiverem todos ok ou retorne um vetor de todos os erros

  • 6

Estou tentando analisar algumas entradas do usuário. As entradas são armazenadas em uma estrutura onde há muitas opções/resultados (para lidar com os dados não inicializados antes que o usuário os insira) e quando o usuário os envia, eles precisam ir para uma estrutura onde todos os valores são conhecidos.

Gostaria de poder ter um vetor com quaisquer erros para que eu possa dar feedback ao usuário sobre todos os erros com a entrada (não apenas o primeiro). No entanto, não consigo encontrar uma boa maneira de fazer isso.

struct Test {
    x: i32,
    y: String,
}

#[derive(Debug)]
enum Errors {
    OneIsNone,
    TwoIsNone,
}

Minha abordagem atual é:

fn main() -> Result<Test, Vec<Errors>> {
    let option1 = Some(5);
    let option2 = None;

    let mut errors = Vec::new();

    let x: i32;
    match option1 {
        Some(value) => x = value,
        None => errors.push(Errors::OneIsNone),
    };

    let y: String;
    match option2 {
        Some(value) => y = value,
        None => errors.push(Errors::TwoIsNone),
    }

    if errors.len() != 0 {
        return Err(errors)
    }

    Ok(
        Test {
            x,
            y
        }
    )
}

O que não funciona porque o compilador não consegue dizer que x e y devem ser inicializados se o código atingir o Okbloco.

Nesse caso, eu poderia simplesmente desembrulhar e corresponder os dois resultados, mas essa abordagem se tornaria terrivelmente desajeitada para estruturas com um grande número de campos.

Basicamente, quero uma maneira de receber um grande número de resultados e analisá-los em uma estrutura se todos eles fornecerem Ok()ou retornarem um vetor contendo todos os erros, caso contrário, como implementar unwrap_or_errorsem

fn main() -> Result<Test, Vec<Errors>> {
    let option1 = Some(5);
    let option2 = None;

    let mut errors = Vec::new();
    

    let x = match option1 {
        Some(val) => Ok(val),
        None => Err(Errors::OneIsNone),
    };

    let y =  match option2 {
        Some(val) => Ok(val),
        None => Err(Errors::TwoIsNone),
    };

    
    if errors.len() != 0 {
        return Err(errors)
    }

    Test::unwrap_or_errors(x, y)?
}
rust
  • 1 respostas
  • 38 Views
Martin Hope
Pioneer_11
Asked: 2024-07-15 09:31:55 +0800 CST

ferrugem `split` dividido antes da correspondência do padrão

  • 5

Estou tentando dividir a Stringretenção de cada correspondência de padrão, mas com a parte correspondente retida como o início da próxima substring, em vez do terminador da última.

Implementação atual:

let s = String::from("AaaBbCc");
for block in s.split_inclusive(|c: char| c.is_uppercase()) {
    println!("{block}")
}

Saída atual

A
aaB
bC
c

Saída desejada

Aaa
Bb
Cc

Como isso pode ser alcançado?

rust
  • 2 respostas
  • 64 Views
Martin Hope
Pioneer_11
Asked: 2024-07-15 01:15:33 +0800 CST

desembrulhe ou avalie como falso em ferrugem

  • 5

Eu encontrei vários casos semelhantes a este:

if let Some(x) = formula_chars.peek() {
    if x.is_lowercase() {
        todo!()
    }
}

onde eu gostaria que uma expressão fosse avaliada como falsa se Optionfor Nonealguma operação na Somevariante (neste caso is_lowercase()) retorna falso. No entanto, a única maneira que encontrei de fazer isso é usando ifinstruções aninhadas conforme mostrado acima. Existe alguma maneira de fazer isso com uma única expressão? de preferência algo parecido com o código abaixo:

nota: o código abaixo não funciona, é apenas para ilustrar o comportamento desejado

if formula_chars.peek().unwrap_or(false).is_lowercase() {
    todo!()
}

PS, neste caso específico, eu sei que poderia unwrap_orusar apenas um caractere não minúsculo, por exemplo

if formula_chars.peek().unwrap_or('_').is_lowercase() {
    todo!()
}

mas estou procurando uma solução mais geral (e de preferência menos complicada)

rust
  • 2 respostas
  • 53 Views
Martin Hope
Pioneer_11
Asked: 2023-10-03 17:53:01 +0800 CST

Como o mapa assume propriedade parcial por meio de uma referência imutável

  • 5

Estou tentando escrever uma função para encontrar o valor de uma mão de cartas. Como parte disso, preciso verificar se a mão é flush. Meu código para fazer isso é:

use itertools::Itertools;     // allows use of .all_equal()

fn find_hand_value(player_hand: Hand) {
    let is_flush: &bool = &player_hand.cards.map(|card| card.suit).iter().all_equal();
    // ... further checks
    println!("{:?}", player_hand)    // print takes ownership to represent further use of the hand
    // return hand value
}

No entanto, se você tentar executar este código, encontrará um erro mostrando que player_hand.cardsfoi parcialmente movido devido à chamada do método para map. Considerando que o mapa é solicitado a um empréstimo imutável de, player_handsnão entendo como isso é possível, pois parece estar em contradição direta com as regras de empréstimo da ferrugem.

Alguém poderia explicar o que está acontecendo aqui e como/por que isso é possível? Obrigado,

Para contexto:

#[derive(Debug)]
struct Hand {
    cards: [Card; 5],
}

#[derive(Debug)]
struct Card {
    suit: Suit,
    value: Value,
}

#[derive(Debug, PartialEq, Eq)]
enum Suit {
    Hearts,
    Diamonds,
    Spades,
    Clubs,
}

#[derive(Debug, Ord, PartialOrd, Eq, PartialEq)]
enum Value {
    Two,
    Three,
    Four,
    Five,
    Six,
    Seven,
    Eight,
    Nine,
    Ten,
    Jack,
    Queen,
    King,
    Ace,
}
dictionary
  • 1 respostas
  • 25 Views
Martin Hope
Pioneer_11
Asked: 2023-10-03 10:00:46 +0800 CST

Pegue um número conhecido de entradas

  • 7

Estou procurando obter um número conhecido de insumos em ferrugem. Neste caso, estou considerando mãos de pôquer para o problema 54 do projeto Euler, onde cada linha é analisada em duas mãos de cinco cartas cada. Encontrei duas abordagens principais para esta situação, das quais não gosto.

Abordagem 1:

let mut buffer_1 = Vec::with_capacity(5);
for i in 0..5 {
    buffer_1.push(i)
}
assert_eq!(buffer_1.len(), 5);

Abordagem 2:

let mut buffer_2 = [None, 5];
for i in 0..5 {
    buffer_2[i as usize] = Some(i)
}

A abordagem 1 está na pilha, apesar de ter um tamanho conhecido em tempo de compilação, e a abordagem 2 me fornece valores opcionais onde eu sei que tudo é um arquivo Some. O que eu gostaria idealmente é algo capaz de coletar alguma função ou colsure em um array ou similar. por exemplo

fn array_from_colsure<T>(length: usize, closure: fn() -> T) -> Option<[T; length]> {
    // implementation
}
#[test]
fn array_from_closure_test() {
    let a: [i32; 5] = array_from_colsure(5, || {for i in 0..5 {i}}).unwrap()
}

Esclarecimento: estou procurando algo com essa funcionalidade e não criá-lo do zero.

Como mostra a excelente resposta de Silvio Mayolo (editei um pouco a funcionalidade desejada desde a pergunta original), implementar minha sugestão exigirá uma quantidade enorme de unsafecódigo (sem mencionar um enorme esforço para uma otimização tão pequena). Portanto, não é sensato fazê-lo para um pequeno número de projetos.

rust
  • 2 respostas
  • 62 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve