Есть ли особое значение для подчеркивания (_) в типовых границах?

Я пытаюсь понять экзистенциальные типы Scala.

Есть ли разница между:

def foo[X <: Bar] = 3

и

def foo[_ <: Bar] = 3

или это нечто большее, чем просто неназванные параметры типа?

7 голосов | спросил Bill 7 Jpm1000000pmMon, 07 Jan 2013 23:29:51 +040013 2013, 23:29:51

1 ответ


0

Здесь _ действительно является просто параметром без имени, не больше, не меньше. Нет разницы между def foo[_ <: Bar] = 3 и def foo[X <: Bar] = 3 где X не используется.

UPDATE

В ответ на: «Я не могу вспомнить вариант использования для неиспользуемого типа, я был бы благодарен за один»:

Обратите внимание, что это почти то же самое, что спрашивать, для чего нужен аргумент, если он не используется, например, в:

def foo( x: Int ) = 123

Обычно хорошей причиной для этого является то, что метод соответствует форме, которая ожидается в каком-то другом API. Например, вы хотите передать метод (или, скорее, его eta-expansio) другому методу, который ожидает параметр. Например:

scala> List(1,2,3).map(foo)
res0: List[Int] = List(123, 123, 123)

Другая возможность заключается в том, что ваш метод переопределен:

trait A {
  def foo( x: Int ): Int
}

trait B extends A {
  def foo( x: Int ) = 123
}

То же самое относится к параметрам типа. В качестве примера для основного случая:

trait A {
  def foo[X <: Bar]: Int
}

trait B extends A {
  def foo[_<:Bar] = 3
}

B.foo не нуждается в параметре типа в своей реализации, но он должен быть там (хотя и без имени), чтобы соответствовать методу это переопределение.

ответил Régis Jean-Gilles 8 Jam1000000amTue, 08 Jan 2013 00:18:32 +040013 2013, 00:18:32

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132