คืออะไร ?? เครื่องหมายคำถามคู่ใน Dart?


96

บรรทัดรหัสต่อไปนี้มีเครื่องหมายคำถามสองข้อ:

final myStringList = prefs.getStringList('my_string_list_key') ?? [];

มันหมายความว่าอะไร?

คำตอบ:


194

ตัว??ดำเนินการเครื่องหมายคำถามคู่หมายถึง "ถ้าว่าง" ใช้นิพจน์ต่อไปนี้ตัวอย่างเช่น

String a = b ?? 'hello';

วิธีนี้aเท่ากับbแต่ถ้าbเป็นโมฆะแล้วเท่ากับa'hello'

??=อีกประการหนึ่งผู้ประกอบการที่เกี่ยวข้อง ตัวอย่างเช่น:

b ??= 'hello';

ซึ่งหมายความว่าถ้าเป็นโมฆะแล้วตั้งเท่ากับb helloไม่งั้นไม่ต้องเปลี่ยน

ข้อมูลอ้างอิง

เงื่อนไข

ข่าวปล่อยโผ 1.12รวมเรียกว่าต่อไปนี้เป็นผู้ประกอบการ null ตระหนักถึง :

  • ?? - ถ้าตัวดำเนินการว่าง
  • ??= - การกำหนดค่าว่างเปล่า
  • x?.p - การเข้าถึงที่เป็นโมฆะ
  • x?.m() - การเรียกใช้เมธอดที่ทราบค่าว่าง

3
น่าสนใจทำไมมัน ?? และไม่?: มันค่อนข้างทำให้เข้าใจผิดสำหรับคนที่มาจาก PHP เช่น ?? ใน PHP หมายถึงตรงกันข้ามอย่างสิ้นเชิง
Vedmant

1
@Vedmant อาจจะเป็นเพราะอยู่แล้วจะถูกใช้โดยผู้ประกอบการที่ประกอบไปด้วย:? String a = b == true ? 'x' : 'y';ซึ่งโอเปอเรเตอร์ if-null กลายเป็นเพียงชวเลขสำหรับการตรวจสอบค่าว่างที่String a = a == null ? 'hello : a;เกี่ยวข้อง
Bruno Finger

1
@BrunoFinger ?ใช้สำหรับตัวดำเนินการ ternary แบบเดียวกับใน PHP และมีทางลัดเช่น$a = $b === true ? $b : 'y'คุณสามารถพิมพ์$a = $b === true ?: 'y'หรือแทน$a = $b === true ? 'x' : $b-$a = $b === true ?? 'x'
Vedmant

3

Dart มีตัวดำเนินการที่มีประโยชน์สำหรับจัดการกับค่าที่อาจเป็นโมฆะ หนึ่งคือตัวดำเนินการ ?? = การกำหนดซึ่งกำหนดค่าให้กับตัวแปรก็ต่อเมื่อตัวแปรนั้นเป็นโมฆะในปัจจุบัน:

int a; // The initial value of a is null.
a ??= 3;
print(a); // <-- Prints 3.

a ??= 5;
print(a); // <-- Still prints 3.

ตัวดำเนินการรู้ค่าว่างอีกตัวคือ ?? ซึ่งส่งคืนนิพจน์ทางด้านซ้ายเว้นแต่ว่าค่าของนิพจน์นั้นจะเป็นโมฆะซึ่งในกรณีนี้จะประเมินและส่งคืนนิพจน์ทางด้านขวา:

print(1 ?? 3); // <-- Prints 1.
print(null ?? 12); // <-- Prints 12.

คุณตอบโพสต์ที่ตอบไปแล้วเมื่อ 2 ปีก่อนเพื่อขอคะแนนโหวตหรือไม่?
Arthur Rey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.