【问题标题】:How to return nothing from an else block of an IF Condition in scala?如何从scala中的IF条件的else块中不返回任何内容?
【发布时间】:2021-01-09 18:08:30
【问题描述】:

我正在将一个 Java 项目迁移到 Scala 并遇到以下代码:

private void searchClauses( TCustomSqlStatement select ) {
    if ( !searchInClauses.contains( select ) ) {
        searchInClauses.add( select );
    }
    else {
        return;
    }
    if ( select instanceof TSelectSqlStatement ) {
        TSelectSqlStatement statement = (TSelectSqlStatement) select;
        HashMap clauseTable = new HashMap( );


        if ( statement.getWhereClause( ) != null ) {
            clauseTable.put( ( statement.getWhereClause( ).getCondition( ) ),
                    ClauseType.where );
        }

        for ( TExpression expr : (TExpression[]) clauseTable.keySet( ).toArray( new TExpression[0] ) ) {
            ClauseType type = (ClauseType) clauseTable.get( expr );
            searchExpression( expr,
                    select,
                    type == null ? null : type.name( ) );
            searchTables( select );

        }
    }
}

在 IF 条件的 else 块中,之前的开发者只写了return,它甚至没有返回任何东西。如果它没有返回 null,那么只有 return 有什么用? 由于我无法理解该特定行,因此我不明白如何在 Scala 中转换该特定 IF 条件。 谁能告诉我如何在 Scala 中编写相同的块,而不会影响低于第一个 IF-ELSE 条件的代码?

【问题讨论】:

  • 该方法返回void,所以没有(就像Scala中的Unitreturn 只是为了中止方法的执行。
  • 好的,在这种情况下,我怎样才能中断 Scala 中的方法执行,而不是在 Scala 中使用 return 语句?
  • 嗯,Scala 提供了不同的提早返回的方法,包括:使用return (不鼓励但快速且有用),编写自己的 (tail) 递归函数函数,您可以随时中止。使用具有提前返回的高阶函数,例如 forallcollectFirst。或者使用带有短路的 Monad,如 OptionEither。 - 如果不进一步了解代码,很难判断在这种情况下哪一个是最好的。
  • 方法签名声明它返回 void,这与返回 null 不同。 null 是一切的子类型。在您的代码库中,返回的目的是退出函数
  • 这是一个提前退出方法softwareengineering.stackexchange.com/questions/18454/… Scala 支持stackoverflow.com/questions/6915701/… 但最好重写代码以便方法具有唯一的退出点。

标签: java scala short-circuiting


【解决方案1】:

在这种情况下,简单的解决方案是将第二个 if 放入第一个 if 并删除 else 部分。

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 2023-01-24
    • 2022-11-22
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多