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:$