2016-06-10 39 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