Неявные параметры Scala со значениями по умолчанию, определенными в сопутствующем объекте - PullRequest
7 голосов
/ 20 января 2011

В соответствии со спецификацией Scala (2.8), чтобы найти неявное выражение, оно должно быть определено в локальной области, наследуемой области или в сопутствующем объекте.Учитывая это, мне кажется, что следующий код должен работать без явного импорта содержимого объекта-компаньона .Я вижу, что это используется в исходном коде библиотеки Scala (например, CanBuildFrom).Также кажется, что я должен иметь возможность вызывать XX.foo () вне определения класса XX и использовать мой неявный параметр из используемого класса-компаньона.Чего мне не хватает?

object XX {
   implicit def XYZ[T]: (T) => Unit = null
}

class XX {
  // import XX._     // Works with this line uncommented...
  def foo(s: String)(implicit f: (String) => Unit): Unit = {
    if (f == null)
      println("Just: " + s)
    else
      f(s)
  }

  def bar {
    foo("abc"){ s => println("Func: " + s)}
    foo("xyz")  // <-- Compile error here: could not find implicit value for parameter f
  }
}

1 Ответ

9 голосов
/ 20 января 2011

Я всегда интерпретировал спецификацию как означающую, что неявное может быть определено в сопутствующем объекте неявного параметра, а не в классе, содержащем определение. Примерно так:

object ZZ {
   implicit val xyz: ZZ = new ZZ()
}
class ZZ {
  def bar: (String) => Unit = null
}

class XX {
  def foo(s: String)(implicit f: ZZ): Unit = {
    if (f.bar == null)
      println("Just: " + s)
    else
      f.bar(s)
  }

  def bar {
    foo("xyz")
  }
}

В Разделе 7.2 спецификации ясно:

Фактические аргументы, которые имеют право быть переданным в неявный параметр типа Т делятся на две категории. Во-первых, имеют право все идентификаторы х к которому можно получить доступ в точке вызов метода без префикса и которые обозначают неявное определение (§7.1) или неявный параметр. таким образом, допустимый идентификатор может быть местным имя или член вложенного шаблон, или это может быть сделано доступны без префикса через пункт об импорте (§4.7). Если нет правомочные идентификаторы в соответствии с этим правилом, затем, во-вторых, подходящие также все неявные члены некоторого объекта, который принадлежит к неявной сфере действия тип неявного параметра, T.

Можете ли вы процитировать часть, которая указывает сопутствующий объект содержащего класса определения?

...