Namespaces

Em seu nível superior, um programa Q# consiste em um conjunto de namespaces. Além dos comentários, os namespaces são os únicos elementos de nível superior em um programa Q#, e todos os outros elementos devem residir em um namespace. Cada arquivo pode conter zero ou mais namespaces, e cada namespace pode abranger vários arquivos. O Q# não dá suporte a namespaces.

Um bloco de namespace consiste na palavra-chave namespace, seguida pelo nome do namespace e pelo conteúdo do bloco nas chaves { }. Os nomes de namespace consistem em uma sequência de um ou mais símbolos legais separados por um ponto (.). Embora os nomes de namespace possam conter pontos para melhor legibilidade, o Q# não oferece suporte a referências relativas a namespaces. Por exemplo, dois namespaces Foo e Foo.Bar não estão relacionados, e não há nenhuma noção de uma hierarquia. Em particular, para uma função Baz definida no Foo.Bar, não é possível abrir Foo e, em seguida, acessar essa função pelo Bar.Baz.

Os blocos de namespace podem conter diretivas abertas , bem como declarações de operação, função e tipo . Eles podem ocorrer em qualquer ordem e são recursivos por padrão, o que significa que eles podem ser declarados e usados em qualquer ordem e podem chamá-los; não há necessidade de declaração de um tipo ou callable para preceder seu uso.

Diretivas abertas

Por padrão, tudo declarado no mesmo namespace pode ser acessado sem qualificação adicional. No entanto, as declarações em um namespace diferente só podem ser usadas qualificando seu nome com o nome do namespace ao qual pertencem ou abrindo o namespace antes que ele seja usado, conforme mostrado no exemplo a seguir.

namespace Microsoft.Quantum.Samples {
    
    open Microsoft.Quantum.Arithmetic; 
    open Microsoft.Quantum.Arrays as Array; 

    // ...
}

O exemplo usa uma diretiva open para importar todos os tipos e chamadores declarados no namespace Microsoft.Quantum.Artithmetic. Em seguida, eles podem ser referenciados por seu nome não qualificado, a menos que esse nome esteja em conflito com uma declaração no bloco de namespace ou outro namespace aberto.

Para evitar digitar o nome completo ao mesmo tempo que ainda distingue de onde determinados elementos são provenientes, você pode definir um nome alternativo ou alias, que geralmente é mais curto, para um namespace específico. Nesse caso, todos os tipos e os chamadores declarados nesse namespace podem ser qualificados pelo nome curto definido. No exemplo anterior, esse é o caso do namespace Microsoft.Quantum.Arrays. Uma função IndexRange declarada em Microsoft.Quantum.Arrays, por exemplo, pode ser usada pelo Array.IndexRange desse bloco de namespace.

Se você estiver abrindo um namespace ou definindo um alias, open as diretivas são válidas em toda a parte do namespace somente nesse arquivo.