2016-04-09 48 views
-2

Scala'daki örtük dönüşümler ile örtük parametreler arasında bir ilişki var mı?Scala'daki örtük dönüşümler ile örtük parametreler arasındaki ilişki nedir?

Farklı türdeki örtüklerin ne olduğunu ve bunların çözümleme kurallarının ne olduğunu bilerek hiçbir ilgim yok.

Sadece bu iki kavramın neden aynı adı taşıdığıyla ilgileniyorum.

+3

Bu, aşağıdaki soruları yanıtlamaktadır: http://stackoverflow.com/questions/5598085/where-does-scala-look-for-implicits –

+0

@GiovanniCaporaletti Bu soru nasıl yanıtlanır? –

+0

@MichaelLafayette Kesin bir dönüşümü ve örtük bir parametrenin ne olduğunu ve derleyici tarafından nasıl yönetildiğini ayrıntılı olarak açıklar. Açıkçası buna başka ne ekleyebileceğimi bilmiyorum. Ayrıca her şeyi bağlam ve görüş sınırları ile birlikte koyar, kapsamlı bir cevaptır. –

cevap

3

AFAIK, aynı anahtar kelimeyi paylaşmak dışında acil herhangi bir ilişki yoktur. Verilen bir implicit val gibi hemen hemen hareket etmek implicit parameters kabul edebilir

class Foo 
class Bar 
class FooBar(foo: Foo, bar: Bar) 

implicit val foo = new Foo 
implicit val bar = new Bar 

implicit def fooBar(implicit foo: Foo, bar: Bar): FooBar = new FooBar(foo, bar) 

implicitly[FooBar] 

implicit conversion (fantezi adı, ancak parametreleri kabul ettiğini örtük daha gerçekten hiçbir şey)

(:

Ama ilginç bir yol gibi kombine edilebilir örtükler tanımlanmıştır). Boom.

3

B tip tip A gelen bir kapalı dönüşüm örtülü bir fonksiyonuA => B olup.

Bir örtülü def bir kapalı fonksiyon kullanılabilir hale getirir:

// two types 
class A 
class B 
// implicit conversion from A to B 
implicit def aToB(a: A): B = { 
    println("aToB"); 
    new B 
} 
// we now have a Function[A, B] aka A => B in the implicit scope 
val f = implicitly[A => B] 
f(new A) 
> aToB 
res1: B = [email protected] 

bir kapalı fonksiyon örtülü dönüşüm sağlar:

class IntExtension(x: Int) { def isPositive = x > 0 } 
implicit val intToIntExtensions: Int => IntExtension = x => new IntExtension(x) 
> 1.isPositive 
res2: Boolean = true 
+0

Size doğru anladığımı göreyim. dolaylı olarak [A => B] aToB'ye bir başvuru döndürecektir. Bu referansa yeni bir A verebilirsiniz ve yeni bir B döndürecektir. Kapalı değer, örtülü bir def ile aynı işlevi görür. Ancak foo (int: Int) (örtük bar: Bar) gibi örtük parametreler içeren bir işlevden ne haber? –