2012-05-26 2 views
0

Можно создать дубликат:
What are all the uses of an underscore in Scala?Что такое символ подчеркивания, используемый в Scala?

Когда я следую за конкретный учебник, я случайно увидеть, что следующие два обыкновений дает тот же результат. Я понимаю первый, но я не понимаю, почему работает второй. Может ли кто-нибудь дать мне объяснение и в то же время дать резюме использования?

def sum (a:Int, b:Int) = a + b 

val sumAsFunction1 = sum(_:Int, _:Int) 
// I understand this, _ used as placeholder of parameters 

val sumAsFunction2 = sum _ 
// why this usage has the same effect as sumAsFunction1? 
+0

Я согласен, что это дубликат этого вопроса, но ответы ценны новичкам. Можем ли мы каким-то образом объединить эти два вопроса для других новичков? – chen

+0

, хотя этот ответ будет возможен как дубликат (на самом деле, только последний вопрос дублируется), и никаких новых ответов не будет, мы продолжим ответы, уже написанные, поэтому будущие посетители могут просматривать и получать от них –

ответ

1

Это один из немногих мест, где ETA-расширение механизм нуждается в некоторой помощи. Рассмотрим простой пример:

def foo() = { 
    println("foo"); 
    42 
} 

val bar1 = foo 
val bar2 = foo _ 

Существует принципиальная разница между bar1 и bar2. Бывший один интерпретируется как вызов foo и присвоить значение bar в то время как последний: Изменить метод foo в функции и присвоить его bar2. В результате bar1 - это просто переменная Int, а bar2 - это функция, которая вызовет исходный метод foo() (и печать "foo").

1

Подчеркивание используется для многих вещей, но в этой ситуации оно используется для обозначения того, что вы хотите использовать незваную версию функции sum.

Вы определяете sum(a: Int, b:Int) = a + b, поэтому подумайте о sum _ как анонимную функцию, которая принимает два аргумента и возвращает их сумму. Вы можете передать функцию вокруг, так как это экземпляр Function2[Int,Int,Int].

+0

«подумайте о сумме _ как о анонимная функция "- это очень полезно для моего понимания, спасибо. – chen

+0

'sum' не является функцией, это метод. Если бы это была функция, вам не понадобилось бы '_' превращать ее в одну. –

+0

Ahh Я никогда не замечал технической разницы между функцией и методом. Это (http://jim-mcbeath.blogspot.com/2009/05/scala-functions-vs-methods.html) очищает его. – Dylan

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