Стоимость объекта - PullRequest
       1

Стоимость объекта

2 голосов
/ 20 марта 2011

Простой вопрос, у меня есть такой код:

class Context[A] {
    def t: A
}

object Context {
    implicit object StandardContext extends Context[SomeObject] {
        def t = SomeObject
    }
}

SomeObject - это object, который содержит значения и функции, к которым я хотел бы получить доступ в моем Context.К сожалению, различные типы для A, которые я хотел бы включить, не имеют общего родительского класса, кроме java.lang.Object.

SomeObject определяется так:

final object SomeObject {
    def func1 = ...
    def func2 = ...
}

В каком-то коде это не мое.Но компилятор Scala жалуется SomeObject is not a value, когда я пытаюсь сделать это выше.Насколько я знаю, object в scala - это одноэлементный класс, так что это будет тип, да, но также и значение, единственное значение своего собственного типа.

Что я хочу сделатьэто что-то вроде:

class Foo[A](bar: Int)(implicit context: Context[A]) {
    def baz = context.t.baz
}

Кто-нибудь может сказать мне, как решить эту проблему или иметь лучшую идею для решения этой проблемы?

Ответы [ 3 ]

3 голосов
/ 20 марта 2011
implicit object StandardContext extends Context[SomeObject] {
    def t = SomeObject

Первый SomeObject - это тип, тип-параметр для Context, но во второй строке он используется, как если бы он был переменной.

Представьте себе

 ... List [Int] {
     def x = Int // fail

Int - это тип, а не переменная, поэтому x не может вернуть Int, он может вернуть только целое число.

0 голосов
/ 21 марта 2011

Ваше описание без кода уже утверждает, что тип param A из Context будет AnyRef, и поэтому делает его бесполезным.Context по сути:

class Context { def t: AnyRef }

Вы, конечно, не можете вызвать context.t.baz в некоторых случаях.

Учитывая, что нет доступных родительских классов, вы можете захотеть броситьсвой собственный, через структурные типы.Классы типов также могут подойти, но лучше не советовать, не зная реальной проблемы, которую вы пытаетесь решить.

0 голосов
/ 21 марта 2011

Кто-нибудь ... есть лучшее решение для ее решения?

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

scala> object SomeObject {
     |  def baz = "hi"
     | }
defined module SomeObject

scala> implicit val baz = SomeObject.baz _
baz: () => java.lang.String = <function0>

scala> class Foo(bar: Int)(implicit baz: () => String) {
     |   def bazme = baz()
     | }
defined class Foo

scala> new Foo(100).bazme
res2: String = hi

Если функция не является согласованным типом, то сам тип функции может быть параметризован. Е.Г.

class Foo[A](bar: Int)(implicit baz: () => A) // or
class Foo[A](bar: Int)(implicit baz: A) // or
class Foo[A, B](bar: Int)(implicit baz: A => B) // etc

Используя этот подход, неявное может быть снято с объекта или экземпляра. Это не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...