Hướng dẫn lập trình Dart: Hàm và tham số

Cú pháp hàm


// Hàm kiểm tra nguyên tố khí hiếm
bool kiemTraKhongKhíQuý(int soNguyênTử) {
  return bangKhongKhíQuý[soNguyênTử] != null;
}
// Có thể bỏ qua kiểu trả về (không khuyến khích)
kiemTraKhongKhíQuý(soNguyênTử) {
  return bangKhongKhíQuý[soNguyênTử] != null;
}
// Hàm chỉ có 1 biểu thức có thể dùng cú pháp ngắn gọn
// => expr tương đương { return expr; }
bool kiemTraKhongKhíQuý(int soNguyênTử) 
    => bangKhongKhíQuý[soNguyênTử] != null;

Tham số bắt buộc và tùy chọn

Tham số bắt buộc đặt trước, tham số tùy chọn có thể là tham số có tên hoặc vị trí


// Gọi hàm với tham số có tên
batTatTuongSo(bật: true, ẩn: false);
// Định nghĩa tham số có tên {thamSố1, thamSố2, ...}
/// Thiết lập các cờ [bật] và [ẩn]...
void batTatTuongSo({bool bật, bool ẩn}) {...}
// Tham số tùy chọn có thể đánh dấu bắt buộc
import package:meta/meta.dart
const ThanhCuộn({Key khóa, @required Widget con})
// Tham số vị trí
String nói(String từ, String tin, [String thiếtBị]) {
  var kếtQuả = '$từ nói $tin';
  if (thiếtBị != null) {
    kếtQuả = '$kếtQuả bằng $thiếtBị';
  }
  return kếtQuả;
}
// Gọi hàm với tham số vị trí
assert(nói('Bob', 'Chào') == 'Bob nói Chào');
assert(nói('Bob', 'Chào', 'tín hiệu khói') ==
    'Bob nói Chào bằng tín hiệu khói');
// Giá trị mặc định
void batTatTuongSo({bool bật = false, bool ẩn = false}) {...}
// bật = true; ẩn = false
batTatTuongSo(bật: true);
// Hàm với tham số mặc định
String nói(String từ, String tin,
    [String thiếtBị = 'thú bưu điện', String tâmTrạng]) {
  var kếtQuả = '$từ nói $tin';
  if (thiếtBị != null) {
    kếtQuả = '$kếtQuả bằng $thiếtBị';
  }
  if (tâmTrạng != null) {
    kếtQuả = '$kếtQuả (trạng thái $tâmTrạng)';
  }
  return kếtQuả;
}
assert(nói('Bob', 'Chào') ==
    'Bob nói Chào bằng thú bưu điện');
// Tham số mặc định có thể là List hoặc Map
void làmGìĐó(
    {List<int> danhSách = const [1, 2, 3],
    Map quàTặng = const {
      'đầu tiên': 'giấy',
      'thứ hai': 'vải',
      'thứ ba': 'da'
    }}) {
  print('danhSách:  $danhSách');
  print('quàTặng: $quàTặng');
}

Hàm chính

Hàm main là điểm khởi đầu, không trả về giá trị và có thể nhận List làm tham số


void main() {
  querySelector('#sample_text_id')
    ..text = 'Nhấn vào đây!'
    ..onClick.listen(đảoNgượcChữ);
}
// Chạy ứng dụng như sau: dart args.dart 1 test
void main(List<String> đốiSố) {
  print(đốiSố);
  assert(đốiSố.length == 2);
  assert(int.parse(đốiSố[0]) == 1);
  assert(đốiSố[1] == 'test');
}

Hàm như đối tượng


// Truyền hàm làm tham số
void inPhầnTử(int phầnTử) {
  print(phầnTử);
}
var danhSách = [1, 2, 3];
// Truyền inPhầnTử làm tham số
danhSách.forEach(inPhầnTử);
// Gán hàm cho biến
// hàmLớn có kiểu là String Function(String)
var hàmLớn = (tin) => '!!! ${tin.toUpperCase()} !!!';
assert(hàmLớn('xin chào') == '!!! XIN CHÀO !!!');

Hàm vô danh


([[Kiểu] thamSố1[, …]]) {
  khốiMã;
};


var danhSách = ['táo', 'chuối', 'cam'];
danhSách.forEach((sảnPhẩm) {
  print('${danhSách.indexOf(sảnPhẩm)}: $sảnPhẩm');
});
// Cú pháp rút gọn
danhSách.forEach(
    (sảnPhẩm) => print('${danhSách.indexOf(sảnPhẩm)}: $sảnPhẩm'));

Các khái niệm khác


// Phạm vi biến
bool cấpCao = true;
void main() {
  var trongMain = true;
  void hàmCủaTôi() {
    var trongHàm = true;
    void hàmLồng() {
      var trongHàmLồng = true;
      assert(cấpCao);
      assert(trongMain);
      assert(trongHàm);
      assert(trongHàmLồng);
    }
  }
}
// Hàm đóng gói
/// Trả về hàm cộng [cộngVới] vào đối số
Function taoHamCong(int cộngVới) {
  return (int i) => cộngVới + i;
}
void main() {
  // Tạo hàm cộng 2
  var cộng2 = taoHamCong(2);
  // Tạo hàm cộng 4
  var cộng4 = taoHamCong(4);
  assert(cộng2(3) == 5);
  assert(cộng4(3) == 7);
}
// So sánh hàm (kiểm tra bằng nhau)
void hàmChính() {} // Hàm cấp cao
class A {
  static void hàmTĩnh() {} // Phương thức tĩnh
  void hàmThựcThể() {} // Phương thức thực thể
}
void main() {
  var x;
  // So sánh hàm cấp cao
  x = hàmChính;
  assert(hàmChính == x);
  // So sánh phương thức tĩnh
  x = A.hàmTĩnh;
  assert(A.hàmTĩnh == x);
  // So sánh phương thức thực thể
  var v = A(); // Thực thể #1 của A
  var w = A(); // Thực thể #2 của A
  var y = w;
  x = w.hàmThựcThể;
  // Các hàm này trỏ cùng thực thể (#2), nên bằng nhau
  assert(y.hàmThựcThể == x);
  // Các hàm này trỏ thực thể khác nhau, nên khác nhau
  assert(v.hàmThựcThể != w.hàmThựcThể);
}
// Hàm không trả về giá trị sẽ trả về null
hàmChỗ() {}
assert(hàmChỗ() == null);

Thẻ: Dart Hàm Dart Tham số tùy chọn closure Dart programming

Đăng vào ngày 11 tháng 6 lúc 20:48