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,我想通过引用传递一个原语(int,bool,…)。我在这里找到了关于它的讨论(段落“通过引用传递值类型”),但我仍然想知道是否有一种方法可以在Dart中实现它(除了使用对象包装器)?任何开发?不,包装是唯一的方法。它们是通过引用传递的。这并不重要,因为“基元”类型没有更改其内部值的方法 如果我错了,请纠正我,但也许你误解了“通过引用传递”的含义?我假设您希望执行类似于param1=10的操作,并希望从方法返回时此值仍为10。但引用不是指针。当您为参数分配一个新值(with=operator)时,

我想通过引用传递一个原语(int,bool,…)。我在这里找到了关于它的讨论(段落“通过引用传递值类型”),但我仍然想知道是否有一种方法可以在Dart中实现它(除了使用对象包装器)?任何开发?

不,包装是唯一的方法。

它们是通过引用传递的。这并不重要,因为“基元”类型没有更改其内部值的方法

如果我错了,请纠正我,但也许你误解了“通过引用传递”的含义?我假设您希望执行类似于
param1=10
的操作,并希望从方法返回时此值仍为
10
。但引用不是指针。当您为参数分配一个新值(with=operator)时,此更改不会反映在调用方法中。对于非基本类型(类),仍然是这样

例如:

类测试{
int-val;
测试(this.val);
}
void main(){
试验t=新试验(1);
fn1(t);
打印(t.val);//2
fn2(t);
print(t.val);//仍然是2,因为在fn2()中为“t”分配了一个新实例
}
空隙fn1(试验t){
打印(t.val);//1
t、 val=2;
}
孔隙fn2(试验t){
t=新试验(10);
打印(t.val);//10
}
编辑
根据评论,我试图让我的答案更清楚,但不知何故,我似乎无法在不引起更多混乱的情况下正确表达。基本上,当来自Java的人说“参数是通过引用传递的”时,他们的意思是C/C++开发人员所说的“参数是作为指针传递的”。

Dart语言不支持这一点,我怀疑它永远不会支持,但未来会告诉我们

原语将按值传递,如前所述,“按引用传递原语”的唯一方法是将它们包装为:

类原语包装器{ var值; 原语包装器(this.value); } void alter(原始包装数据){ data.value++; } main(){ var数据=新的原始包装(5); 打印(data.value);//5 更改(数据); 打印(data.value);//6 } 如果你不想这样做,那么你需要找到另一种解决问题的方法

我看到人们需要通过引用进行传递的一种情况是,他们有某种希望传递给类中函数的值:

class-Foo{
void doFoo(){
var i=0;
...
doBar(i);//我们想改变doBar()中的i。
...
i++;
}
无效多巴(一){
i++;
}
}

在本例中,您可以将
i
改为类成员。

由于dart被编译成JavaScript,我尝试了一些适用于JS的方法,猜猜看!?它对dart有效

基本上,你能做的就是把你的值放在一个对象内,然后对这个函数内的字段值所做的任何更改都会改变这个函数外的值

代码(您可以在上运行此操作)

输出

Before passing: false
After passing: true

我很好奇,你的用例是什么?你为什么要这样做?很抱歉,我不理解你的评论。我只是想理解提问者的意图。我对有人需要它并不感到惊讶(好奇)。此外,我并不奇怪Dart语言中缺少这种语言。这是有用的,但不是关键性的。@mezoni理解为什么有人想做某件事,就可以提出实现同样效果的替代方法。@ShailenTuli我也很好奇。我用了一个包装器,事情就完成了,但我想知道Dart团队是否有计划让我们决定何时需要副本或引用,无论我们使用对象还是原语。@mezoni:你的定义不正是“通过引用传递”的意思吗?如果参数是按值传递的,那么我的示例中的fn1()将不会像它那样工作,是吗?我的观点是Dart中没有任何真正的基元类型。num、int、double、bool—这些都是对象,当作为参数传递时,它们的行为与“复杂”类相同。而且,我认为我们都是指同一件事,只是命名不同而已。“通过引用传递”是指对对象的引用被传递,并且在函数返回后,对象成员的更改仍然保留。我们现在意见一致了吗?:)如果有人知道我如何在我的答案中更清楚地表达这一点,请随意编辑,因为我真的不知道该如何表达这一点-/@梅佐尼啊,现在我明白了。我使用的是Java术语,例如,“通过引用传递”的含义与C/C++中的含义不同。如果我能想出一种不让答案变得更加混乱的方法,我将编辑我的答案以反映这种差异-SI认为“按副本/值传递”的意思是“发送副本,不能修改原件”,而“按引用传递”的意思是“发送对象/地址本身,可以修改”。您的包装不是泛型的,但语言允许这种改进。如果您喜欢泛型,请务必继续。我相信这是解释这一点最简单的方法你的答案-Dart语言不支持这一点,我怀疑它永远不会支持。什么问题?这可以在Dart和Dart2JS中实现此功能。可以实现和构造许多建议的功能,以便有效地编译到Javascript中。问题在于Dart团队专注于修复bug和web客户端改进。我认为这将在未来实施。我没有发现阻止这种情况发生的问题。我认为你的工作离编译器设计还远吗?我是对的?我从没说过有问题<代码>我怀疑表示我怀疑功能是否到达。这仅仅是一个观点,我是根据我迄今为止在Dart世界中所听到和看到的情况而提出的。Dart有特定的目标群体和特定的用例。该功能可能会在将来出现,也可能不会出现,因此推测是毫无意义的。这就像推测天气一样,可以定义类型的差异。我怀疑这是不可能的,但我不知道
Before passing: false
After passing: true