Dart Temel Sözdizimi | Operatörler #3

MÜŞERREF SELÇUK ÖZDEMIR
6 min readDec 2, 2023

--

Operators

Dart aşağıdaki tabloda gösterilen operatörleri destekler. Tablo, Dart’ın işleç ilişkilerini yaklaşık olarak gösteren, en yüksekten en düşüğe doğru Dart’ın işleç ilişkiselliğini ve işleç önceliğini gösterir. Bu operatörlerin çoğunu sınıf üyesi olarak uygulayabilirsiniz.

Uyarı: Önceki tablo sadece yardımcı bir rehber olarak kullanılmalıdır. İşleç önceliği ve ilişkiselliği kavramı, dil gramerinde bulunan gerçeğin bir yaklaşımıdır. Dart’ın işleç ilişkilerinin yetkili davranışını Dart dil belirtiminde tanımlanan dilbilgisinde bulabilirsiniz.

Operatörleri kullandığınızda, ifadeler oluşturursunuz. İşte operatör ifadelerine bazı örnekler:

a++
a + b
a = b
a == b
c ? a : b
a is T

Operatör önceliği örneği:

İşleç tablosunda, her işleç kendisini takip eden satırlardaki işleçlerden daha yüksek önceliğe sahiptir. Örneğin, çarpma operatörü %, mantıksal AND operatörü &&’den daha yüksek önceliğe sahip olan eşitlik operatörü ==’den daha yüksek önceliğe sahiptir (ve bu nedenle daha önce yürütülür). Bu öncelik, aşağıdaki iki kod satırının aynı şekilde yürütüleceği anlamına gelir:

// Parantezler okunabilirliği artırır.
if ((n % i == 0) && (d % i == 0)) ...

// Okuması daha zor ama eşdeğer.
if (n % i == 0 && d % i == 0) ...

Uyarı: İki işlenen alan işleçler için, en soldaki işlenen hangi yöntemin kullanılacağını belirler. Örneğin, bir Vector nesneniz ve bir Point nesneniz varsa, aVector + aPoint, Vector toplama (+) yöntemini kullanır.

Aritmetik operatörler

Dart, aşağıdaki tabloda gösterildiği gibi olağan aritmetik operatörleri destekler.

Örnek:

assert(2 + 3 == 5);
assert(2 - 3 == -1);
assert(2 * 3 == 6);
assert(5 / 2 == 2.5); // Result is a double
assert(5 ~/ 2 == 2); // Result is an int
assert(5 % 2 == 1); // Remainder

assert('5/2 = ${5 ~/ 2} r ${5 % 2}' == '5/2 = 2 r 1');

Dart ayrıca hem önek hem de sonek artırma ve azaltma operatörlerini destekler.

Örnek:

int a;
int b;

a = 0;
b = ++a; // Increment a before b gets its value.
assert(a == b); // 1 == 1

a = 0;
b = a++; // Increment a after b gets its value.
assert(a != b); // 1 != 0

a = 0;
b = --a; // Decrement a before b gets its value.
assert(a == b); // -1 == -1

a = 0;
b = a--; // Decrement a after b gets its value.
assert(a != b); // -1 != 0

Eşitlik ve ilişkisel operatörler

Aşağıdaki tabloda eşitlik ve ilişkisel operatörlerin anlamları listelenmektedir.

İki x ve y nesnesinin aynı şeyi temsil edip etmediğini test etmek için == operatörünü kullanın. (İki nesnenin tamamen aynı nesne olup olmadığını bilmeniz gereken nadir durumlarda, bunun yerine identical() işlevini kullanın). == operatörünün nasıl çalıştığı aşağıda açıklanmıştır:

  1. x veya y null ise, her ikisi de null ise true, yalnızca biri null ise false değerini döndürür.
  2. y bağımsız değişkeniyle x üzerinde == yönteminin çağrılmasının sonucunu döndürür. (Doğru, == gibi işleçler ilk işlenenleri üzerinde çağrılan yöntemlerdir. Ayrıntılar için Operatörler bölümüne bakın).

İşte eşitlik ve ilişkisel işleçlerin her birinin kullanımına ilişkin bir örnek:

assert(2 == 2);
assert(2 != 3);
assert(3 > 2);
assert(2 < 3);
assert(3 >= 3);
assert(2 <= 3);

Tip testi operatörleri

as, is ve is! operatörleri çalışma zamanında türleri kontrol etmek için kullanışlıdır.

Örneğin, obj is Object? ifadesi her zaman doğrudur. obj is T ifadesinin sonucu, obj T tarafından belirtilen arayüzü uyguluyorsa doğrudur.

Bir nesneyi belirli bir türe dönüştürmek için as operatörünü, yalnızca nesnenin o türden olduğundan eminseniz kullanın. Örnek:

(employee as Person).firstName = 'Bob';

Nesnenin T türünde olduğundan emin değilseniz, nesneyi kullanmadan önce türünü kontrol etmek için is T kullanın.

if (employee is Person) {
// Type check
employee.firstName = 'Bob';
}

Not: Kod eşdeğer değildir. employee null ise veya bir Person değilse, ilk örnek bir istisna atar; ikincisi ise hiçbir şey yapmaz.

Atama operatörleri

Daha önce gördüğünüz gibi, = operatörünü kullanarak değer atayabilirsiniz. Yalnızca atanacak değişken null ise atama yapmak için ??= operatörünü kullanın.

// Assign value to a
a = value;
// Assign value to b if b is null; otherwise, b stays the same
b ??= value;

= gibi bileşik atama operatörleri bir işlemi bir atama ile birleştirir.

= , *, =, %=, >>>=, ^=, +=, /=, <<=, &=, |=, -=, ~/=, >>=

Bileşik atama operatörlerinin nasıl çalıştığı aşağıda açıklanmıştır:

Aşağıdaki örnekte atama ve bileşik atama operatörleri kullanılmaktadır:

var a = 2; // Assign using =
a *= 3; // Assign and multiply: a = a * 3
assert(a == 6);

Mantıksal operatörler

Mantıksal operatörleri kullanarak boolean ifadeleri tersine çevirebilir veya birleştirebilirsiniz.

İşte mantıksal operatörlerin kullanımına bir örnek:

if (!done && (col == 0 || col == 3)) {
// ...Do something...
}

Bitsel ve kaydırma operatörleri

Dart’ta sayıların bitlerini tek tek değiştirebilirsiniz. Genellikle, bu bitsel ve kaydırma operatörlerini tamsayılarla kullanırsınız.

İşte bitsel ve kaydırma operatörlerinin kullanımına bir örnek:

final value = 0x22;
final bitmask = 0x0f;

assert((value & bitmask) == 0x02); // AND
assert((value & ~bitmask) == 0x20); // AND NOT
assert((value | bitmask) == 0x2f); // OR
assert((value ^ bitmask) == 0x2d); // XOR

assert((value << 4) == 0x220); // Shift left
assert((value >> 4) == 0x02); // Shift right

// Shift right example that results in different behavior on web
// because the operand value changes when masked to 32 bits:
assert((-value >> 4) == -0x03);

assert((value >>> 4) == 0x02); // Unsigned shift right
assert((-value >>> 4) > 0); // Unsigned shift right

Sürüm notu: >>> işleci (üçlü kaydırma veya işaretsiz kaydırma olarak bilinir) en az 2.14 dil sürümü gerektirir.

Koşullu ifadeler

Dart, aksi takdirde if-else ifadeleri gerektirebilecek ifadeleri kısaca değerlendirmenizi sağlayan iki operatöre sahiptir:

koşul ? expr1 : expr2
Koşul doğruysa, expr1'i değerlendirir (ve değerini döndürür); aksi takdirde, expr2'yi değerlendirir ve değerini döndürür.
expr1 ?? expr2
expr1 boş değilse, değerini döndürür; aksi takdirde, expr2'nin değerini değerlendirir ve döndürür.
Boole ifadesine dayalı bir değer atamanız gerektiğinde, ? ve : kullanmayı düşünün.

var visibility = isPublic ? 'public' : 'private';

Boolean ifade null için test yapıyorsa ?? kullanmayı düşünün.

String playerName(String? name) => name ?? 'Guest';

Bir önceki örnek en az iki farklı şekilde daha yazılabilirdi, ancak bu kadar kısa ve öz olamazdı:

// Slightly longer version uses ?: operator.
String playerName(String? name) => name != null ? name : 'Guest';

// Very long version uses if-else statement.
String playerName(String? name) {
if (name != null) {
return name;
} else {
return 'Guest';
}
}

Kademeli gösterim

Basamaklar (.., ?..) aynı nesne üzerinde bir dizi işlem yapmanızı sağlar. Örnek üyelerine erişmenin yanı sıra, aynı nesne üzerinde örnek yöntemlerini de çağırabilirsiniz. Bu genellikle sizi geçici bir değişken oluşturma adımından kurtarır ve daha akıcı kod yazmanızı sağlar.

Aşağıdaki kodu düşünün:

var paint = Paint()
..color = Colors.black
..strokeCap = StrokeCap.round
..strokeWidth = 5.0;

Paint() kurucusu bir Paint nesnesi döndürür. Basamaklı gösterimi izleyen kod, döndürülebilecek değerleri yok sayarak bu nesne üzerinde çalışır.

Önceki örnek bu koda eşdeğerdir:

var paint = Paint();
paint.color = Colors.black;
paint.strokeCap = StrokeCap.round;
paint.strokeWidth = 5.0;

Basamağın üzerinde çalıştığı nesne null olabiliyorsa, ilk işlem için null kısaltmalı bir basamak (?..) kullanın. ?.. ile başlamak, bu null nesne üzerinde basamaklı işlemlerin hiçbirinin denenmemesini garanti eder.

querySelector('#confirm') // Get an object.
?..text = 'Confirm' // Use its members.
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'))
..scrollIntoView();

Önceki kod aşağıdakine eşdeğerdir:

var button = querySelector('#confirm');
button?.text = 'Confirm';
button?.classes.add('important');
button?.onClick.listen((e) => window.alert('Confirmed!'));
button?.scrollIntoView();

Ayrıca basamakları iç içe yerleştirebilirsiniz. Örneğin:

final addressBook = (AddressBookBuilder()
..name = 'jenny'
..email = 'jenny@example.com'
..phone = (PhoneNumberBuilder()
..number = '415-555-0100'
..label = 'home')
.build())
.build();

Basamağınızı gerçek bir nesne döndüren bir işlev üzerinde oluşturmaya dikkat edin. Örneğin, aşağıdaki kod başarısız olur:

var sb = StringBuffer();
sb.write('foo')
..write('bar'); // Hata: 'write' yöntemi 'void' için tanımlanmamış.

sb.write() çağrısı void döndürür ve void üzerinde bir basamak oluşturamazsınız.

Diğer operatörler

Kalan operatörlerin çoğunu diğer örneklerde gördünüz:

--

--