3.Functions-函數(Dart中文文檔)

来源:https://www.cnblogs.com/lowezheng/archive/2018/12/19/10125887.html
-Advertisement-
Play Games

初次翻譯,部分內容並非按字面翻譯,是按本人理解進行了內容重組。如有錯誤望指正。 Dart是完全的面向對象的語言,甚至函數也是一個Function類型的對象。這意味著函數可以賦值給變數或者作為函數的參數。你可以直接用變數名(其實現了Function類)作為函數名直接調用。 參考如下示例代碼: 下麵是一 ...


  • 初次翻譯,部分內容並非按字面翻譯,是按本人理解進行了內容重組。如有錯誤望指正。

Dart是完全的面向對象的語言,甚至函數也是一個Function類型的對象。這意味著函數可以賦值給變數或者作為函數的參數。你可以直接用變數名(其實現了Function類)作為函數名直接調用。
參考如下示例代碼:

/*如果類實現了call方法,它可以當成Function直接調用*/
class WannabeFunction {
  call(String a, String b, String c) => '$a $b $c!';
}

main() {
  var wf = new WannabeFunction();
  var out = wf("Hi","there,","gang");
  print('$out');

下麵是一個函數寫法的示例:

bool isNoble(int atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}

儘管Dart要求public的API需要說明返回類型,但是未明確指定返回類型的函數也是可以正常運行的

isNoble(atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}

For functions that contain just one expression, you can use a shorthand syntax:
如果函數體只包含一條語句的代碼塊,你可以用如下簡略寫法:

bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
The => expr syntax is a shorthand for { return expr; }. The => notation is sometimes referred to as arrow syntax.

註意:必須是一條語句的代碼塊,可以放在=>和;之間。

函數由兩種參數類型:必須和可選。一般必須參數寫在前面,可選參數緊隨其後。

Optional parameters 可選參數

可選參數定義方式是位置型和命名型兩種二選一。

可選命名參數定義時,你可以指定參數名和參數預設值,如下所示:

enableFlags(bold: true, hidden: false);

當定義函數時,也可以用{param1, param2, …} 來描述命名參數。如下所示:

/// Sets the [bold] and [hidden] flags ...
void enableFlags({bool bold, bool hidden}) {...}

Flutter的對象初始化方法入參是複合型的,所以組件可以用命名參數的寫法準確映射到各個欄位。
你可以對命名參數添加@required,那麼它就變為一個必須參數。

const Scrollbar({Key key, @required Widget child})
When a Scrollbar is constructed, the analyzer reports an issue when the child argument is absent.

@required在meta的包中定義,使用時,需要引入import package:meta/meta,獲取其它包,其中包含了export meta的定義。

Optional positional parameters 可選位置參數

在[]中定義的參數被稱為位置型參數。

String say(String from, String msg, [String device]) {
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  return result;
}

如下是無位置型參數的函數調用

assert(say('Bob', 'Howdy') == 'Bob says Howdy');

如下是有位置型參數的函數調用。

assert(say('Bob', 'Howdy', 'smoke signal') ==
    'Bob says Howdy with a smoke signal');

Default parameter values 參數預設值

你可以用=給命名參數或者位置參數賦預設值。其中,預設值必須是常量。如果參數沒有定義預設值,其預設為null

下麵是命名參數的預設值寫法

/// Sets the [bold] and [hidden] flags ...
void enableFlags({bool bold = false, bool hidden = false}) {...}
// bold will be true; hidden will be false.
enableFlags(bold: true);

廢棄特性:舊的代碼預設值用:做賦值,原因是命名參數只能用:賦值,現在該支持已被刪除,請使用=做參數預設值賦值
下麵是位置型參數定義預設值的例子:

String say(String from, String msg,
    [String device = 'carrier pigeon', String mood]) {
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  if (mood != null) {
    result = '$result (in a $mood mood)';
  }
  return result;
}
assert(say('Bob', 'Howdy') ==
    'Bob says Howdy with a carrier pigeon');

你也可以給預設值賦值lists或者maps,下麵就是這樣的例子:

void doStuff(
    {List<int> list = const [1, 2, 3],
    Map<String, String> gifts = const {
      'first': 'paper',
      'second': 'cotton',
      'third': 'leather'
    }}) {
  print('list:  $list');
  print('gifts: $gifts');
}

The main() function 主函數

每個應用都會有主函數,作為程式運行的入口。main函數就是Dart的主函數,它的返回值是void,入參是一個字元串數組。

void main() {
  querySelector('#sample_text_id')
    ..text = 'Click me!'
    ..onClick.listen(reverseText);
}

註意:..是對象的鏈式調用的寫法。

下麵是一個帶有參數的main函數:

// Run the app like this: dart args.dart 1 test
void main(List<String> arguments) {
  print(arguments);

  assert(arguments.length == 2);
  assert(int.parse(arguments[0]) == 1);
  assert(arguments[1] == 'test');
}

你可以用args庫來解析命令行參數。

Functions as first-class objects 函數型參數

你可以使用函數作為一個入參傳遞給另一個函數。如下麵例子:

void printElement(int element) {
  print(element);
}

var list = [1, 2, 3];

// Pass printElement as a parameter.
list.forEach(printElement);

你可以函數定義為變數,如下麵所示:

var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!';
assert(loudify('hello') == '!!! HELLO !!!');

Anonymous functions 匿名函數

大部分函數都有函數名,比如main(),printElement(),你也可以定義一個無函數名的函數,可用lambda或者closure寫法,我們稱之為匿名函數。同時可以將匿名函數賦予一個變數來調用。匿名函數和命名函數一樣,都可以有0個或者更多的入參。如下示例所示:


([[Type] param1[, …]]) { 
  codeBlock; 
}; 

下麵是一個具體示例:

var list = ['apples', 'bananas', 'oranges'];
list.forEach((item) {
  print('${list.indexOf(item)}: $item');
});

如果函數體只是一個語句的代碼塊,你可以如下簡化,去除{}.

list.forEach(
    (item) => print('${list.indexOf(item)}: $item'));

Lexical scope 辭彙作用域

Dart是一個lexically scoped language,意思是變數的作用域是和變數所以的代碼塊有關係,在變數所在代碼塊中,可以訪問到變數。

bool topLevel = true;

void main() {
  var insideMain = true;

  void myFunction() {
    var insideFunction = true;

    void nestedFunction() {
      var insideNestedFunction = true;

      assert(topLevel);
      assert(insideMain);
      assert(insideFunction);
      assert(insideNestedFunction);
    }
  }
}

Lexical closures 辭彙閉包

A closure is a function object that has access to variables in its lexical scope, even when the function is used outside of its original scope.

Functions can close over variables defined in surrounding scopes. In the following example, makeAdder() captures the variable addBy. Wherever the returned function goes, it remembers addBy.

/// Returns a function that adds [addBy] to the
/// function's argument.
Function makeAdder(num addBy) {
  return (num i) => addBy + i;
}

void main() {
  // Create a function that adds 2.
  var add2 = makeAdder(2);

  // Create a function that adds 4.
  var add4 = makeAdder(4);

  assert(add2(3) == 5);
  assert(add4(3) == 7);
}

Testing functions for equality 測試函數的相等性

下麵是函數的頂層函數,靜態方法,對象方法的相等性

void foo() {} // A top-level function

class A {
  static void bar() {} // A static method
  void baz() {} // An instance method
}

void main() {
  var x;

  // Comparing top-level functions.
  x = foo;
  assert(foo == x);

  // Comparing static methods.
  x = A.bar;
  assert(A.bar == x);

  // Comparing instance methods.
  var v = A(); // Instance #1 of A
  var w = A(); // Instance #2 of A
  var y = w;
  x = w.baz;

  // These closures refer to the same instance (#2),
  // so they're equal.
  assert(y.baz == x);

  // These closures refer to different instances,
  // so they're unequal.
  assert(v.baz != w.baz);
}

Return values 返回值

所有函數都有返回值,如果沒有特別約定,返回值為null.這是編譯時,內置追加到函數體中。


foo() {}

assert(foo() == null);
  • 第四篇準備翻譯 Operators操作符

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 亂碼的解決 通過過濾器解決亂碼問題:CharacterEncodingFilter 配置web.xml文件 運行結果: 這種方法主要解決的是表單post方法提交的數據,如果是get方法提交的數據,可以: a) 修改tamcat配置 b) 自定義亂碼過濾器 restful風格,優點:輕量級,安全,效率 ...
  • Yii使用單例的場景非常多,比如請求開始創建的Application,Yii,Request,Response等對象功能都十分豐富且開銷也很大,維持一個單例就可供請求的整個生命周期使用。在請求開始即創建,請求結束自行銷毀,中間不銷毀也不創建。這些對象使用了單例沒有疑問,但是這些單例的產生、管理和使用... ...
  • 學習一個設計模式,至少應該明白,這種設計模式要解決什麼問題,什麼時候可以使用,他是如何解決問題的,要記住關鍵代碼,還有優缺點是什麼。 創建型模式 創建型模式顧名思義,就是用來創建對象的。有時候為了保證創建的對象唯一,或者創建的高效等等,就需要用到這些設計模式。 單例模式 單例模式就是保證創建的對象是 ...
  • 如果這是第二次看到我的文章,歡迎右側掃碼訂閱我喲~ 👉 本文長度為4069字,建議閱讀11分鐘。 也許你對降級已經有了一些認識,認真看完,我想這篇文章可能會給你帶來一些新的收穫~ 前面兩篇我們已經聊過了「熔斷」(如何在到處是“雷”的系統中「明哲保身」?這是第一招)和「限流」(想通關「限流」?只要這 ...
  • 啰嗦兩句 前幾天的教程內容量都比較大,今天寫一個相對簡單的,爬取的還是蜂鳥,依舊採用 希望你喜歡 爬取頁面 本篇教程還是基於 學習 的目的,為啥選擇蜂鳥,沒辦法,我瞎選的。 一頓熟悉的操作之後,我找到了下麵的鏈接 這個鏈接返回的是JSON格式的數據 1. page =2頁碼,那麼從1開始進行迴圈就好 ...
  • 一、什麼是字典 字典是python里的一種數據類型,特點是元素的無序性,和鍵key的唯一性。字典的創建方法是{key:values},字典里的鍵key只能是不可變的數據類型(整型,字元串或者是元組),值values可以是任何數據類型。字典里的一組key:values叫做一個鍵值對item。 二、字典 ...
  • 函數: 將特定功能代碼編寫在一個函數里 便於閱讀和復用 對一組表達特定功能表達式的封裝 使程式模塊化 python內置函數: input(),print(),eval()... 函數定義 函數語法格式: def <函數名>(<參數列表>): <函數體> return <返回值列表> 函數調用過程: ...
  • 重載運算符 ==和!=的重載 問題:假如有一個類似於vector的類,這個類只能存放string,當有2個這個類的對象時,如何比較這2個對象。 自己重載==和!= 代碼(重載==,!=) c++ include include include class string_vector{ friend ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...