Поэтому эффективно для каждого элемента (используя подчеркивание в качестве входного аргумента, как в случае 1), выведите ссылку на функцию, «полученную из» (не уверенную в правильной терминологии), метод * в java.lang.String. (случай 3)? Спасибо!

е ли вы помочь мне понять, что подчеркивание делает во втором случае ниже? Я предполагаю, что он определяет анонимную функцию для каждого элемента списка, но почему эта функция не вызывается так, как в первом случае?

scala> List(1,2,3,4).foreach(x => println("*" * x))
*
**
***
****

scala> List(1,2,3,4).foreach(_ => println("*" * _))
$line25.$read$iw$iw$iw$iw$$Lambda$1197/[email protected]
$line25.$read$iw$iw$iw$iw$$Lambda$1197/[email protected]
$line25.$read$iw$iw$iw$iw$$Lambda$1197/[email protected]
$line25.$read$iw$iw$iw$iw$$Lambda$1197/[email protected]

Ответы на вопрос(1)

Решение Вопроса

как показано ниже

List(1,2,3,4).map("*" * _).foreach(println)

Есть много разных вариантов использования подчеркивания в скале. Я перечисляю три из этих вариантов использования, которые имеют отношение к этому вопросу здесь.

случай 1: использование подчеркивания во входном аргументе

Вы можете использовать подчеркивание для аргумента лямбда-выражения, когда входной аргумент не будет использоваться в теле лямбда-выражения, и, таким образом, вы используете подчеркивание в качестве заполнителя вместо объявления входного аргумента для лямбда-выражения, как показано ниже.List(1,2,3,4).foreach(_ => println("*" * 10)) // here 10 '*' characters are displayed irrespective of the input value.

Случай 2: использование подчеркивания в теле лямбда-выражения.

когда подчеркивание используется в теле лямбда-выражения, оно относится к входному аргументу. Вы можете использовать подчеркивание таким образом, если вход будет ссылаться только один раз.

например:List(1,2,3,4).foreach(println("*" * _)) // the underscore will be subsituted with the input argument.

случай 3: для ссылки на неприменимые методы.

скажем у меня есть методfoo(bar: Int), Я могу ссылаться на метод неприменяемого метода по выражениюfoo _ (то есть, foo сразу же следует за подчеркиванием). Неприменяемая функция здесь означает получение ссылки на функциональный объект, который может быть выполнен позже по требованию.

@ def foo(bar: Int) = bar
defined function foo
@ val baz = foo _
baz: Int => Int = $sess.cmd24$$Lambda$2592/[email protected]
@ baz.apply(10)
res25: Int = 10

Вы не можете смешивать случай 1 и случай 2, то есть вы можете использовать подчеркивание либо во входном аргументе, либо в теле лямбда-функции, но не в обоих. поскольку вы смешиваете оба случая, вы неожиданно используете случай 3 подчеркивания, как показано ниже. то есть вы имеете в виду неприменимый метод* определяется через последствия дляjava.lang.String.

@ "*" * _
res20: Int => String = $sess.cmd20$$Lambda$2581/[email protected]

так эффективно, что вы делаете, это что-то вроде ниже.

List(1,2,3,4).foreach(x => println(("*" * _).toString))
 rogue-one30 окт. 2017 г., 18:01
да"*".* _ это случай 3, который я показал в моей последней строке ответа как"*" * _
 allstar31 окт. 2017 г., 01:13
Поэтому эффективно для каждого элемента (используя подчеркивание в качестве входного аргумента, как в случае 1), выведите ссылку на функцию, «полученную из» (не уверенную в правильной терминологии), метод * в java.lang.String. (случай 3)? Спасибо!
 Alexey Romanov30 окт. 2017 г., 08:16
Случай 3 на самом деле здесь не актуален. Скорее проблема именно в том, что выМожно смешайте случай 1 и случай 2, они просто применяются, так сказать, независимо друг от друга.
 Alexey Romanov30 окт. 2017 г., 18:07
Нет, для"*" * _ для случая 3,"*" * должен быть действительнымSimpleExpr1 сам по себе, что это не так (и"*".* является). Видетьscala-lang.org/files/archive/spec/2.12/....
 Alexey Romanov30 окт. 2017 г., 08:26
Если у тебя есть"*".* _ вместо этого это будет случай 3. Хотя любопытно, что это не компилируется и"*".+ _ делает ...

Ваш ответ на вопрос