dart中有类似结构的东西吗?
在javascript中,它总是困扰着我人们使用对象作为向量,比如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
{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