2016-09-02 4 views
0

У меня есть класс со следующим методом:Почему нет работы с заполнителем?

def message[A <: AnyRef](a: A) = a match { 
    case str: String => messages ++ str 
    case _: AnyRef => serializer.write(_) //compile error 
} 

Я думал _ может быть использован в любой ситуации, мы не хотим, чтобы использовать какой-то конкретный характер. Но

def message[A <: AnyRef](a: A) = a match { 
    case str: String => messages ++ str 
    case a: AnyRef => serializer.write(a) 
} 

отлично работает.

В чем проблема с _? Каков предел его использования в качестве параметров метода?

+1

https://stackoverflow.com/questions/8000903/what-are-all-the-uses-of-an-underscore-in-scala – dveim

ответ

1

Ошибка произошла в serializer.write(_), потому что у компилятора нет таких значений _. Например, если вы напишете List(1, 2, 3) map (_ + 2), это можно было бы расширить до List(1, 2, 3) map (x => x + 2), а тамx может быть скрыт с _.

2

case _: AnyRef => serializer.write(_) эти подстановочные знаки не связаны. Ваш первый _ означает, что вам не важно имя, которое вы только что дали ему. Второй _ означает, что вам все равно, что будет предоставлено write на данный момент, и вы предоставите его позже. _ в вашем коде не связаны, как вы могли подумать.