Menu
Coddy logo textTech

Metodo call()

Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 73 di 110.

Dart ha un metodo speciale chiamato call() che ti permette di usare un oggetto come se fosse una funzione. Quando una classe definisce un metodo call(), puoi richiamare le istanze di quella classe usando la sintassi di chiamata di funzione.

class Multiplier {
  int factor;
  
  Multiplier(this.factor);
  
  int call(int value) {
    return value * factor;
  }
}

void main() {
  var double = Multiplier(2);
  var triple = Multiplier(3);
  
  print(double(5));  // 10 - chiamare un oggetto come una funzione
  print(triple(5));  // 15
}

Invece di scrivere double.call(5), puoi semplicemente scrivere double(5). Dart invoca automaticamente il metodo call() quando usi le parentesi sull'oggetto.

Il metodo call() può accettare qualsiasi parametro e restituire qualsiasi tipo, proprio come un metodo normale:

class Greeter {
  String prefix;
  
  Greeter(this.prefix);
  
  String call(String name, {String punctuation = '!'}) {
    return '$prefix, $name$punctuation';
  }
}

void main() {
  var hello = Greeter('Hello');
  print(hello('Alice'));  // Hello, Alice!
  print(hello('Bob', punctuation: '?'));  // Hello, Bob?
}

Questo schema è utile quando ti servono oggetti che si comportano come funzioni, ma mantengono anche uno stato o una configurazione. Viene comunemente usato per creare operazioni riutilizzabili, validatori o formattatori che devono ricordare le impostazioni tra una chiamata e l'altra.

challenge icon

Sfida

Facile

Creiamo un sistema di formattazione del testo in cui gli oggetti formattatori possano essere chiamati direttamente come funzioni! Creerai classi invocabili che trasformano il testo in modi diversi mantenendo le proprie impostazioni di configurazione.

Organizzerai il codice in due file:

  • formatters.dart: crea due classi invocabili che trasformano le stringhe:
    • Una classe Wrapper che racchiude il testo con un prefisso e un suffisso configurabili. Dovrebbe memorizzare le stringhe prefix e suffix e il suo metodo call() dovrebbe accettare un String text e restituire il testo racchiuso tra il prefisso e il suffisso.
    • Una classe Repeater che ripete il testo un numero configurabile di volte. Dovrebbe memorizzare un intero times e il suo metodo call() dovrebbe accettare un String text e restituire il testo ripetuto quel numero di volte, separato da spazi.
  • main.dart: importa i tuoi formattatori e mostra come questi oggetti possano essere usati proprio come funzioni:
    • Crea un Wrapper con il prefisso '[' e il suffisso ']'
    • Crea un altro Wrapper con il prefisso '***' e il suffisso '***'
    • Crea un Repeater con times impostato su 3
    • Chiama il primo wrapper con 'Hello' e stampa il risultato
    • Chiama il secondo wrapper con 'Important' e stampa il risultato
    • Chiama il repeater con 'Go' e stampa il risultato
    • Mostra il concatenamento passando il risultato del primo wrapper (con 'Nested') al secondo wrapper, quindi stampa il risultato

Nota come puoi chiamare direttamente i tuoi oggetti formattatori usando le parentesi, proprio come normali funzioni. Il metodo call() lo rende possibile e ogni oggetto ricorda la propria configurazione tra un utilizzo e l'altro!

Risultato previsto:

[Hello]
***Important***
Go Go Go
***[Nested]***

Provalo tu

import 'formatters.dart';

void main() {
  // TODO: Crea un Wrapper con prefix '[' e suffix ']'
  
  // TODO: Crea un altro Wrapper con prefix '***' e suffix '***'
  
  // TODO: Crea un Repeater con times impostato su 3
  
  // TODO: Chiama il primo wrapper con 'Hello' e stampa il risultato
  
  // TODO: Chiama il secondo wrapper con 'Important' e stampa il risultato
  
  // TODO: Chiama il repeater con 'Go' e stampa il risultato
  
  // TODO: Mostra come concatenare le chiamate passando il risultato del primo wrapper
  // (con 'Nested') al secondo wrapper e stampa il risultato
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Dart online