Ramificação condicional
A ramificação condicional é expressa na forma de if
expressões. Uma if
expressão consiste em uma if
cláusula, seguida por zero ou mais elif
cláusulas e, opcionalmente, um else-block. Cada cláusula segue o padrão
keyword condition {
<statements>
}
em que keyword
é substituído por if
ou elif
, respectivamente, condition
é uma expressão do tipo Bool
, e <statements>
deve ser substituído por zero ou mais instruções. O bloco opcional else
consiste na palavra-chave else
seguida por zero ou mais instruções entre chaves, {
}
.
O primeiro bloco em que a condition
for avaliada como true
será executado. O bloco else
, se estiver presente, será executado se nenhuma das condições for avaliada como true
. O bloco é executado em seu próprio escopo, o que significa que quaisquer associações feitas como parte do bloco não são visíveis após o término do bloco.
Por exemplo, suponha que qubits
seja o valor do tipo Qubit[]
e r1
, e r2
seja do tipo Result
.
if r1 == One {
let q = qubits[0];
H(q);
}
elif r2 == One {
let q = qubits[1];
H(q);
}
else {
H(qubits[2]);
}
Também é possível expressar a ramificação simples na forma de uma expressão condicional.
Restrições específicas do destino
Uma forte integração entre os constructos de fluxo de controle e as computações quânticas representa um desafio para os hardwares quânticos atuais. Alguns processadores quânticos não dão suporte à ramificação com base nos resultados da medida. Portanto, a comparação de valores do tipo Result
sempre resultará em um erro de compilação para programas Q# com execução direcionada a esses hardwares.
Outros processadores quânticos dão suporte a tipos específicos de ramificação com base nos resultados da medida. As expressões mais gerais if
suportadas em Q# são compiladas em instruções adequadas que podem ser executadas em tais processadores. As restrições impostas são que os valores do tipo Result
só podem ser comparados como parte da condição dentro if
de expressões em operações. Além disso, os blocos executados condicionalmente não podem conter nenhuma return
expressão ou atualizar variáveis mutáveis declaradas fora desse bloco.