2017-01-05 3 views
3

В коде ниже, какова классификация (или техническое имя) использования символа подчеркивания?Каково использование _ в Int => Int = _ + 1

scala> def f: Int => Int = _ + 1 
f: Int => Int 

scala> f(2) 
res0: Int = 3 
+2

местозаполнителем. См. Http://stackoverflow.com/questions/8000903/what-are-all-the-uses-of-an-underscore-in-scala – YoungSpice

ответ

10

От Functional Programming in Scala

... иногда называют подчеркивание синтаксиса для функции буквального, мы даже не потрудившись назвать аргумент функции, используя _ представляют единственный аргумент. При использовании этого обозначения, мы можем только ссылаться на параметре функции один раз в теле функции (если мы снова упомянуть _, это относится к другому аргументу функции)

В вашем случае делать:

def f: Int => Int = _ + 1 

бы то же самое, как это:

def f: Int => Int = x => x + 1 

, который может показаться излишним, но становится очень удобно для передачи анонимных функций выше упорядоченные функции (которые являются функциями, которые принимают функции в качестве аргументов):

def higherOrder(f: Int => Int) = { /* some implementation */ } 

// Using your function you declared already 
higherOrder(f) 

// Passing an anonymous function 
higherOrder((x: Int) => x + 1) 
higherOrder((x) => x + 1) 
higherOrder(x => x + 1) 

// Passing an anonymous function with underscore syntax 
higherOrder(_ + 1) 
0

Думай о нем, как на вход, который будет поставляться по вызывающему

scala> def incrementByOne: Int => Int = _ + 1 
incrementByOne: Int => Int 

Что йо получить обратно функция, которая принимает Int и возвращает Int.

X => Y 

В обратном типа обозначает функцию, которые принимают тип X в качестве входного и возвратного типа Y в качестве выхода. теперь X и Y могут быть любые типы.

Чтобы завершить пример, вы могли бы назвать его как

scala> incrementByOne(10) 
res0: Int = 11 

scala> incrementByOne(99) 
res1: Int = 100 

scala> 

который принял Int в качестве входных данных (10 и 99) и возвращенного Int в качестве выходного сигнала (11 и 100)

+0

благодарит за разъяснения. Я искал синтаксическое «имя», когда подчеркивание используется таким образом в анонимной функции. Из ссылки, указанной в 1-м посте. [Что все используются для подчеркивания в Scala?] (Http://stackoverflow.com/questions/8000903/what-are-all-the-uses-of-an-underscore-in-scala). Он называется «Синтаксис заполнителя». Не очень интуитивно, но это нормально, пока есть имя. – Polymerase

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