#scala
#scala
Вопрос:
Следующий код может быть скомпилирован
def isEven(a:Int)=
if (a%2==0) true else false
def main(args: Array[String]) {
List(1, 10) filter isEven foreach println
но если я изменю на следующее (Список (1,10) —> Список (с 1 по 10))
def isEven(a:Int)=
if (a%2==0) true else false
def main(args: Array[String]) {
List(1 to 10) filter isEven foreach println
}
В чем разница между List (1,10) и List (от 1 до 10)?
Комментарии:
1. Небольшое примечание: isEven (a) возвращает true, если (a%2==0) имеет значение true, и false, если оно равно false, поэтому оно эффективно возвращает (a % 2 == 0) — ничего более. И что насчет
println ((1 to 10) filter isEven)
?2. @user Я уже наполовину готов отказаться от голосования по этому вопросу только по этой строке кода. 🙂
Ответ №1:
List(1, 2)
это просто список с двумя Int
элементами: 1 и 2. Выражение 1 to 10
создает Range
экземпляр, поэтому List(1 to 10)
представляет собой список с одним элементом: a Range
.
Ответ №2:
List(1, 10)
является a, List[Int]
тогда List(1 to 10)
как List[Range]
является a,,. Обратите внимание на типы в следующем сеансе REPL:
scala> 1 to 10
res3: scala.collection.immutable.Range.Inclusive with scala.collection.immutable.Range.ByOne = Range(1, 2, 3, 4, 5, 6, 7
, 8, 9, 10)
scala> List(1 to 10)
res4: List[scala.collection.immutable.Range.Inclusive with scala.collection.immutable.Range.ByOne] = List(Range(1, 2, 3,
4, 5, 6, 7, 8, 9, 10))
scala> List(1, 10)
res5: List[Int] = List(1, 10)
Ответ №3:
missingfaktor прав, так что это всего лишь дополнение.
Если вам нужен a List[Int]
с числами от 1 до 10, вы можете написать
List(1 to 10:_*)
или
1 to 10 toList