É possível no Rust criar uma função com um argumento padrão?
fn add(a: int = 1, b: int = 2) { a + b }
function
parameters
arguments
rust
Jeroen
fonte
fonte
Option
e passar explicitamenteNone
.Respostas:
Não, não é no momento. Eu acho que provavelmente será implementado, mas não há nenhum trabalho ativo neste espaço no momento.
A técnica típica empregada aqui é usar funções ou métodos com nomes e assinaturas diferentes.
fonte
Uma vez que os argumentos padrão não são suportados, você pode obter um comportamento semelhante usando
Option<T>
Isso cumpre o objetivo de ter o valor padrão e a função codificados apenas uma vez (em vez de em cada chamada), mas é claro que é muito mais para digitar. A chamada de função será semelhante a
add(None, None)
, da qual você pode ou não gostar, dependendo da sua perspectiva.Se você não perceber nada digitando na lista de argumentos, já que o codificador potencialmente esquece de fazer uma escolha, a grande vantagem aqui está na explicitação; o chamador está dizendo explicitamente que deseja seguir seu valor padrão e obterá um erro de compilação se não inserir nada. Pense nisso como uma digitação
add(DefaultValue, DefaultValue)
.Você também pode usar uma macro:
A grande diferença entre as duas soluções é que com os argumentos -al "Opção" é completamente válido escrever
add(None, Some(4))
, mas com a correspondência de padrão de macro você não pode (isso é semelhante às regras de argumento padrão do Python).Você também pode usar uma estrutura de "argumentos" e os
From
/Into
traits:Esta escolha é obviamente muito mais código, mas ao contrário do design de macro, ela usa o sistema de tipos, o que significa que os erros do compilador serão mais úteis para o usuário de sua biblioteca / API. Isso também permite que os usuários façam sua própria
From
implementação, se isso for útil para eles.fonte
Não, Rust não oferece suporte a argumentos de função padrão. Você deve definir métodos diferentes com nomes diferentes. Também não há sobrecarga de função, porque Rust usa nomes de função para derivar tipos (a sobrecarga de função requer o oposto).
No caso de inicialização da estrutura, você pode usar a sintaxe de atualização da estrutura como esta:
[a pedido, fiz uma postagem cruzada desta resposta de uma pergunta duplicada]
fonte
Se você estiver usando Rust 1.12 ou posterior, você pode pelo menos tornar os argumentos de função mais fáceis de usar com
Option
einto()
:fonte
Rust não suporta argumentos de função padrão, e não acredito que será implementado no futuro. Então, escrevi um proc_macro duang para implementá-lo na forma de macro.
Por exemplo:
fonte
Outra forma poderia ser declarar um enum com os parâmetros opcionais como variantes, que podem ser parametrizados para obter o tipo certo para cada opção. A função pode ser implementada para obter uma fatia de comprimento variável das variantes enum. Eles podem estar em qualquer ordem e comprimento. Os padrões são implementados na função como atribuições iniciais.
resultado:
fonte