Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dart中有类似结构的东西吗?_Dart - Fatal编程技术网

dart中有类似结构的东西吗?

dart中有类似结构的东西吗?,dart,Dart,在javascript中,它总是困扰着我人们使用对象作为向量,比如{x:1,y:2},而不是使用数组[1,2]。数组的访问时间比对象快得多,但按索引访问更容易混淆,尤其是在需要大型数组时。我知道dart有固定的数组,但是有没有一种方法可以像用另一种语言命名结构或元组/记录那样命名数组的偏移量?是否定义枚举/常量 我想要像这样的东西 List<int> myVector = new List([x,y]); myVector.x = 5; List myVector=新列表([x,y

在javascript中,它总是困扰着我人们使用对象作为向量,比如
{x:1,y:2}
,而不是使用数组
[1,2]
。数组的访问时间比对象快得多,但按索引访问更容易混淆,尤其是在需要大型数组时。我知道dart有固定的数组,但是有没有一种方法可以像用另一种语言命名结构或元组/记录那样命名数组的偏移量?是否定义枚举/常量

我想要像这样的东西

List<int> myVector = new List([x,y]);
myVector.x = 5;
List myVector=新列表([x,y]);
myVector.x=5;

有没有一种等效的或惯用的方法可以做到这一点?

只有在Dart中的类才能做到这一点

上有一些打开的功能请求


    • 听起来像是一门课

      类MyVector{
      最后的x;
      最后的y;
      常数MyVector(this.x,this.y);
      }
      
      在运行时,没有更简单、更有效的方法来创建名称索引结构。为了简单起见,您通常可以使用
      映射
      ,但它不如真正的类那么有效


      一个类至少应该和一个固定长度的列表一样高效(时间和内存),毕竟它不需要做索引边界检查。

      对于我来说,我有两种方法可以做到这一点。依我的观点,我将按最好的分类

      基于类的方法

      这里,方法是将您的需求封装在一个专用对象中

      优点:

      • 它是密封的
      • 根据需要,您可以提出几种访问变量的方法
      • 您可以在不破坏一切的情况下扩展功能
      • 我喜欢它:p
      缺点

      • 花更多时间创建类等
      • 你真的需要我在专业课上说的话吗
      • 也许对js人来说很奇怪
      示例:

      类向量{
      int x;
      int-y;
      静态最终字符串X=“X”;
      静态最终字符串Y=“Y”;
      向量({this.x,this.y});
      Vector.fromList(List-listocol){
      此.x=ListoFor[0];
      此.y=列表或[1];
      }
      //这里我使用字符串,但您可以使用[int]重新定义静态最终成员
      int运算符[](字符串coor){
      如果(coor=“x”){
      归还这个.x;
      }else if(coor==“y”){
      把这个还给我;
      }否则{
      //需要通过更适合的异常进行更改:)
      抛出新异常(“错误的coor”);
      }
      }
      }
      void main(){
      向量v=新向量(x:5,y:42);
      向量v2=新向量.fromList([12,24]);
      打印(v.x);//打印5
      打印(v[“y”];//打印42
      打印(v2.x);//打印12
      打印(v2[Vector.Y]);//打印24
      }
      
      基于枚举的方法:

      您还可以定义一个“enum”(实际上不是真正的实现,但将在未来的版本中),它将包含指向您的值的“快捷方式”

      专业人士

      • 更易于实现
      • 更像你的榜样;p
      缺点

      • 不可扩展
      • 我觉得不太漂亮
      • 不是我想的
      例如:

      类向量{
      静态最终整数x=0;
      静态最终整数y=1;
      }
      void main(){
      列表myVector=新列表(2);
      myVector[Vector.x]=5;
      myVector[Vector.y]=42;
      }
      

      做出你的选择;p

      如果您有合理的大数据结构,您可以使用
      “dart:typed_data”
      作为模型,并为存储的数据提供轻量级视图。这样,开销应该是最小的。 例如,如果需要Uint8值的4X4矩阵:

      导入“dart:typed_数据”;
      导入“dart:集合”;
      导入“package:range/range.dart”;
      类模型4x4uint8{
      最终UINT8列表数据;
      静态常量int objectLength=4*4;
      最终队列索引;
      Model4X4Uint8(int-length):\u数据=新uint8列表((长度)*objectLength),
      _freelotIndexes=新队列.from(范围(0,长度));
      int get slotsleet=>\u freeSlotIndexes.length;
      num运算符[](整数索引)=>_数据[索引];
      运算符[]=(int-index,int-val)=>\u数据[index]=val;
      int reserveSlot()=>
      slotsleet>0?\u freeSlotIndexes.removeFirst():抛出(“满”);
      void delete(int index)=>\u freeSlotIndexes.addFirst(index);
      }
      类matrix4uint8{
      最终整数偏移量;
      最终型号4x4uint8型号;
      常量矩阵x4uint8(this.model,this.offset);
      num运算符[](整数索引)=>模型[偏移量+索引];
      运算符[]=(int-index,int-val)=>model[offset+index]=val;
      void delete()=>model.delete(偏移量);
      }
      void main(){
      最终型号4x4uint8数据=新型号4x4uint8(100);
      最终Matrix4X4Uint8 mat=新Matrix4X4Uint8(数据,data.reserveSlot())
      ..[14] = 10
      ..[12]=256;//下压;
      打印(${mat[0]}${mat[4]}${mat[8]}${mat[12]}\n”
      “${mat[1]}${mat[5]}${mat[9]}${mat[13]}\n”
      “${mat[2]}${mat[6]}${mat[10]}${mat[14]}\n”
      “${mat[3]}${mat[7]}${mat[11]}${mat[15]}\n”);
      mat.delete();
      }
      

      但这是一个非常低级的解决方案,很容易在内存管理和溢出方面产生潜在的bug。

      您还可以使用
      列表上的
      扩展名来创建特定索引的别名

      虽然很难设置互斥别名,但在某些情况下,这可能是一个简单的解决方案

      导入“包:test/test.dart”;
      列表上的扩展坐标{
      V get x=>这个[0];
      V get y=>这个[1];
      V get z=>这个[2];
      }
      void main(){
      测试('按属性访问',(){
      var位置=[5,4,-2];
      预期(位置x,5);
      期望值(位置y,4);
      expect(位置z,-2);
      });
      }
      
      在JavaScript中使用对象不会让我那么烦恼。如果代码对性能至关重要,那么它将得到优化,并且只要对到达那里的所有元素保持相同的结构,它就应该和列表一样高效。关键是让属性访问保持“单态”——即,只有相同结构的对象才能到达该点。即使op将答案标记为已接受,但应注意,此解决方案提供的向量为imutable,wh