Bu yüzden bu makro var makrolar:Statik dönüş tipi
import language.experimental.macros
import scala.reflect.macros.Context
class Foo
class Bar extends Foo { def launchMissiles = "launching" }
object FooExample {
def foo: Foo = macro foo_impl
def foo_impl(c: Context): c.Expr[Foo] =
c.Expr[Foo](c.universe.reify(new Bar).tree)
}
Söylediklerimin ben foo
bir Foo
dönmek istiyorum, ama sanki 2.10'da (aşağıdakileri yapabilirsiniz üç kez. 0-RC3): Ben de c.Expr
üzerinde tür parametreleri kaldırırsanız
scala> FooExample.foo
res0: Bar = [email protected]
scala> res0.launchMissiles
res1: String = launching
aynı şey olur. Gerçekten foo
numaralı telefonu arayarak Bar
aldıklarını göremediğimde, ağacın kendisine bir yazı tipi eklemem gerekiyor.
Bu aslında oldukça harika - örneğin bir makroyu bir şemaya yönlendirebileceğim ve bazı sözcükleri Vocabulary
sınıfının anonim bir alt sınıfını oluşturabildiğim anlamına gelir. döndürülen nesne.
Tam olarak ne yaptığımı anlamak istiyorum, bu yüzden birkaç sorum var. İlk olarak, aslında foo
yönteminde dönüş türü nedir? Sadece (isteğe bağlı) belgeler için kullanılabilir mi? Açıkça (örneğin, ben bu durumda Int
bunu değiştiremezsiniz) dönüş türü kısıtlar ve ben tamamen kaldırmak eğer böyle bir hata alıyorum:
scala> FooExample.foo
<console>:8: error: type mismatch;
found : Bar
required: Nothing
FooExample.foo
^
Ama olarak değiştirebilirsiniz numaralı telefonu aradığımda numaralı numaralı yazımda statik olarak yazılmıştır.
İkincisi, bu davranış bir yerlerde belirtiliyor mu? Bu oldukça basit konular dizisi gibi görünüyor, ancak net bir açıklama ya da tartışma aramadım.
@ som-snytt: Ama yine de son kelimeyi almak için foo kelimesinin dönüş türünü beklemeliydim (yine de sevmediğim halde). –
'FooExample.foo'daki dönüş türü notu burada çok tuhaf. Aksi halde makroların nasıl davranacağını umuyorum. – drstevens
@drstevens: Anlaşmalı. –