为什么我不能在方法中混合使用返回值和表达式

舍尔德

为什么要编译以下两段代码:

一种)

impl Rectangle {
    fn can_hold(&self, other : &Rectangle) -> bool{
        if self.width > other.width && self.height > other.height {
            return true;
        }
        return false;
    }
}

B)

impl Rectangle {
    fn can_hold(&self, other : &Rectangle) -> bool{
        if self.width > other.width && self.height > other.height {
            true
        }else{
            false
        }
    }
}

但这不是:

C)

impl Rectangle {
    fn can_hold(&self, other : &Rectangle) -> bool{
        if self.width > other.width && self.height > other.height {
            true
        }
        return false;
    }
}

无法与错误消息一起编译

expected `()`, found `bool`

为什么编译器认为存在()返回类型?

其实我也想知道为什么你不能做这样的事情:

D)

impl Rectangle {
    fn can_hold(&self, other : &Rectangle) -> bool{
        if self.width > other.width && self.height > other.height {
            true
        }
        false
    }
}

因为我认为这可以由编译器完全解析,并且意图很明确(或者不明确?)。为什么不清楚我想返回该表达式的结果。

极好的

(A)之所以起作用,是因为无论是否输入了if块,执行都会遇到一条return语句,语句终止该方法并返回bool方法签名所期望的type值

(B)之所以起作用,是因为只能输入if / else块之一,并且它们都包含一个计算为type的表达式bool因为在if / else之后没有更多的代码可以到达,Rust将把遇到的表达式作为方法的返回值,键入bool方法签名所期望的

在(C)中,您可以trueif块中包含表达式但是,如果方法是在方法内到达的最后一行代码,则该方法仅返回表达式的值。在(C)中,您拥有trueif块,然后调用return false所以锈看到这里面包含行true是不是将要达到的最终线(因为没有什么可以停止执行继续后,如果块)等锈不希望在此行返回类型(因此,预计()类型的表示没有返回类型)。如果要return true在if块内部使用(使您回到(A)模式),那么Rust将知道该方法的执行在此处停止,并且将返回指定的值。

(D)会由于与(C)相同的原因而失败(因为true即使输入了if块,表达式也不是最后执行的行)。

请注意,您不需要ifelse在此示例中,因为编写整个方法的最简单方法是这样的:

impl Rectangle {
    fn can_hold(&self, other : &Rectangle) -> bool{
        self.width > other.width && self.height > other.height
    }
}

现在,该方法中唯一的一行是一个表达式,其计算结果为true或false,而此值就是此方法将返回的值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么void方法不能在jsp中的scriptlet和表达式标签内打印

为什么解构不能在左侧混合声明和表达式

为什么我不能在Xcode 8中使用新的内联#imageLiteral语法?“返回结果中的预期表达式”

为什么不能在表达式中使用...语法?

为什么我不能在case语句java中返回值

为什么我们必须使用赋值表达式来获取await的返回值?

为什么我不能在Java 8 lambda表达式中引发异常?

为什么我不能在命令行的@ARGV中传递正则表达式?

正则表达式:为什么我不能在花括号 {} 内使用捕获组

为什么我不能在 C# 三元表达式中使用 break?

为什么我不能在Tuple.Create中使用lambda表达式?

为什么我们不能在 switch 语句中使用关系表达式?

为什么我的正则表达式不能在JS中使用?

为什么我不能在numpy中使用链表达式?

为什么不能在switch表达式中使用我的枚举类型?

为什么不能在Groovy中内联调用正则表达式匹配器的方法

为什么不能在lambda表达式中使用默认方法?

正则表达式可以在PHP中运行,而不能在Erlang中使用。为什么?

从Lambda表达式中的方法返回值

为什么我的正则表达式可以在RegexPlanet和regex101上运行,但不能在我的代码中运行?

为什么我不能在 sp_addextendedproperty 中使用内联表达式,但我可以使用变量?

为什么我不能在C#中直接表达表达式并直接为null?

为什么我的正则表达式可以在PHP中工作,但不能在JavaScript中工作?

为什么我的正则表达式不能在c ++中工作,但可以在Python中工作?

为什么我不能使用 tidyr 提取和正则表达式拆分此列?

为什么我不能在 python 生成器表达式中使用 `else`(来自 if/else)?

为什么此正则表达式不能在我的Nifi工作流程中使用?

为什么我不能在没有括号的情况下调用lambda表达式?

为什么不能在Coq中用抽象值求值固定定义的表达式?