SORU
12 Aralık 2012, ÇARŞAMBA


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
23 Mayıs 2012, ÇARŞAMBA


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

MSDN

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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Flohoo

    Flohoo

    12 EYLÜL 2009
  • guau . .

    guau . .

    25 Ocak 2008
  • ThreadBanger

    ThreadBanger

    2 Mart 2007