Dynamic invoke
- Dart kursu
- İleri seviye
- Ders 21/83
- 5 dk
reflectable ile dynamic invoke öğrenirsin.
Dinamik metot çağrısı
Reflection ile bir metot ismi (Symbol olarak) alınabilir ve çalışma zamanında çağrılabilir. dart:mirrors'da instanceMirror.invoke(symbol, args) bunu yapar.
Mirrors gerektirmeyen alternatif: Function.apply(fn, args). Bir fonksiyonu dinamik olarak argüman listesiyle çağırır. Örnek: Function.apply(add, [3, 4]).
Bir başka yol: noSuchMethod'u override ederek bilinmeyen metot çağrılarını yakalamak. dynamic tür ile birlikte esnek proxy sınıfları yazılır.
Function.apply örneği
Function.apply(fn, positionalArgs, namedArgs), fn'i verilen argümanlarla çağırır. positionalArgs bir List, namedArgs bir Map<Symbol, dynamic>'tir.
Örnek: int add(int a, int b) => a + b; var r = Function.apply(add, [3, 4]);. Sonuç 7 olur; tıpkı add(3, 4) gibi.
Kullanım: komut satırı argümanından metot seçme, test çerçevelerinde parametre listesiyle çağrı.
Uygulama Function.apply ile topla
Top-level int add(int a, int b) => a + b; fonksiyonunu tanımla. main içinde var r = Function.apply(add, [3, 4]); ve print(r); ekle.
Başlangıç kodu
void main() {
// add fonksiyonunu tanımla (main dışında)
// Function.apply ile add(3,4) çağrısı ekle; yazdır
}Örnek çözüm
int add(int a, int b) => a + b;
void main() {
var r = Function.apply(add, [3, 4]);
print(r);
}Beklenen çıktı
7
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Dinamik çağrı yolları
| Kavram | Anlamı |
|---|---|
Function.apply |
Fonksiyonu çağır |
mirror.invoke |
Metot çağır |
noSuchMethod |
Bilinmeyen çağrı |
dynamic |
Tür denetimini kaldır |
2 Function.apply ne yapar?
- Bir fonksiyonu argüman listesiyle çağırır Doğru cevap
- Bir metodu yeniden adlandırır
- Bir Future döndürür
- Bir sınıf oluşturur
Açıklama: Function.apply fn'i verilen argümanlarla çağırır.
3 Fonksiyonu çağır
var r = ____(add, [3, 4]);
var r = Function.apply(add, [3, 4]);
Açıklama: Function.apply(add, [3,4]) add(3,4) ile eşittir.