Scala'da '20 saniye 'nasıl çalışır?


130

Aşağıdaki derleme nasıl yapılır:

import scala.concurrent.duration._

val time = 20 seconds

Burada gerçekte neler oluyor?

Yanıtlar:


171

Bir kaç şey oluyor.

İlk olarak, Scala nokta ve parantezlerin birçok yöntem çağrısından çıkarılmasına izin verir, bu nedenle * 20 secondsile eşdeğerdir 20.seconds().

İkinci olarak, bir "örtük dönüştürme" uygulanır. Yana 20bir olduğunu Intve Inthiçbir vardır secondsyöntemi, bir alan bir örtük dönüşüm için derleyici arar Intve döner bir şey var bir secondssenin yöntem çağrısı kapsamında kısıtlanmadığı arama ile, yöntem.

İçe aktarmış DurationInt sizin kapsamı içine. Yana DurationIntörtülü bir sınıfı, sahip olan Intbir parametre, yapıcı bir örtülü tanımlayan Int => DurationIntdönüştürme. DurationIntbir secondsyöntemi vardır, bu nedenle tüm arama kriterlerini karşılar. Bu nedenle, derleyici aramanızı new DurationInt(20).seconds** olarak yeniden yazar .

* Bunu genel olarak söylüyorum. 20.seconds()aslında geçersizdir çünkü secondsyöntemin parametre listesi yoktur ve bu nedenle , yöntem çağrısında parenslerin atlanması gerekir .

** Aslında, bu tam olarak doğru değildir çünkü DurationIntbir değer sınıfıdır, bu nedenle derleyici mümkünse tamsayıyı kaydırmaktan kaçınacaktır.


83
Yeterince gelişmiş herhangi bir teknoloji sihirden ayırt edilemez.
ripper234

4
Neyse ki çoğu IDE onu ayırt edebilir! Örtülü dönüştürmeler Scala'da oldukça fazla kullanılır. Yalnızca metin dosyasını okuyorsanız, kafa karıştırıcı olabilir ("bu yöntem nereden geliyor?") Ancak uygun araç desteğiyle yolunuzu bulabilmeniz gerekir, bu noktada Scala güzel bir şekilde anlamlı ve öz olabilir. (örneğin, 20. saniye, new DurationInt(20).seconds()nasıl yaptığını bildiğiniz sürece çok daha okunabilir )
William Billingsley

1
Eğer kendinizi ima ederken bulursanız, her zaman kendinize aynı şeyi onların yardımı olmadan başarmanın bir yolu olup olmadığını sorun. twitter.github.com/effectivescala/#Types and Generics-Implicits
oluies

4
Aslında secondsyöntem parens olmadan tanımlanır, bu nedenle onu parantez ile çağırmak bir hatadır.
Frank S. Thomas

1
@Frank Bu iyi bir nokta. 20.seconds()Scala'da yazabileceğinizi söylemek istemedim , sadece derleyicinin aramayı bu şekilde çevirdiğini söyledim . Bu durumda olduğu gibi, karşılık gelen yöntemin parametre listesi yoksa, Scala'nın parensleri çıkarmanızı gerektirdiğini belirtmek gerekir .
Aaron Novstrup

7

Orada meydana gelen "sihir", "örtük dönüştürme" olarak adlandırılır. Örtük dönüştürmeleri içe aktarıyorsunuz ve bazıları Int (ve Double) ile Süre arasındaki dönüşümü gerçekleştiriyor. Senin uğraştığın şey bu.


1
İçe aktarmanın neden import scala.concurrent.duration._çözdüğü, 20 secondsancak DurationConversionsÖzelliği gerçekten içe aktarmanın neden çözmediği hakkında bir fikriniz var mı? DÜZENLEME : Gerçekte ne ithal ettiklerini yeni anladım DurationInt. Sanırım bunun nedeni gerçek Özelliği içe aktaramamanız mı? Sadece Özelliğin somut bir uygulaması mı?
franklin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.