Два способа определения функций в Scala. В чем разница?

Вот небольшой сеанс Scala, в котором определяются и опробуются некоторые функции:

scala> def test1(str: String) = str + str;    
test1: (str: String)java.lang.String

scala> test1("ab")
res0: java.lang.String = abab

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

scala> val test2 = test1
<console>:6: error: missing arguments for method test1 in object $iw;
follow this method with `_' if you want to treat it as a partially applied function
       val test2 = test1
                   ^

ой.

scala> val test2 = test1 _
test2: (String) => java.lang.String = <function1>

scala> test2("ab")
res1: java.lang.String = abab

работает хорошо!

Теперь я видел синтаксис _ при сворачивании ( _ + _ и т. Д.). Насколько я понимаю, _ в основном означает «аргумент». Итак, test1 _ в основном означает функцию с аргументом, который передается в test1 ". Но почему это не совсем то же самое, что просто test1 ? Почему есть разница, если я добавляю _ ?

Итак, я продолжал исследовать ...

scala> val test3 = (str: String) => str + str
test3: (String) => java.lang.String = <function1>

scala> test3("ab")
res2: java.lang.String = abab

scala> val test4 = test3
test4: (String) => java.lang.String = <function1>

Здесь он работает без _ ! В чем разница между функцией def ed, Мне интересно проверить это в фильтре (javax.servlet.Filter). Я мог бы проверить ServletRequest # getRemoteAddr () ...

Как лучше всего определить, есть ли локальный доступ к веб-приложению?
Мне интересно проверить это в фильтре ( javax.servlet.Filter ).
Я мог бы проверить ServletRequest # getRemoteAddr () , если это 127.0.0.1 , но если он работает на машине IPv6, адрес будет 0: 0: 0: 0: 0: 0: 0: 1 .
Есть ли другие подводные камни, о которых я должен знать, или если я просто проверю эти 2 строковых шаблона, я буду в порядке?

Спасибо

6
задан Cratylus 15 February 2011 в 20:59
поделиться