The Perl 6 Web site on functions saysQual è il punto di coercizione come Int (Cool)?
tipi coercizione possono aiutare ad avere un tipo specifico all'interno di una routine, ma accettare l'input più ampio. Quando viene chiamata la routine, l'argomento viene automaticamente convertito nel tipo più stretto.
sub double(Int(Cool) $x) { 2 * $x } say double '21'; # 42 say double Any; # Type check failed in binding $x; expected 'Cool' but got 'Any'
Qui l'Int è il tipo di destinazione a cui verrà costretto l'argomento, e Cool è il tipo che la routine accetta come ingresso.
Ma qual è il punto per il sub? Non è $x
solo un Int
? Perché dovresti limitare il chiamante ad implementare Cool
per l'argomento?
Sono doppiamente confuso dall'esempio perché Int
già is Cool
. Così ho fatto un esempio in cui i tipi non condividono una gerarchia:
class Foo { method foomethod { say 'foomethod' } }
class Bar {}
class Quux is Foo {
# class Quux { # compile error
method Bar { Bar.new }
}
sub foo(Bar(Foo) $c) {
say $c.WHAT; # (Bar)
# $c.foomethod # fails if uncommented: Method 'foomethod' not found for invocant of class 'Bar'
}
foo(Quux.new)
Qui l'invocant di foo
è limitato a fornire una Foo
che può essere convertito in un Bar
ma foo
non può nemmeno chiamare un metodo di Foo
su $c
perché il suo tipo èBar
. Quindi, perché foo
importa che il tipo to-be-coerced sia un Foo
in primo luogo?
Qualcuno potrebbe far luce su questo? Anche i link alla documentazione appropriata e parti della specifica sono apprezzati. Non ho trovato nulla di utile lì.
non si limita al chiamante di * anche * implementare 'Cool', si limita a * solo * implementare' Cool' e di fornire un metodo di coercizione; 'double '21'' passa in una' Str', ma callee-side arriva un 'Int' – Christoph
@Christoph I ha lasciato il" also ". Spero sia accurato ora. – musiKk
Mi sembra che tu stia capendo all'indietro. La firma 'Int (Cool)' * accetta * a 'Cool' (il tipo più generale) e promuove a un' Int' localmente, non viceversa. Quindi puoi dargli un 'Str' e lo convertirà in un' Int', che * non * accade se specifichi 'Int' nella firma. Continui a parlare di inconvenienti al chiamante - quale inconveniente è il chiamante vivendo non essendo costretto a fare da solo la coercizione? – darch