Dictionary 在Dart中传递指向地图的指针
假设我有这个班:Dictionary 在Dart中传递指向地图的指针,dictionary,pointers,dart,Dictionary,Pointers,Dart,假设我有这个班: A类{ INTA; int b; INTC; 地图(Map),; A(this.A,this.b,this.c):\u map={'A':A,'b':b,'c':c}; 运算符[](字符串k)=>_映射[k]; 运算符[]=(字符串k,int v){ 如果(_map.containsKey(k)){ _map[k]=v; }否则{ 抛出异常(); } } @凌驾 字符串toString(){ 返回super.toString()+'a:$a,b:$b,c:$c,map:${u
A类{
INTA;
int b;
INTC;
地图(Map),;
A(this.A,this.b,this.c):\u map={'A':A,'b':b,'c':c};
运算符[](字符串k)=>_映射[k];
运算符[]=(字符串k,int v){
如果(_map.containsKey(k)){
_map[k]=v;
}否则{
抛出异常();
}
}
@凌驾
字符串toString(){
返回super.toString()+'a:$a,b:$b,c:$c,map:${u map.toString()}';
}
}
我希望能够通过myObj.a
或myObj['a']
访问其属性(类似于JavaScript中的操作方式)。当读取属性时,我的代码工作正常(因此此解决方案非常适合不可变类),但当我尝试设置新值时,我没有得到预期的结果:
void main(){
A=A(1,2,3);
a['a']=4;
a、 b=5;
print(a);//prints:a的实例a:1,b:5,c:3,map:{a:4,b:2,c:3}
}//应为:A'A:4,b:5,c:3的实例,映射:{A:4,b:5,c:3}
现在,我知道错误在构造函数中,但我不知道如何将a
、b
和c
的引用分配给映射,而不是复制它们的值
是否可以将这些属性的指针传递到
\u map
,这样我就可以通过myObj.a=x
或myObj['a']=x
来更新这些值?好吧,我不会评论为什么需要这样的实现:)
但问题在于[]=operator:您只是在更新映射,而不是对象的字段。同时,在toString()中,您正在访问字段,而不是映射值
您可以做的是更新[]=运算符中的字段。但我想最好是只在一个地方有数据,而不是在两个地方都有:地图和字段。所以我只需要重写字段的getter和setter来访问map中的数据。好吧,我不会评论为什么需要这样的实现:) 但问题在于[]=operator:您只是在更新映射,而不是对象的字段。同时,在toString()中,您正在访问字段,而不是映射值
您可以做的是更新[]=运算符中的字段。但我想最好是只在一个地方有数据,而不是在两个地方都有:地图和字段。因此,我只需要覆盖字段的getter和setter来访问map中的数据。您将希望
a的值有一个单一的真值点。使用地图可能是最简单的。
这意味着a
getter和setter应该访问映射,而不是不相关的字段
可能是这样的:
A类{
地图(Map),;
A(inta,intb,intc):_map={'A':A,'b':b,'c':c};
int/*?*/运算符[](字符串k)=>\u映射[k];
运算符[]=(字符串k,int v){
如果(_map.containsKey(k)){
_map[k]=v;
}否则{
抛出UnsupportderRor(“没有名为$k的变量”);
}
}
int get a=>_map[“a”]/*!*/;
设置一个(int值)=>\u map[“a”]=值;
int get b=>_map[“b”]/*!*/;
设置b(int值)=>\u map[“b”]=值;
int get c=>_map[“c”]/*!*/;
设置c(int值)=>_map[“c”]=值;
@凌驾
字符串toString(){
返回super.toString()+'a:$a,b:$b,c:$c,map:${u map.toString()}';
}
}
您需要对a
/[“a”]
的值有一个单一的真理点。使用地图可能是最简单的。
这意味着a
getter和setter应该访问映射,而不是不相关的字段
可能是这样的:
A类{
地图(Map),;
A(inta,intb,intc):_map={'A':A,'b':b,'c':c};
int/*?*/运算符[](字符串k)=>\u映射[k];
运算符[]=(字符串k,int v){
如果(_map.containsKey(k)){
_map[k]=v;
}否则{
抛出UnsupportderRor(“没有名为$k的变量”);
}
}
int get a=>_map[“a”]/*!*/;
设置一个(int值)=>\u map[“a”]=值;
int get b=>_map[“b”]/*!*/;
设置b(int值)=>\u map[“b”]=值;
int get c=>_map[“c”]/*!*/;
设置c(int值)=>_map[“c”]=值;
@凌驾
字符串toString(){
返回super.toString()+'a:$a,b:$b,c:$c,map:${u map.toString()}';
}
}
首先,让我谈谈一件事。如果能够交替使用属性引用和索引器来访问Dart中对象的属性,则无法获得类似Javascript的行为。这在Javascript中起作用的唯一原因是Javascript中的每个对象本身都是一个排序的哈希映射,因此无论如何属性引用都可以有效地转换为映射索引器。要在Dart中实现这一点,您需要定义某种“一网打尽”的getter,它可以动态地将属性引用转换为索引操作,而Dart中不存在这种功能(我认为也不应该)
现在,就您的特定代码而言,它不起作用,因为在setter索引器中,您正在更新映射中的值,但在toString
方法中,您打印字段的值。为了获得预期的结果,还需要更新字段。事实上,根本没有理由有一个底层映射——只需直接对字段进行操作即可
当然,这种方法的问题是,您需要在索引器中为类中的每个字段提供映射,因为正如我前面提到的,Dart中没有办法动态地将字符串转换为属性引用*
A类{
INTA;
int b;
INTC;
A(这个A,这个b,这个c);
运算符[](字符串k){
开关(k){
案例“a”:返回a;
案例“b”:返回b;
案例“c”:返回c;
}
抛出ArgumentError('Property name$k不存在');
}
运算符[]=(字符串k,int v){
开关(k){
案例“a”:a=v;返回;
案例“b”:b=v;返回;
案例“c”:c=v;返回;
}
抛出ArgumentError('Property name$k不存在');
}
@凌驾
字符串toString(){
返回super.toString()+'a:$a,b:$b,c:$