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 outro bloco. Cada cláusula segue o padrão
keyword condition {
<statements>
}
onde 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 para o qual o condition
avalia será true
executado. O else
bloco, se presente, é executado se nenhuma das condições avaliar para true
. O bloco é executado em seu próprio escopo, o que significa que quaisquer ligações feitas como parte do bloco não são visíveis após o término do bloco.
Por exemplo, suponha que qubits
é valor do tipo Qubit[]
e r1
e r2
são 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]);
}
Você também pode expressar ramificações simples na forma de uma expressão condicional.
Restrições específicas do alvo
A estreita integração entre construções de fluxo de controle e cálculos quânticos representa um desafio para o hardware quântico atual. Alguns processadores quânticos não suportam ramificações com base em resultados de medição. Como tal, a comparação de valores do tipo Result
sempre resultará em um erro de compilação para Q# programas que são direcionados para serem executados em tal hardware.
Outros processadores quânticos suportam tipos específicos de ramificação com base em resultados de medição. As expressões mais gerais if
suportadas são Q# 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 de execução condicional não podem conter expressões return
ou atualizar variáveis mutáveis declaradas fora desse bloco.