2015-01-05 11 views
2

Что мне нравится в Scala, так это то, что я часто обнаруживаю новые синтаксисы, просто пытаясь понять, что кажется мне интуитивным. Например, я должен декодировать текст, где каждый символ был заменен на другой символ, так что я сделал, как в этом упрощенном примере:Передача объекта карты в качестве параметра метода карты итерации

val map = Map[Char,Char]('h' -> 'd', 'e' -> 'l', 'l' -> 'o', 'w' -> 'r', 'o' -> 'h', 'r' -> 'd', 'd' -> 'e') 
println("hello world".split("\\s+").map(word => word.map(map).mkString).mkString(" ")) 

и она прекрасно работает. Я просмотрел документацию Array.map, чтобы узнать, как это делается (я был exepcting, чтобы увидеть какое-то неявное преобразование или что-то в этом роде), но я ничего не нашел. Может кто-нибудь объяснить мне, как можно передать Map в качестве параметра вместо функции?

+0

что такое 'символыКарта'? – Dima

+0

@Dima Я отредактировал, чтобы сделать его более ясным. Это карта, которая сопоставляет каждый возможный символ соответствующему декодированному символу – Dici

+0

'Карта [Char, Char]', как вы можете видеть в редактировании. – Dici

ответ

4

В scala карта фактически расширяет Function1 (через родителя MapLike). Карта [A, B] на самом деле является функцией 1 [A, B]. Аналогично, List [A] - это функция 1 [Int, A], а Set [A] - это функция 1 [A, Boolean], и они могут действовать как функции.

scala> val m : Int => String = Map(1 -> "a", 2 -> "b") 
m: Int => String = Map(1 -> a, 2 -> b) 

scala> m(1) 
res0: String = a 
+0

Это было довольно просто, я должен был найти сам! В любом случае, спасибо Диме и вам – Dici

3

Ну, если вы посмотрите на Docs, вы можете увидеть, что на самом деле Map расширяет Function1, и это apply метода определяется интуитивно, чтобы вернуть значение преобразованного ключа. Таким образом, foo.map(map) эквивалентно foo.map(bar => map(bar))

Смежные вопросы