SORU
29 NİSAN 2012, Pazar


Anlayış Scala örtülü

Scala playframework yolumu öğretici yapıyordum ve bana şaşkın vardı: karşısındaki bu kod parçacığını geldim

def newTask = Action { implicit request =>
taskForm.bindFromRequest.fold(
        errors => BadRequest(views.html.index(Task.all(), errors)),
        label => {
          Task.create(label)
          Redirect(routes.Application.tasks())
        } 
  )
}

Araştırmaya karar verdim ve this post rastladım.

Ben hala anlamadım.

Nedir bu arasındaki fark:

implicit def double2Int(d : Double) : Int = d.toInt

ve..

def double2IntNonImplicit(d : Double) : Int = d.toInt

bariz gerçeği dışında farklı yöntem adları var.

Örtülü ve neden kullanmalıyım?

Şimdiden teşekkürler.

CEVAP
29 NİSAN 2012, Pazar


İmplicits ana kullanım durumları aşağıda izah edeceğim, ama daha fazla ayrıntı relevant chapter of Programming in Scala bkz.

İmplict parametreleri

Bir yöntem, nihai parametre listesi değerleri olan denir bağlamında alınacak demektir implicit işaretli olabilir. Eğer kapsamında doğru türde örtülü değeri ise yok, derleme değil. Beri örtülü bir değeri olmalı gidermek için bir tek değer ve çatışmaları önlemek için, iyi bir fikir için yapmak türü, belirli bir amacı, örneğin etme gerektiren yöntemler bulmak örtülü Int!

örnek:

  // probably in a library
class Prefixer(val prefix: String)
def addPrefix(s: String)(implicit p: Prefixer) = p.prefix   s

  // then probably in your application
implicit val myImplicitPrefixer = new Prefixer("***")
addPrefix("abc")  // returns "***abc"

Örtük dönüştürmeler

Derleyici içerik için yanlış türde bir ifade bulduğunda, typecheck sağlayacak bir tür ** 14 örtülü bir değer arayacaktır. Yani eğer bir A gerekli ve bulduğu bir B, o-ecek bakmak için örtülü bir değer türü B => A scope (ayrıca çekler diğer bazı yerler gibi B A arkadaşı nesneleri, onların var). defs "eta-genişletilmiş" Function nesneler implicit def xyz(arg: B): A bir de yapacak. içine olabilir beri

Yöntemleri arasındaki fark implicit işaretli Double bulunduğunda derleyici tarafından eklenecek ama Int gerekli bir.

implicit def doubleToInt(d: Double) = d.toInt
val x: Int = 42.0

aynı şekilde çalışacaktır

def doubleToInt(d: Double) = d.toInt
val x: Int = doubleToInt(42.0)

İkinci el dönüşüm yerleştirdik; ilk derleyici otomatik olarak aynı şeyi yaptı. Dönüşüm Sol tarafta türü açıklama nedeniyle gereklidir.


Oyundan ilk parçacık ile ilgili:

Eylemler Oyun belgelerine this page (Ayrıca Bkz: 41**) açıkladı. Kullanıyorsunuz

apply(block: (Request[AnyContent]) ⇒ Result): Action[AnyContent]

Action nesne aynı adı taşıyan niteliğiyle arkadaşı olan).

Şeklinde bir sabit değer olarak yazılabilir argüman olarak bir Fonksiyon arz etmeye ihtiyacımız var

request => ...

Bir işlevi değişmez, => Önceki bölüm değer bir şekilde ifade ediyor, ve eğer isterseniz implicit gibi val başka bildiriminde işaretlenebilir. Burada, requestyokimplicit bunun için işaretlenmesi tür kontrol etmek için var, ama böyle yaparak olacakörtülü bir değer olarak kullanılabilirherhangi bir yöntem için bu işlevi (ve tabii ki, açıkça kullanılabilir) içinde ihtiyacınız olabilir. Bu durumda, bu Form sınıfı bindFromRequest yöntemi Request örtülü bir tartışmayı gerektirdiği için yapıldı.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrey Menshikov

    Andrey Mensh

    28 Ocak 2012
  • FILIPeeeK

    FILIPeeeK

    22 Mayıs 2006
  • Jana Williams

    Jana William

    17 AĞUSTOS 2011