Чем отличаются два приведенных ниже утверждения - PullRequest
1 голос
/ 10 ноября 2019
def rankLangs(langs: List[String], rdd: RDD[WikipediaArticle]): List[(String, Int)] = langs.map(lang => (lang, occurrencesOfLang(lang ,rdd))).sortBy(-_._2)
def rankLangs(langs: List[String], rdd: RDD[WikipediaArticle]): List[(String, Int)] = langs.map(_ => (_, occurrencesOfLang(_, rdd))).sortBy(-_._2).reverse

Среда IDE не сообщает об ошибке для первой, но вторая помечается как ошибка. Почему я не смог заменить lang на _?

1 Ответ

3 голосов
/ 10 ноября 2019

Это потому, что во втором вы используете '_' внутри определения передаваемой анонимной функции.

Таким образом,

langs.map(_ => (_ , occurrencesOfLang(_,rdd)))

будет расширяться до чего-то вроде

langs.map(x$1 => (x$2:Any) => (x$2, occurrencesOfLang(x$2,rdd))

, таким образом, вернет List [String => (Any) => (String, Int)] вместо List [(String, Int)]

Это потому, что это эквивалентно написанию

langs.map(x => (_:Any) => (_, occurrencesOfLang(_,rdd))

Как объяснено здесь: Каковы правила подчеркивания для определения анонимной функции?

МногоеБолее понятное объяснение с подходящим примером можно найти здесь: функция передачи scala с подчеркиванием создает функцию, а не значение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...