Flutter Dart:开发人员必须面对的挑战与常见问题解析

发表时间: 2024-12-17 10:52

我们一起讨论一些有趣的 Dart 问题,每个人在面试之前都应该知道这些问题。

这些问题至关重要,因为它们构成了您正在学习的任何语言的基础。

我们将从第一个问题开始。

  1. 分析以下程序的输出。
void main() {  int x = 1;  fun(x);  print(x);}void fun(int x){  x++;}

答案是输出是 1,分析错的人,不要担心,我们来看下一个,我们将一起讨论这两个问题。

  1. 分析以下程序的输出。
void main() {  List<int> arr = [1,2,3,4,5];  fun1(arr);  print(arr);}void fun(List arrayCopy){  arrayCopy.add(6);}

所以如果你认为输出是

[1,2,3,4,5]

那么你可能忽略了 Dart 中的一个关键概念。那么,这个输出到底有什么问题呢?根据问题 1 的规则,输出应该与之前一致,因为唯一的区别在于,问题 1 使用了 int 类型,而问题 2 使用了 List 类型。

但是输出是 -

[1,2,3,4,5,6]

因此,输出结果的关键在于原始数据结构与非原始数据结构之间的差异。

如果此时你恍然大悟,可能会想“我怎么没有想到呢?”那么接下来有一个奖励问题等着你。对于其他人,请继续关注,我们将逐步讨论这些问题的解决方案。

原始数据结构

原始数据结构是 Dart 中的基础数据类型,它们非常简单,直接表示存储在内存中的单一值。以下是一些常见的例子:

  • int:用于表示整数值,如 1 或 42。
  • double:用于表示浮点数,如 3.14 或 2.718。
  • bool:用于表示布尔值,即 true 或 false。
  • String:用于表示字符串,如 "Hello, World!"。

非原始数据结构

非原始数据结构通常比原始数据结构更复杂,Dart 并没有直接将它们作为基本数据类型提供。它们通常由多个原始数据类型的集合或更为复杂的数据结构组成。常见的非原始数据结构包括:

  • 列表(List):一个有序的元素集合,如 [1, 2, 3]。
  • 集合(Set):一个无序且不重复的元素集合,如 {1, 2, 3}。
  • 映射(Map):由键值对组成的集合,如 {'key1': 'value1', 'key2': 'value2'}。

其关键区别在于:

原始数据类型的值直接存储在变量的内存地址中,而非原始数据类型则存储了指向实际数据的引用。

因此,原始数据结构通过值传递,而非原始数据结构通过引用传递

问题 1 中,输出为 1,因为它涉及一个原始数据类型,该类型在函数中是通过值传递的。结果,创建了一个新的变量并将其传递给函数,只修改了这个新变量的值,原始值没有发生变化。

问题 2 中,输出为 [1, 2, 3, 4, 5, 6],因为它涉及一个非原始数据类型,这个数据结构在函数中是通过引用传递的。这样,函数接收的是同一个变量的引用,因此修改会影响原始变量的值。

再来一个

void main() {  List<int> arr = [1,2,3,4,5];  fun1(arr);  print(arr);}void fun(List<int> arrayCopy){  List<int> arr =  [...arrayCopy];  arr.add(6);}

首先想一想。输出是 [1, 2, 3, 4, 5] 提示 - 考虑扩展运算符的效果。如果您想了解有关扩展运算符的更多信息,请告诉我。