代码之家  ›  专栏  ›  技术社区  ›  Mike

为什么这个Scala行返回一个单位?

  •  7
  • Mike  · 技术社区  · 14 年前

    object Sample {
    
        def main(args : Array[String]) {
            val answer = (1 until 10).foldLeft(0) ((result, current) => {
                if ((current % 3 == 0) || (current % 5 == 0)) {
                    result + current
                }
            })
    
            println(answer)
        }
    
    }
    
    4 回复  |  直到 14 年前
        1
  •  11
  •   Ben Jackson    14 年前

    if表达式具有单位类型,因为没有else子句。因此,有时它什么也不返回(Unit),所以整个表达式都有类型Unit。

    (我想你是想问为什么它不返回Int,而不是Boolean)

        2
  •  9
  •   Landei    14 年前

    习惯用语?是的,我们可以!

    Set(3,5).map(k => Set(0 until n by k:_*)).flatten.sum
    

    丹尼尔的建议看起来更好:

    Set(3,5).flatMap(k => 0 until n by k).sum
    
        3
  •  8
  •   pedrofurla    14 年前

    scala> val answer = (1 until 10) filter( current => (current % 3 == 0) || (current % 5 == 0)) sum
    answer: Int = 23
    

    注意过滤器而不是if。

    另一个更习惯用法的Scala:

    ( for( x <- 1 until 10 if x % 3 == 0 || x % 5 == 0 ) yield x ) sum
    
        4
  •  4
  •   Daniel C. Sobral    14 年前

    object Euler {
        def main(args : Array[String]) {
            val answer = (1 until 10).foldLeft(0) ((result, current) =>
                if ((current % 3 == 0) || (current % 5 == 0))
                    result + current
                else
                    result
            )
    
            println(answer)
        }
    }