Na przykład muszę uzyskać dostęp do manifestu w funkcji def a[A:ClassManifest]
, aby uzyskać klasę usuwania. Mogę użyć funkcji Predef.implicitly, ale w takim przypadku mój kod będzie tak długi, jak jeśli użyję pełnego formularza def a[A](implicit b:ClassManifest[A])
. Czy są też wygodne generowane nazwy dla tych niejawnych argumentów?Jak uzyskać dostęp do niejawnego "ukrytego", tj. Def a [A: B] lub def a [A <% B]?
Odpowiedz
Istnieją trzy predefiniowane metody Predef
że zrobi to za Manifest
s, ClassManifest
OptManifest
s i s: manifest[T]
, classManifest[T]
i optManifest[T]
, odpowiednio. Możesz napisać własne "implicit getters" dla innych klas typów według tego samego wzorca. Oto na przykład manifest[T]
:
def manifest[T](implicit m: Manifest[T]) = m
Więc oto jak można pisać własne:
trait UsefulTypeclass[A] {
def info = 42 // sample method
}
// the “implicit getter”
def usefulTypeclass[A](implicit tc: UsefulTypeclass[A]) = tc
// a method that uses the implicit getter
def foo[A: UsefulTypeclass] =
usefulTypeclass[A].info
Jako schludny trik: jeśli nazwiesz niejawny getter "apply" i umieścisz go na obiekcie towarzyszącym UsefulTypeclass, możesz użyć "UsefulTypeclass [T]" jako wartości reprezentującej wystąpienie typu T bez potrzeby importowania niczego więcej niż sama czcionka. –
@RM Dobra sztuczka. Sądzę, że musiałby to być 'UsefulTypeclass [T]()' (z dodatkowym '()'). –
Właściwie to nie potrzebuje parens. Jeśli masz (wybacz brak formatowania) obiekt TC {def zastosuj [T] (niejawny x: TC [T]) = x} możesz dosłownie wywołać go z "TC [SomeClass]", ponieważ definiowane jest "apply" jako metoda bez parametrów z niejawną listą parametrów, a [SomeClass] rozróżnia ją tylko od odwołania do obiektu TC. Odradza się do TC.apply [SomeClass] (theImplicitValue) –
scalap na ratunek!
Wziąłem ten kod:
object TestThing extends App {
def one { println("one") }
def two[T] { println("two") }
def three[T : Manifest] { println("three") }
def four[T: Manifest, U : Manifest] { println("four") }
}
i prowadził ją przez scalap. Oto co mam:
object TestThing extends java.lang.Object with scala.App with scala.ScalaObject {
def this() = { /* compiled code */ }
def one : scala.Unit = { /* compiled code */ }
def two[T] : scala.Unit = { /* compiled code */ }
def three[T](implicit evidence$1 : scala.Predef.Manifest[T]) : scala.Unit = { /* compiled code */ }
def four[T, U](implicit evidence$2 : scala.Predef.Manifest[T], evidence$3 : scala.Predef.Manifest[U]) : scala.Unit = { /* compiled code */ }
}
Jak widać, pierwsze niejawna Oczywisty jest nazywany evidence$1
. Drugi i trzeci-choć w innym zakresie! - nazywane są evidence$2
i evidence$3
. Więc ... w ten sposób nawiązujesz do Manifestów.
Mimo to wydaje mi się nieco przerażające, że usunięcie manifestu, który znajduje się wyżej w klasie, spowoduje zmianę nazwy manifestu znajdującego się niżej w pliku. Podobnie nie pomaga również to, że podświetlanie składni wtyczki IntelliJ Scala wydaje się uważać, że zmienne Manifesta w zakresie są evidence$1
i evidence$2
i nie sądzi się, że evidence$3
jest tam ważną zmienną (nawet jeśli jest, i evidence$1
nie jest). Ogólnie rzecz biorąc, może te rzeczy powinny być brane pod uwagę jako znaki ostrzegawcze o graniu z ukrytymi zmiennymi Manifest?
- 1. W jaki sposób "a <= b && b <= a && a! = B" może być prawdziwe?
- 2. (Python) Jak uzyskać przekątną (A * B) bez wykonywania A * B?
- 3. Jak podzielić F [A \/B] do (F [A], M [B])
- 4. Różnica między || a = b i a = a || b w rubin?
- 5. Rodzaj minBy [B] (f: ((A, B)) ⇒ B) (ukryte CMP: Kolejność [B]): (A, B)
- 6. Oracle SQL UNIQUE A do B, B do A
- 7. numexpr.evaluate ("a + b", out = a)
- 8. Dlaczego (a | b) jest równoważne z - (a & b) + b?
- 9. Czy zawsze mam `(a/b * b) + a% b == a`, gdy b nie jest zerem?
- 10. Redukujące Iterable [Albo [A, B]] na [A, Iterable [B]]
- 11. Różnica między sort(), sort (funkcja (a, b) {return a-b;}); i sortowanie (funkcja (a, b) {...})
- 12. Dlaczego fold left oczekuje (a -> b -> a) zamiast (b -> a -> a)?
- 13. Numpy Różnica pomiędzy punktu (a, b) i (a * b) .sum()
- 14. Wyrażenia regularne zastępujące {{a, b}} i {{a}}
- 15. Znaczenie podkreślenia w podnośniku [A, B] (f: A => B): Opcja [A] => Opcja [B] = _ mapa f
- 16. RegEx dla^b zamiast pow (a, b)
- 17. Różnica między +++++ B i A ++ + ++ b
- 18. Szyny 3: Jak sprawdzić, czy A <B, gdzie A i B są atrybutami modelu?
- 19. Pythona grupę o macierzy A, a podsumowanie tablicy B - Wyniki
- 20. Jak podzielić listę [Albo [A, B]]
- 21. Czy <'a, 'b: 'a> oznacza, że życie "b musi przeżyć całe życie"?
- 22. Jaka jest różnica między "(a b c) a (listą" a "b" c)?
- 23. Odcinek całkowity: czy // b == int (a/b) jest prawdziwe dla wszystkich liczb całkowitych a, b?
- 24. IF a == true lub b == true oświadczenie
- 25. W jaki sposób dopasowujesz się do typu "A a b"?
- 26. pyton: (? X a: b) IIF lub
- 27. Scala - Jak przekonwertować z listy krotek typu (A, B) do typu (B, A) przy użyciu mapy
- 28. Płaska tablica PHP do zagnieżdżonych ["a", "b", "c"] do ["a" => ["b" => ["c"]]]
- 29. Pływające opcje kompilatora C++ | Zapobieganie a/b -> a * (1/b)
- 30. char * a, * b; jaki jest typ (b-a) i jak mogę go wydrukować?
Zawsze można zadeklarować metodę o mniejszej nazwie, ale nie należy _nie polegać na magicznych nazwach generowanych przez Scalac. –