【发布时间】:2020-08-06 20:46:19
【问题描述】:
假设我想检查一个字符串是否包含“cory”中的任何个字母:
def hasCory(input: String): Boolean = {
val myName = "cory"
input.exists(myName.contains)
}
编译器抱怨:
error: type mismatch;
found : CharSequence => Boolean
required: Char => Boolean
Scala提供了我想要的Char-accepting方法in StringOps:
但除非我将代码更改为以下之一,否则编译器似乎无法看到此方法:
input.exists(myName.contains(_))
input.exists(c => myName.contains(c))
在原始示例中,它似乎使用了Java String's contains method,它确实确实接受CharSequence:
这是否按预期工作?为什么编译器看不到我想要contains 的Char 版本?
【问题讨论】:
-
String是Char的集合,而不是子String的集合,exists是相应定义的(类型不匹配)。 -
exists的签名是def exists(p: (Char) => Boolean): Boolean,因此您需要向其传递一个接受Char并返回Boolean的方法。这正是 Scala StringOpscontains方法的签名。 -
我想你的意思是
def hasCory(input: String): Boolean = input.contains("cory") -
@KrzysztofAtłasik 不,这将检查名称“cory”是否在字符串
input中。我想检查字符串input是否包含我名字中的任何字母,即c、o、r或y中的任何字符。无论哪种方式,这个问题与其说是关于如何进行特定检查,不如说是关于为什么编译器不会让我这样做,除非我明确声明中间c值。跨度> -
@CoryKlein 你也可以写
input.exists(myName.contains(_))。
标签: scala overloading type-inference implicit-conversion implicit