一個 JSer 的 Dart 學習日誌(六):寫一個向量

知名噴子發表於2022-06-02

致讀者

本文是《一個 JSer 的 Dart 學習日誌》系列的第六篇,本系列文章主要以挖掘 JS 與 Dart 異同點的方式,在複習和鞏固 JS 的同時平穩地過渡到 Dart 語言。
如無特殊說明,本文中 JS 包含了自 ES5 至 ES2021 的全部特性, Dart 版本則為 2.0 以上版本。
鑑於作者尚屬 Dart 初學者,所以認識可能會比較膚淺和片面,對知識的概括難免有所疏漏,如您慧眼識蟲,望不吝指正。本系列文章首發于思否平臺,雖然沒有限制其他平臺轉載,但是勘誤及新增內容僅限於思否,如您是在別的地方看到本文,請移步思否,以免看到未修訂的內容。

關於

自本系列挖坑以來,上次填坑已經是去年的事情了,老實說 Dart 已經忘得非常乾淨了。
所以按照之前挖坑的進度,本篇理應學習下 Dart 的資料集合方式 Map 或 List,但是臨時想把原來學習過的東西鞏固一下,所以先造個東西試試。

向量的實現(JS && Dart)

1. class 宣告

使用陣列/列表儲存向量的值,這樣做的好處是向量可以是任意多個維度。
  • JS:

    class Vector{
      #values = [];
    
      constructor(values = []){
          this.#values = values.map(item => +item);
      }
    }
  • Dart:

    class Vector{
      List<double> _values;
    
      const Vector(this._values);
    }

2. 向量轉陣列/列表

將向量變成一個陣列/列表。
  • JS:

    getValues(){
      return this.#values.map(item => item);
    }
  • Dart:

    List<double> getValues(){
      return _values.map((item) => item).toList();
    }

3. 讀取指定維度的值

維度在這裡其實是一個序號,也就是陣列/列表的下標。
  • JS:

    getVal(index = 0){
      return this.#values[index];
    }
  • Dart

    double getVal([int index = 0]){
      return _values[index];
    }

4. 向量相加

兩個等長向量相加,得到一個新的向量。
  • JS:

    add(obj){
      const objVals = obj.getValues();
      return this.#values.map((item, index) => item + objVals[index]);
    }
  • Dart:

    Vector operator +(Vector obj){
      final objVals = obj.getValues();
      int cnt = 0;
    
      return _values.map(
          (item) => item + objVals[cnt++]
      ).toList();
    }
向量的減法就是換個符號的事情,所以就省略了。

相關文章