Scala中Option[String]的contains方法行为不符合预期?
为什么
Some("test this").contains("test")返回false? Scala 里 Option 的 contains 方法逻辑和你预期的不同——它不会调用包装对象的 contains,而是直接判断内部元素是否与传入参数完全相等。
- 执行
Some("test this").contains("test this")时,内部字符串和传入参数完全匹配,所以返回true。 - 而
Some("test this").contains("test")中,"test this" 和 "test" 并不相等,因此返回false。
如果要让包装的字符串执行自身的包含判断,需要先解包 Option,比如:
// 安全方式:即使是None也不会报错,返回false Some("test this").exists(_.contains("test")) // 不推荐:None时会抛出异常 Some("test this").get.contains("test")
关于代码可读性的歧义问题
对于 person.name.contains("Roger"):
- 若
name是String类型,调用的是 String 的contains,含义是字符串包含"Roger"。 - 若
name是Option[String]类型,调用的是 Option 的contains,含义是内部字符串等于"Roger"。
这种歧义容易造成误解,推荐两种解决方式:
- 明确表达逻辑:用
exists替代contains实现包含判断,比如person.name.exists(_.contains("Roger"))。 - 命名区分:给 Option 类型的字段加前缀,比如
optName,让读者一眼识别类型,避免混淆。
内容的提问来源于stack exchange,提问作者yi1
相关产品推荐
相关产品推荐

