Function.tupled и синтаксис заполнителя

Это не будет компилироваться, поскольку UrlHelper.Action(string,string,object,object) не существует.

UrlHelper.Action будет генерировать только Urls на основе действия, которое вы предоставляете, а не <a> разметки. Если вы хотите добавить HtmlAttribute (например, target="_blank", чтобы открыть ссылку на новой вкладке), вы можете:

  • Добавить целевой атрибут в элемент <a> самостоятельно:
    <a href="@Url.Action("RunReport", "Performance",
        new { reportView = Model.ReportView.ToString() })",
        target = "_blank" type="submit" id="runReport" class="button Secondary">
        @Reports.RunReport
    </a>
    
  • Используйте Html.ActionLink для генерации элемента разметки <a>:
    @Html.ActionLink("Report View", "RunReport", null, new { target = "_blank" })
    
11
задан Community 23 May 2017 в 12:13
поделиться

1 ответ

ОБНОВЛЕНИЕ В ответ на эту проблему сегодня была удалена устаревшая версия.


Выборка функции просто адаптирует FunctionN [A1, A2, ..., AN, R] к Function1 [(A1, A2, ..., AN), R]

Function.tuple устарел в пользу FunctionN # tupled . Последствием этого (возможно, непреднамеренным) является то, что модуль вывода типов не может вывести типы параметров в:

scala> Map(1 -> "one", 2 -> "two") map (_ -> _.length).tupled                 
<console>:5: error: missing parameter type for expanded function ((x$1, x$2) => x$1.$minus$greater(x$2.length))
       Map(1 -> "one", 2 -> "two") map (_ -> _.length).tupled
                                        ^
<console>:5: error: missing parameter type for expanded function ((x$1: <error>, x$2) => x$1.$minus$greater(x$2.length))
       Map(1 -> "one", 2 -> "two") map (_ -> _.length).tupled

Любой из них будет работать:

scala> Map(1 -> "one", 2 -> "two") map { case (a, b)  => a -> b.length }
res8: scala.collection.immutable.Map[Int,Int] = Map(1 -> 3, 2 -> 3)

scala> Map(1 -> "one", 2 -> "two") map ((_: Int) -> (_: String).length).tupled           
res9: scala.collection.immutable.Map[Int,Int] = Map(1 -> 3, 2 -> 3)

scala> Map(1 -> "one", 2 -> "two") map ((p: (Int, String))  => p._1 -> p._2.length)
res12: scala.collection.immutable.Map[Int,Int] = Map(1 -> 3, 2 -> 3)

Я предлагаю вам прочитать ответы на этот недавний вопрос, чтобы получить более глубокое понимание '_' в функциональных литералах и как работает определение типа:

В чем разница между использованием символа `_` и именованного идентификатора в Scala?

UPDATE

В ответ на комментарий: .

scala> val f = (x:Int, y:String) => x + ": " + y
f: (Int, String) => java.lang.String = <function2>

scala> f.tupled
res0: ((Int, String)) => java.lang.String = <function1>

scala> Map(1 -> "1") map f.tupled
res1: scala.collection.immutable.Iterable[java.lang.String] = List(1: 1)

Для этого требуется Scala 2.8. Обратите внимание, что Map # map может привести к другой карте, если возвращаемый тип функции - Tuple2 , в противном случае - List, как указано выше.

15
ответ дан 3 December 2019 в 08:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: