Fermetures dans Dart
1. Qu'est-ce qu'une Closure ?
Dans le langage de programmation Dart, Closure (la clôture) est une fonction spéciale.
- Comme une fonction, une Closure est un bloc d'instructions avec des paramètres et peut renvoyer une valeur ou rien du tout.
- A l'inverse d'une fonction, Closure n'a pas de nom, cependant, vous pouver identifier une Closure à travers d'une variable.
La syntaxe :
// Closure syntax
(data_type1 arg1, data_type2 arg2, data_typeN argN) {
// Statements
}
// Declare a variable as an alias for Closure
var alias = (data_type1 arg1, data_type2 arg2, data_typeN argN) {
// Statements
};
Par exemple: On déclare une Closure ayant un paramètre et la convoque directement.
closure_ex1.dart
void main() {
// Create a Closure!
(String name) {
print('Hello $name!');
};
// Create a Closure and call it directly!
(String name) {
print('Bye $name!');
}('Tom');
}
Output:
Bye Tom!
Par exemple : Déclarer une variable comme un identifiant pour une Closure :
closure_ex2.dart
void main() {
// Declare a variable as an alias for Closure
var sum = (int a, int b) {
return a + b;
};
// Call a closure.
var result = sum(100, 200); // 300
print('result = $result');
}
2. La syntaxe de flèche
Si le contenu de la Closure se compose d'une seule expression, vous pouvez l'écrire de manière plus courte avec la syntaxe de la flèche (Arrow syntax) :
var alias1 = (data_type1 arg1, data_type2 arg2, data_typeN argN) {
print('Something');
}
// Same as:
var alias1 = (data_type1 arg1, data_type2 arg2, data_typeN argN) => print('Something');
var alias2 = (data_type1 arg1, data_type2 arg2, data_typeN argN) {
return a_value;
}
// Same as:
var alias2 = (data_type1 arg1, data_type2 arg2, data_typeN argN) => a_value;
Par exemple :
closure_arrow_ex1.dart
void main() {
// Create a Closure
var sum = (int a, int b) => a + b;
var result = sum(100, 200); // Call a closure.
print('result = $result');
// Create a Closure
var sayHello = (String name) => print('Hello $name');
sayHello('Tom'); // Call a closure.
}
Output:
result = 300
Hello Tom
3. La classe Function
Dans le langage Dart, une Closure est un objet de la classe Function, vous pouvez donc déclarer une Closure avec la syntaxe suivante :
La syntaxe :
Function(type1 arg1, type2 arg2, typeN argN) func = (type1 arg1, type2 arg2, typeN argN) {
// Statements
};
// Or:
return_type Function(type1 arg1, type2 arg2, typeN argN) func;
func = (type1 arg1, type2 arg2, typeN argN) {
// Statements
};
Par exemple :
closure_func_ex1.dart
void main() {
// Function Type: (int, int) --> (int)
Function(int a, int b) sum = (int a, int b) {
return a + b;
};
// Function Type: (int, int) --> (int)
int Function(int a, int b) minus;
minus = (int a, int b) => a - b;
var result1 = sum(100, 200); // 300
print('result1 = $result1');
var result2 = minus(100, 200); // -100
print('result2 = $result2');
}
4. Closure dans le paramètre
Closure peut apparaître en tant que paramètre d'une autre fonction, d'une autre clôture, d'une autre méthode ou d'un autre constructeur.
// A Function to calculate Tax.
// It accepts 2 arguments:
// 1 - int amount
// 2 - Closure
void printTaxAmount(int amount, double Function(int amount) taxFormula) {
var tax = taxFormula(amount);
print('tax = $tax');
}
// Same as:
void printTaxAmount(int amount, double taxFormula(int amount)) {
var tax = taxFormula(amount);
print('tax = $tax');
}
Par exemple :
closure_in_args_ex1.dart
// A Function to calculate Tax.
// It accepts 2 arguments:
// 1 - int amount
// 2 - Closure
void printTaxAmount(int amount, double Function(int amount) taxFormula) {
var tax = taxFormula(amount);
print('tax = $tax');
}
void main() {
// Create a Closure (Tax calucation formula of US)
var usTaxFormula = (int amount) {
return 10 * amount / 100; // return a double type.
};
// Create a Closure (Tax calucation formula of Vietnam)
var vnTaxFormula = (int amount) {
return 5 * amount / 100; // return a double type.
};
const amount = 1000;
printTaxAmount(amount, usTaxFormula); // 100.0
printTaxAmount(amount, vnTaxFormula); // 50.0
}
Output:
tax = 100.0
tax = 50.0
List.generate Example:
Le constructeur List.generate de la classe List dispose d'une Closure comme paramètre. Observer un exemple sur l'utilisation de ce constructeur.
List.generate Constructor
external factory List.generate(int length, E generator(int index), {bool growable = true});
Par exemple :
closure_in_args_ex3.dart
// List.generate Constructor:
// external factory List.generate(int length, E generator(int index), {bool growable = true});
void main() {
// (int index) --> (String)
var generator = (int index) {
return 'Value ' + index.toString();
};
// Create a List with 5 elements:
List<String> myList = List.generate(5, generator, growable: true);
print(myList); // [Value 0, Value 1, Value 2, Value 3, Value 4]
}
Output:
[Value 0, Value 1, Value 2, Value 3, Value 4]
Tutoriels de programmation Dart
- Type de données Boolean dans Dart
- Fonctions dans Dart
- Fermetures dans Dart
- Méthodes dans Dart
- Propriétés en Dart
- Programmation Dart avec l'outil en ligne DartPad
- Installer Dart SDK sur Windows
- Installer Visual Studio Code sur Windows
- Installer Dart Code Extension pour Visual Studio Code
- Installer Dart Plugin pour Android Studio
- Exécutez votre premier exemple Dart en Visual Studio Code
- Exécutez votre premier exemple Dart en Android Studio
- Parsing JSON avec dart:convert
- Le Tutoriel de Dart List
- Variables dans Dart
- Le Tutoriel de Dart Map
- Les Boucles en Dart
- Analyser Dart JSON avec le package dart_json_mapper
- Qu'est-ce que Transpiler?
Show More