2016-06-10 19 views
3

我有这段代码在科特林(我开始学习)工作:“模式匹配”不适合诠释条款(分公司)

package io.shido.learning 

import java.time.Instant 

fun typeCheck(any: Any): Any = when (any) { 
    (any is Int && any < 10) -> "(small) integer" 
    is Int -> "integer" 
    is Double -> "double" 
    is String -> "string" 
    else -> "another Any" 
} 

fun main(args: Array<String>) { 
    println("type check for: 5 (${typeCheck(5)})") 
    println("type check for: 20 (${typeCheck(20)})") 
    println("type check for: 56.0 (${typeCheck(56.0)})") 
    println("type check for: \"a string\" (${typeCheck("a string")})") 
    println("type check for: Instant (${typeCheck(Instant.now())})") 
} 

...所以我期待的是typeCheck(5)返回(small) integer而不是像目前那样integer

有没有人有任何见解?第一个分支是true,实际上是5

enter image description here

回答

7

当传递参数,when检查参数在分支相匹配的值,和在第一分支计算true 5个不匹配。因此,基本上可以解决你的代码是这样的:

fun typeCheck(any: Any): Any = when { 
    (any is Int && any < 10) -> "(small) integer" 
    any is Int -> "integer" 
    any is Double -> "double" 
    any is String -> "string" 
    else -> "another Any" 
} 

fun typeCheck(any: Any): Any = when (any) { 
    in 0..10 -> "(small) integer" 
    is Int -> "integer" 
    is Double -> "double" 
    is String -> "string" 
    else -> "another Any" 
} 

When Expression

+0

我使用IDEA,当我计算表达式'(任何数据类型为int &&任何<10 )''''它是'true';另一方面,如果我从'when'表达式中删除'any',它就可以工作,但是我必须在分支中每一次都重复'any''(这是我试图通过使用'when )')。 –

+0

......它变得更“有趣”;如果我只是在你的第一个解决方案中添加“when(any)”时......没有任何作用说它是另一个任何*任何*值!所以它看起来像'any'参数和'when'中的'any'是“不一样的”......这不可能是真的。 –

+1

当然'(任何是Int &&任何<10)''5'是'true',但'true'与'5'不匹配,所以第一个分支不会评估。 – IRus