2016-08-18 101 views
4

按位与运算的假设我有一个数字的简单列表,像: 使用过滤器

val numbers = List.range(1,10) 

而且我要对其进行过滤,使用&运营商 - 这似乎是工作在最短的解决方案是:

numbers.filter(x => (x & 1) == 0) 

但是我不知道为什么我需要()在这里,或X,但它似乎给我下面的错误,否则(这似乎&是一个问题,但我不知道如何查找它在文档):

// 
// overloaded method value & with alternatives: 
//  (x: Long)Long <and> 
//  (x: Int)Int <and> 
//  (x: Char)Int <and> 
//  (x: Short)Int <and> 
//  (x: Byte)Int 
// cannot be applied to (Boolean) 
// numbers.filter(_ & 1 == 0) 
// 
numbers.filter(_ & 1 == 0) 

也是另一个令人困惑的部分,是%运算工作得很好。

// --- all good 
numbers.filter(_ % 2 == 0) 

// --- error 
// 
// type mismatch; 
//  found : Int 
//  required: Boolean 
// numbers.filter(_ & 1) 
// 
numbers.filter(_ & 1) 

那么,为什么 “X%2 == 0” 的工作, “×& 1 == 0” 失败,因为它们产生类似的结果(我认为)。如果我正确理解错误 - “x & 1”的结果是一个整数。我认为这与&运营商有关,但无法弄清楚我在哪里查找它。

斯卡拉:2.10

预先感谢您的帮助和任何建议。

+0

由于操作者的优先级; '=='比'&'具有更高的优先权,所以'x&1 == 0'表示'x&(1 == 0)'而不是'(x&1)== 0'。 – Jesper

回答

6

运营商%&有不同的优先级。因此_ & 1 == 0会尝试将1与0进行比较,然后对布尔结果执行&

参见Scala Reference - 6.12.3 Infix Operations

优先增加的顺序:

(all letters) 
| 
^ 
& 
= ! 
< > 
: 
+ - 
*/% 
(all other special characters)