Belgeleyen Scala 2.10 makrolar
Bir örnek ile başlayacağım. İşte Scala 2.10: bir makro olarak dizilerini List.fill
eşdeğer
import scala.language.experimental.macros
import scala.reflect.macros.Context
object TupleExample {
def fill[A](arity: Int)(a: A): Product = macro fill_impl[A]
def fill_impl[A](c: Context)(arity: c.Expr[Int])(a: c.Expr[A]) = {
import c.universe._
arity.tree match {
case Literal(Constant(n: Int)) if n < 23 => c.Expr(
Apply(
Select(Ident("Tuple" n.toString), "apply"),
List.fill(n)(a.tree)
)
)
case _ => c.abort(
c.enclosingPosition,
"Desired arity must be a compile-time constant less than 23!"
)
}
}
}
Aşağıdaki gibi: bu yöntem kullanabiliriz
scala> TupleExample.fill(3)("hello")
res0: (String, String, String) = (hello,hello,hello)
Bu adama saygı duyan bir kaç garip bir kuştur. İlk, arity
argüman derleme zamanında kullanmalıyız beri değişmez bir tamsayı olmalıdır. Scala önceki sürümlerinde yolu (bildiğim kadarıyla) bile bağımsız bir derleme zamanı sabit değer olup olmadığını söylemek için bir yöntem vardı.
İkinci olarak, Product
dönüş türü is a lie—statik dönüş türü yukarıda gösterildiği gibi belirli parametre ve öğe türü bağımsız değişken tarafından belirlenen yer alacak.
Bu şey nasıl bir belge istiyorsunuz? Değilim bekliyor Scaladoc destek bu noktada, ama istediğim şey ... ... bir anlamda kuralları ya da en iyi uygulamaları (dışında sadece yapmak emin derleme zamanı hata iletisi açık) durumda bu çalışan bir makro yöntemi ile potansiyel tuhaf talepleri—daha az şaşırtıcı kullanıcıları için bir Scala 2.10 kütüphane.
Yeni makro sistemin en olgun gösteriler (örneğin, ScalaMock, Slick Diğerleri here verilmiş) hala yöntem düzeyinde nispeten kayıt dışı. Herhangi bir örnek veya işaretçiler, benzer makro sistemleri ile diğer dillerden olanlar da dahil olmak üzere mutluluk duyacağız.
CEVAP
Güzel soru.
Ben sadece bu kod çalıştı:
enum Season
{
Spring,
Summer,
Autumn,
Winter,
}
ve bu şekilde çalıştırın:
Season? v = null;
Console.WriteLine(v);
null
döndürür
eğer bunu yaparsam, bunun yerine normal
Season? v = Season.Spring;
Console.WriteLine((int)v);
bu beklendiği gibi 0
, ya da basit bir dönüşBaharbiz 16 ** döküm kaçının.
Eğer şunları yaparsanız yani..:
Season? v = Season.Spring;
Season? vnull = null;
if(vnull == v) // never TRUE
EDİT
Eğer iki nesne eşit karşılaştırmak, her nesne için GetHashCode yöntemi aynı değeri döndürür.Eğer iki nesne eşit karşılaştırma değil, ancak iki nesne için GetHashCode yöntem farklı değerler dönmek zorunda değilsiniz
Eğer iki nesne eşit, neden oldukları anlamına gelmez aynı karma kodu var . başka bir deyişle: ^em>gerçekeşitlik ile belirlenirEşittir.
Yine MSDN:
Bir nesne için GetHashCode yöntemi sürekli aynı dönmelidir karma kodu nesne durumuna değişiklik yok sürece nesnenin dönüş değeri belirler Equals yöntemi. Unutmayın bu uygulamanın geçerli yürütme için yalnızca doğru ve farklı bir hash kodu eğer uygulamayı çalıştırmak ise iade edilebilir yine.
C 's "kötü" ama Scala�...
Birini kullanarak Scala kod hataları i...
Nasıl Scala koleksiyonları zenginleşti...
Scala @satır içi ek açıklama performan...
Keyfi scala kod konum sırasında tercüm...