首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数不打印,因为不能返回值,但是当我创建字符串或int函数时,它会自动打印null或返回值。

函数不打印,因为不能返回值,但是当我创建字符串或int函数时,它会自动打印null或返回值。
EN

Stack Overflow用户
提问于 2021-10-20 16:06:48
回答 1查看 452关注 0票数 0

对于dart来说,以下面的代码为例,//void函数不能工作,int/string函数要么返回被打印的空值,要么返回自动打印的值,就像在输出中看到的那样。

代码语言:javascript
复制
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

我非常感谢你在这方面的答复/帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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的返回值:

代码语言:javascript
复制
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会抱怨(这很有道理,因为我们正在做的事情非常愚蠢,不应该出现在真正的程序中):

代码语言:javascript
复制
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

代码语言:javascript
复制
void someMethod() {
  return 'Hey, I am a String!' as void; // ERROR: Expected a type name.
}

然后,我们将该void转换回一个String,让Dart允许我们在print()中使用返回的值(否则Dart将阻止我们尝试使用void类型化的值)。

在第二个例子中,我展示了事物如此运转的原因之一。在Dart中,我们可以编写这两个方法,它们将执行完全相同的操作(注意,对于本例,我将返回类型更改为String ):

代码语言:javascript
复制
String someOtherMethod() {
  return 'Hey, I am also a String!';
}

String someOtherMethod() => 'Hey, I am also a String!';

因此,第二种方法是简写,如果我们只想执行一条语句并返回它的值。

但是,关于:

代码语言:javascript
复制
void someOtherMethod() => 'Hey, I am also a String!';

如果我们遵循传统的规则,这是不允许的,因为我们不能返回一个String,因为我们输入了void。但是有时,我们也希望使用这个简单的语法来执行一个方法,而不想关心这个方法最终会返回什么。

例如:

代码语言:javascript
复制
final someList = <String>[];
void removeStringFromList(String string) => someList.remove(string);

其中,List上的List方法实际上返回一个bool,该bool指示元素是否在列表中。

因此,当我们使用=>时,Dart会忽略这个问题,只需将结果转换为void。因此,在我们的最后一个示例中,返回的bool实际上返回给了removeStringFromList的调用方,但是由于它的类型已经转换为void,所以removeStringFromList的调用方被阻止(在很多方面)使用该值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69649482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档