这段代码对 Scala 有一些误解。第一个需要解决的是:
def any(check: Set[Any], expr: Boolean): Boolean = {
var checked = check.filter(_ => expr)
if (checked == Set())
return false
else
return true
}
any(Set(3, 4, 5, 6), _ > 5)
首先,expr
是一个Boolean
。ABoolean
要么是要么true
-false
它不能是其他任何东西。另一方面,expr
来自“表达式”,我认为这是必须评估的一些公式。因此,expr
并且Boolean
不太可能匹配,一些概念问题正在发生的第一个线索。
_ > 5
现在,您作为expr
参数传递,但_ > 5
既不是true
也不是false
。10 > 5
会是真的,3 > 5
会是假的,但是_ > 5
是一个函数,而一个函数不是一个 Boolean
.
让我们考虑下划线...的_ > 5
意思(x) => x > 5
。_ > _
的意思(x, y) => x > y
,以此类推。如果你不太理解下划线,请不要使用它。请改用完整的语法。稍后您将获得理解,无需减慢您的学习速度。
现在,我提出这个是因为另一个概念问题,那就是:
_ => expr
这或多或少等价于z => expr
,即完全忽略它收到的参数的函数。请注意,这里下划线的含义与上面不同。事实上,在这个答案中,我曾经计算过下划线的 11 种不同含义。在理解它们之前避免使用下划线的另一个原因。
因此,您的代码的问题在于:
- 您正在收到一个
Boolean
您想要的Function1[Any, Boolean]
.
- 在计算是否应该过滤它时,您忽略了被过滤的元素(我假设因为这是唯一编译的语法,因为 1)。
- 您正在传递一个预期为
Boolean
.
现在,即使您修复了 1 和 2 ,代码也不会工作,因为_ > 6
它不是有效的Function1[Any, Boolean]
,因为Any
没有实现>
.
我怀疑您来自动态语言背景,并Any
用作快速“后备”,不必告诉您正在处理的事物的类型。不要这样做——使用Any
不会让事情变得更容易,只会让事情变得更难。
还有其他两个答案显示了如何正确编写该方法,我将把细节交给他们。我只是想解决一般问题,看看我是否不能指导您将来避免此类问题。