对于dart来说,以下面的代码为例,//void函数不能工作,int/string函数要么返回被打印的空值,要么返回自动打印的值,就像在输出中看到的那样。
class Microphones{
String? name;
String? color;
int? model;
String printEverything(){
print(name);
return " ";
}
int? printint(){
print(model);
}
}
void main() {
var mic1=Microphones();
print(mic1.name);
mic1.name="Yeti";
mic1.color="black";
mic1.model=26;
print(mic1.name);
print(mic1.color);
print(mic1.model);
print(mic1.printEverything());
print(mic1.printint());
}
output:
null
Yeti
black
26
Yeti
26
null我非常感谢你在这方面的答复/帮助。
发布于 2021-10-21 08:34:42
默认情况下,Dart中的所有方法都不返回null (指定返回void的方法中有一个空的return,或者在返回void的方法中根本没有任何return,或者像int?这样的可空类型)。
但是方法签名中的返回类型指定了方法的调用方应该如何查看该值。这里有void,在Dart语言之旅中描述为:
表示从未使用过的值的特殊类型。
https://dart.dev/guides/language/language-tour#a-basic-dart-program
因此,我们指定void向方法的用户发送信号,表示不应该使用返回的值。然后,Dart分析器和编译器将非常努力地确保您不会使用返回的值类型的void。
为好奇的人提供高级部分
但这并不意味着不可能使用方法签名指定为void的返回值:
void someMethod() {
void someVoidVariable = 'Hey, I am a String!';
return someVoidVariable;
}
void someOtherMethod() => 'Hey, I am also a String!';
void main() {
print(someMethod() as String); // Hey, I am a String!
print(someOtherMethod() as String); // Hey, I am also a String!
}在第一个示例中,我们强制Dart将我们的String视为void。这是完全正确的,因为所有类型都可以看作是void。然后,我们可以返回这个void值,因为someMethod()应该返回void。
造成这种强迫的原因是,Dart会抱怨(这很有道理,因为我们正在做的事情非常愚蠢,不应该出现在真正的程序中):
void someMethod() {
return 'Hey, I am a String!';
// ERROR: A value of type 'String' can't be returned from the function
// 'someMethod' because it has a return type of 'void'.
}或者这一点,因为我们不能使用void转换为as
void someMethod() {
return 'Hey, I am a String!' as void; // ERROR: Expected a type name.
}然后,我们将该void转换回一个String,让Dart允许我们在print()中使用返回的值(否则Dart将阻止我们尝试使用void类型化的值)。
在第二个例子中,我展示了事物如此运转的原因之一。在Dart中,我们可以编写这两个方法,它们将执行完全相同的操作(注意,对于本例,我将返回类型更改为String ):
String someOtherMethod() {
return 'Hey, I am also a String!';
}
String someOtherMethod() => 'Hey, I am also a String!';因此,第二种方法是简写,如果我们只想执行一条语句并返回它的值。
但是,关于:
void someOtherMethod() => 'Hey, I am also a String!';如果我们遵循传统的规则,这是不允许的,因为我们不能返回一个String,因为我们输入了void。但是有时,我们也希望使用这个简单的语法来执行一个方法,而不想关心这个方法最终会返回什么。
例如:
final someList = <String>[];
void removeStringFromList(String string) => someList.remove(string);其中,List上的List方法实际上返回一个bool,该bool指示元素是否在列表中。
因此,当我们使用=>时,Dart会忽略这个问题,只需将结果转换为void。因此,在我们的最后一个示例中,返回的bool实际上返回给了removeStringFromList的调用方,但是由于它的类型已经转换为void,所以removeStringFromList的调用方被阻止(在很多方面)使用该值。
https://stackoverflow.com/questions/69649482
复制相似问题