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())
www.000webhost.com