[Dart] Optional positional & named params


เริ่มจาก function ทั่วไปก่อน
function ธรรมดาต้องถ้ามี param ก็ต้องใส่ไปตามลำดับแบบนี้

import "dart:core";
String shout(String msg,int exclamations) {
  var buffer = new StringBuffer(msg.toUpperCase());
  if( exclamations != null) {
    for (var i =0 ;i< exclamations; i++) {
      buffer.write("!");
    }
  }  
  return buffer.toString();
}
main() {
  print(shout("Hello, World" ,1 ));
}
// HELLO, WORLD!

แต่ว่าถ้าเป็น positional , named จะมีการ define ใน function แบบนี้
optional positional

String shout(String msg,[int exclamations]) //กรณีนี้ควร check ว่ามีการ set ค่า exclamations มาหรือเปล่า

หรือแบบให้มีค่า default

String shout(String msg, [int exclamations=1])

ทำให้เรียกใช้ได้แบบนี้

print(shout("Hello, World"));

หรือว่าแบบนี้

print(shout("Hello, World", 5));


code เต็มๆ

import "dart:core";
String shout(String msg,[int exclamations=1]) {
  var buffer = new StringBuffer(msg.toUpperCase());
  if( exclamations != null) { //เพิ่มความปลอดภัยในการใช้ optional positional params ด้วยการ check อีกครั้งหนึ่ง
    for (var i =0 ;i< exclamations; i++) {
      buffer.write("!");
    }
  }
  return buffer.toString();
}
main() {
  print(shout("Hello, World"));
}

แม้ว่าเราจะ set ค่า default ไว้ให้กับค่า exclamations แล้วก็จริงแต่ว่า
ก็เป็นไปได้ที่ผู้เรียก function จะเรียกมาแบบนี้ ดังนั้นเพื่อความปลอดภัยจึงควร check ไว้ก่อน

print(shout("Hello, World", null));

Optional named params
การประกาศก็คล้ายๆ positional แค่เปลี่ยนจาก [] มาเป็น {}

String shout(String msg,{int exclamations}) 

สามารถกำหนดค่า default ได้เช่นกัน

String shout(String msg,{int exclamations:1}) 

วิธีการเรียกใช้

print(shout("Hello, World")); //HELLO, WORLD!

แต่มันแตกต่างกับ optional positional ตรงนี้ มันเรียกโดยใส่ param ที่ไม่มีชื่อเข้าไปไม่ได้ครับผม

print(shout("Hello, World", 1));//NoSuchMethodError

ต้องเรียกแบบนี้เท่านั้นครับ

print(shout("Hello, World", exclamations:1));

และเน่ืองจากมีความสามารถพวกนี้ dart เลยมีการ check แบบพิเศษขึ้นมาอีกแบบนึง
ก็คือการเช็คว่าได้มีการส่ง param ชื่อนั้นชื่อนี้เข้ามาใน function หรือเปล่า

?exclamations // true ถ้ามีการส่ง param มา , false ถ้าไม่มี

Source code เต็มๆ จ้า

import "dart:core";
String shout(String msg,{int exclamations:1}) {
  if(!?exclamations) { // if ไม่มี exclamations ส่งมา 
    //ค่าของ exclamations กรณีนี้จะเป็น null
    return "$msg O.o";
  }
  var buffer = new StringBuffer(msg.toUpperCase());

  if( exclamations != null) {
    for (var i =0 ;i< exclamations; i++) {
      buffer.write("!");
    }
  }
  return buffer.toString();
}
main() {
  print(shout("Hello, World"));
  print(shout("Hello, World",exclamations:null));
  print(shout("Hello, World",exclamations:0));
  print(shout("Hello, World",exclamations:1));
}
Result:
Hello, World O.o
HELLO, WORLD
HELLO, WORLD
HELLO, WORLD!

This code base on dart M4.
ที่มา http://www.dartlang.org/dart-tips/dart-tips-ep-6.html
//stay sharp!

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s