Jeśli masz zmienną strukturę danych, taką jak Array
, czy można użyć operacji map
lub czegoś podobnego do zmiany jej wartości?Mutowanie zbioru zmiennego za pomocą mapy?
Powiedz, że mam val a = Array(5, 1, 3)
, co najlepiej powiedzieć, odejmując 1 od każdej wartości? Najlepszym Mam wymyślić jest
for(i <- 0 until a.size) { a(i) = a(i) - 1 }
Przypuszczam sposobem byłoby zrobić tablicę var
zamiast val
więc mogę powiedzieć
a = a map (_-1)
edit: dość łatwo toczyć własną rękę, jeśli nic wbudowany, choć nie wiem, w jaki sposób uogólnić do innych modyfikowalnych kolekcjach
scala> implicit def ArrayToMutator[T](a: Array[T]) = new {
| def mutate(f: T => T) = a.indices.foreach {i => a(i) = f(a(i))}
| }
ArrayToMutator: [T](a: Array[T])java.lang.Object{def mutate(f: (T) => T): Unit}
scala> val a = Array(5, 1, 3)
a: Array[Int] = Array(5, 1, 3)
scala> a mutate (_-1)
scala> a
res16: Array[Int] = Array(4, 0, 2)
Cool, Myślałem, że coś musi być. Wszelkich pomysłów na porównywalną efektywność między tym, sapiąc biblioteki, jak w pytaniu, lub przy użyciu normalnej funkcji? –
@ Luigi Plinge - Jeśli specjalizujesz się w swojej wersji i używasz typów pierwotnych, twoja będzie szybsza (chyba, że trafisz na błąd specjalizacji, którego jest kilka). W przeciwnym razie biblioteka jest równie szybka jak Ty. –