อะไรคือความแตกต่างระหว่างพารามิเตอร์ที่ระบุชื่อและตำแหน่งใน Dart?


146

Dart รองรับทั้งพารามิเตอร์ที่กำหนดชื่อและพารามิเตอร์ทางเลือกเพิ่มเติม ความแตกต่างระหว่างสองคืออะไร

นอกจากนี้คุณจะทราบได้อย่างไรว่ามีการระบุพารามิเตอร์ทางเลือกจริงหรือไม่

คำตอบ:


272

โผมีสองประเภทของพารามิเตอร์ดังนี้ชื่อและตำแหน่ง ก่อนที่ฉันจะพูดถึงความแตกต่างฉันขอพูดคุยเกี่ยวกับความคล้ายคลึงกันก่อน

พารามิเตอร์ทางเลือกของ Dart เป็นทางเลือกที่ผู้โทรไม่จำเป็นต้องระบุค่าสำหรับพารามิเตอร์เมื่อเรียกใช้ฟังก์ชัน

พารามิเตอร์ทางเลือกสามารถประกาศได้หลังจากพารามิเตอร์ที่จำเป็น

พารามิเตอร์ทางเลือกสามารถมีค่าเริ่มต้นซึ่งจะใช้เมื่อผู้โทรไม่ได้ระบุค่า

พารามิเตอร์ทางเลือกตำแหน่ง

พารามิเตอร์ที่ถูกล้อมด้วย[ ]เป็นพารามิเตอร์ทางเลือกตำแหน่ง นี่คือตัวอย่าง:

getHttpUrl(String server, String path, [int port=80]) {
  // ...
}

ในโค้ดข้างต้นเป็นตัวเลือกและมีค่าเริ่มต้นของport80

คุณสามารถโทรgetHttpUrlโดยใช้หรือไม่ใช้พารามิเตอร์ที่สาม

getHttpUrl('example.com', '/index.html', 8080); // port == 8080
getHttpUrl('example.com', '/index.html');       // port == 80

คุณสามารถระบุพารามิเตอร์หลายตำแหน่งสำหรับฟังก์ชั่น:

getHttpUrl(String server, String path, [int port=80, int numRetries=3]) {
  // ...
}

พารามิเตอร์ตัวเลือกที่มีตำแหน่งในการที่คุณไม่สามารถละเว้นถ้าคุณต้องการระบุportnumRetries

getHttpUrl('example.com', '/index.html');
getHttpUrl('example.com', '/index.html', 8080);
getHttpUrl('example.com', '/index.html', 8080, 5);

แน่นอนว่าถ้าคุณไม่ทราบว่า 8080 และ 5 คืออะไรมันยากที่จะบอกว่าตัวเลขเวทมนต์เหล่านั้นคืออะไร คุณสามารถใช้พารามิเตอร์ทางเลือกชื่อเพื่อสร้าง API ที่อ่านได้มากขึ้น

พารามิเตอร์ทางเลือกชื่อ

พารามิเตอร์ที่ถูกหุ้มด้วย{ }เป็นพารามิเตอร์ทางเลือกที่มีชื่อ นี่คือตัวอย่าง:

getHttpUrl(String server, String path, {int port = 80}) {
  // ...
}

คุณสามารถโทรgetHttpUrlโดยใช้หรือไม่ใช้พารามิเตอร์ที่สาม คุณต้องใช้ชื่อพารามิเตอร์เมื่อเรียกใช้ฟังก์ชัน

getHttpUrl('example.com', '/index.html', port: 8080); // port == 8080
getHttpUrl('example.com', '/index.html');             // port == 80

คุณสามารถระบุพารามิเตอร์ที่มีชื่อหลายรายการสำหรับฟังก์ชั่น:

getHttpUrl(String server, String path, {int port = 80, int numRetries = 3}) {
  // ...
}

เนื่องจากพารามิเตอร์ที่ระบุชื่อถูกอ้างอิงโดยชื่อพวกเขาสามารถใช้ในลำดับที่แตกต่างจากการประกาศของพวกเขา

getHttpUrl('example.com', '/index.html');
getHttpUrl('example.com', '/index.html', port: 8080);
getHttpUrl('example.com', '/index.html', port: 8080, numRetries: 5);
getHttpUrl('example.com', '/index.html', numRetries: 5, port: 8080);
getHttpUrl('example.com', '/index.html', numRetries: 5);

ฉันเชื่อว่าพารามิเตอร์ที่มีชื่อทำให้ไซต์การโทรที่เข้าใจง่ายขึ้นโดยเฉพาะอย่างยิ่งเมื่อมีการตั้งค่าสถานะบูลีนหรือหมายเลขที่ไม่อยู่ในบริบท

ตรวจสอบว่ามีการระบุพารามิเตอร์เผื่อเลือกหรือไม่

น่าเสียดายที่คุณไม่สามารถแยกแยะความแตกต่างระหว่างเคส "ไม่ได้ระบุพารามิเตอร์ที่เป็นทางเลือก" และ "พารามิเตอร์ทางเลือกได้รับการกำหนดให้เป็นค่าเริ่มต้น"

หมายเหตุ:คุณอาจใช้พารามิเตอร์ทางเลือกตำแหน่งหรือตั้งชื่อพารามิเตอร์ทางเลือกแต่ไม่ใช่ทั้งสองอย่างในฟังก์ชั่นหรือวิธีการเดียวกัน ไม่อนุญาตสิ่งต่อไปนี้

thisFunctionWontWork(String foo, [String positonal], {String named}) {
  // will not work!
}

4
? ผู้ประกอบการเลิกใช้งานแล้ว ฉันได้พบกับเงื่อนไขโมฆะในการกวดวิชาโผ (expr1? expr2: expr3 ยังใช้งานได้)
ZdeněkMlčoch

1
รักหลาย params ชื่อสำหรับฟังก์ชั่นนี้หายาก! จะดูดียิ่งขึ้นในส่วนสร้างของเอกสารหรือไม่ ;)
willsquire

1
ค่าเริ่มต้นในขณะนี้ควรมีการระบุด้วย=แทน:ตามdartlang.org/guides/language/...
nbro

31

ใน Dart ด้วยความเข้าใจของฉันพารามิเตอร์ method สามารถให้ในสองประเภท

  • พารามิเตอร์ที่จำเป็น
  • พารามิเตอร์ตัวเลือก (ตำแหน่ง, ชื่อ & ค่าเริ่มต้น)

>> พารามิเตอร์ที่จำเป็น

พารามิเตอร์ที่ต้องการคือพารามิเตอร์แบบเก่าที่รู้จักกันดีซึ่งเราทุกคนคุ้นเคย

ตัวอย่าง :

findVolume(int length, int breath, int height) {
 print('length = $length, breath = $breath, height = $height');
}

findVolume(10,20,30);

เอาท์พุท:

length = 10, breath = 20, height = 30

>> พารามิเตอร์ตำแหน่งเพิ่มเติม

พารามิเตอร์จะถูกเปิดเผยด้วยวงเล็บเหลี่ยม[] & พารามิเตอร์วงเล็บเหลี่ยมเป็นตัวเลือก

ตัวอย่าง:

findVolume(int length, int breath, [int height]) {
 print('length = $length, breath = $breath, height = $height');
}

findVolume(10,20,30);//valid
findVolume(10,20);//also valid

เอาท์พุท:

length = 10, breath = 20, height = 30
length = 10, breath = 20, height = null // no value passed so height is null

>> พารามิเตอร์ที่กำหนดชื่อเป็นตัวเลือก

  • พารามิเตอร์จะถูกเปิดเผยด้วยวงเล็บปีกกา {}
  • พารามิเตอร์วงเล็บเหลี่ยมเป็นทางเลือก
  • ต้องใช้ชื่อพารามิเตอร์เพื่อกำหนดค่าที่คั่นด้วย colan :
  • ในการสั่งซื้อพารามิเตอร์วงเล็บเหลี่ยมหยิกไม่สำคัญ
  • พารามิเตอร์ประเภทเหล่านี้ช่วยให้เราหลีกเลี่ยงความสับสนขณะผ่านค่าสำหรับฟังก์ชันที่มีพารามิเตอร์จำนวนมาก

ตัวอย่าง:

findVolume(int length, int breath, {int height}) {
 print('length = $length, breath = $breath, height = $height');
}

findVolume(10,20,height:30);//valid & we can see the parameter name is mentioned here.
findVolume(10,20);//also valid

เอาท์พุท:

length = 10, breath = 20, height = 30
length = 10, breath = 20, height = null

>> พารามิเตอร์เริ่มต้นที่เป็นตัวเลือก

  • เหมือนกับพารามิเตอร์ชื่อที่เป็นทางเลือกนอกจากนี้เราสามารถกำหนดค่าเริ่มต้นสำหรับพารามิเตอร์นี้
  • ซึ่งหมายความว่าจะไม่มีการส่งค่าใด ๆ ผ่านค่าเริ่มต้นนี้

ตัวอย่าง:

findVolume(int length, int breath, {int height=10}) {
 print('length = $length, breath = $breath, height = $height');
} 

findVolume(10,20,height:30);//valid
findVolume(10,20);//valid 

เอาท์พุท:

length = 10, breath = 20, height = 30
length = 10, breath = 20, height = 10 // default value 10 is taken

ขอบคุณสำหรับคำอธิบายที่ชัดเจนจากลิงก์วิดีโอนี้เครดิตสำหรับผู้สร้างวิดีโอ

ลิงก์วิดีโอ: ตัวเลือกเพิ่มเติมพารามิเตอร์พารามิเตอร์

ลิงค์วิดีโอ: ระบุชื่อพารามิเตอร์

ลิงค์วิดีโอ: OptionalDefaultParameters


3

เมื่อระบุพารามิเตอร์ของฟังก์ชันโดยใช้ไวยากรณ์ "paramName: value" ดังนั้นจึงเป็นพารามิเตอร์ที่มีชื่อ พารามิเตอร์ดังกล่าวสามารถแสดงผลเป็นทางเลือกโดยใส่ไว้ในวงเล็บ [และ] การสาธิตฟังก์ชั่นนี้สามารถแสดงให้เห็นได้ในโปรแกรม Hello World ดังต่อไปนี้:

sayHello([String name = ' World!']) {
  print('Hello, ${name}');
}

void main() {
  sayHello('Govind');
}

2

จากเอกสารเราพบว่าทั้งสองpositionalและnamedพารามิเตอร์เป็นตัวเลือกซึ่งหมายความว่าพวกเขาทั้งหมดสามารถหายไป

ในความคิดของnamedพารามิเตอร์ที่เข้มงวดมากขึ้นกว่าpositionalคน ตัวอย่างเช่นหากคุณประกาศวิธีดังกล่าว:

String say({String from, String msg})

ดังกล่าวข้างต้นfromและmsgมีnamedพารามิเตอร์เมื่อคุณเรียกวิธีการที่คุณจะต้องใช้say say(from: "xx", msg: "xx")กุญแจไม่สามารถหายไป

อย่างไรก็ตามหากคุณใช้พารามิเตอร์ตำแหน่งคุณจะว่าง


เอกสารบอกว่า:> พารามิเตอร์ทางเลือกสามารถตั้งชื่อหรือตำแหน่งได้ แต่ไม่ใช่ทั้งสองอย่าง มันบอกว่าพารามิเตอร์ตำแหน่งเป็นตัวเลือก?
Markon

พารามิเตอร์ตำแหน่งคือรูปแบบเริ่มต้นของพารามิเตอร์ในภาษาการเขียนโปรแกรมเรียกว่าตำแหน่งเนื่องจาก "เป็นพารามิเตอร์ตัวแรกหรือตัวที่สอง ฯลฯ " Namedพารามิเตอร์ถูกเรียกเช่นนั้นเพราะคุณสามารถระบุได้จริงตามชื่อและไม่ใช่ตามตำแหน่ง (ถ้าคุณสลับตำแหน่งของ params สองชื่อมันไม่สำคัญ) ดูคำตอบข้างต้นจาก Savaranaraja
Markon

0

พารามิเตอร์ตำแหน่ง:

พวกเขาเหมือนกับพารามิเตอร์เริ่มต้น ตัวอย่างเช่น:

void add(int x, [int y = 3]);

นี่ y มีค่าเริ่มต้นเป็น 3

พารามิเตอร์ที่มีชื่อ:

เหล่านี้คือพารามิเตอร์ที่สามารถส่งผ่านในลำดับใด ๆ โดยผ่านชื่อของพารามิเตอร์ตามด้วยค่าที่ส่งผ่าน ตัวอย่างเช่น:

void sum({int num1, int num2});

ฟังก์ชั่นนี้เรียกว่า:

sum(num1: 12, num2: 24);

พารามิเตอร์ที่มีชื่อนอกจากนี้ยังสามารถมีค่าเริ่มต้น

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