Restrições
Restrições de capacidade
A restrição de parâmetro de tipo para uma classe ou método genérico pode limitar a uma capacidade específica, como visto anteriormente:
class Foo[A: Any val]
Sem a restrição, o genérico deve funcionar para todas as capacidades possíveis. Às vezes você não quer se limitar a uma capacidade específica e não pode suportar todas as capacidades. A solução para isso são os qualificadores de restrição genérica. Estes representam classes de capacidades que são aceitas no genérico. Os qualificadores válidos são:
Código | Capacidades permitidas | Descrição |
#read | ref, val, box | Qualquer coisa que você possa ler |
#send | iso, val, tag | Qualquer coisa que você pode mandar a um ator |
#share | val, tag | Qualquer coisa que você pode mandar para mais de um ator |
#any | iso, trn, ref, val, box, tag, | Padrão de uma restrição |
#alias | ref, val, box, tag | Conjunto de recursos com alias (usado pelo compilador) |
Na seção anterior, passamos por um trabalho extra para apoiar a iso. Se não houver necessidade de suporte de iso, podemos usar #read and support ref, val, and box:
class Foo[A: Any #read]
var _c: A
new create(c: A) =>
_c = c
fun ref get(): this->A => _c
fun ref set(c: A) => _c = c
actor Main
new create(env:Env) =>
let a = Foo[String ref](recover ref "hello".clone() end)
env.out.print(a.get().string())
let b = Foo[String val]("World")
env.out.print(b.get().string())