'20 วินาที 'ทำงานใน Scala ได้อย่างไร


130

วิธีการรวบรวมดังต่อไปนี้:

import scala.concurrent.duration._

val time = 20 seconds

เกิดอะไรขึ้นที่นี่จริง ๆ ?

คำตอบ:


171

มีบางสิ่งเกิดขึ้น

ครั้งแรก Scala อนุญาตให้ละเว้นการจุดและ parens จากการเรียกใช้เมธอดจำนวนมากดังนั้นจึง20 secondsเท่ากับ20.seconds()*

ประการที่สองจะใช้ "การแปลงโดยนัย" ตั้งแต่20เป็นIntและIntไม่มีsecondsวิธีการค้นหาคอมไพเลอร์สำหรับการแปลงนัยที่ใช้เวลาIntและผลตอบแทนบางสิ่งบางอย่างที่จะมีsecondsวิธีการที่มีการค้นหา จำกัด ด้วยขอบเขตของการเรียกวิธีการของคุณ

คุณได้นำเข้าDurationIntเข้าในขอบเขตของคุณ เนื่องจากDurationIntเป็นคลาสโดยปริยายพร้อมIntพารามิเตอร์คอนสตรัคเตอร์ของมันจึงกำหนดการInt => DurationIntแปลงโดยนัย DurationIntมีsecondsวิธีการดังนั้นจึงเป็นไปตามเกณฑ์การค้นหาทั้งหมด ดังนั้นคอมไพเลอร์จะเขียนการโทรของคุณเป็นnew DurationInt(20).seconds**

* ฉันหมายถึงสิ่งนี้อย่างหลวม ๆ 20.seconds()จริงแล้วไม่ถูกต้องเพราะsecondsวิธีการไม่มีรายการพารามิเตอร์และดังนั้นจึงต้อง parensถูกละเว้นในการเรียกใช้เมธอด

** ที่จริงแล้วมันไม่เป็นความจริงเพราะDurationIntเป็นคลาสที่มีค่าดังนั้นคอมไพเลอร์จะหลีกเลี่ยงการตัดจำนวนเต็มถ้าเป็นไปได้


83
เทคโนโลยีขั้นสูงใด ๆ ที่เพียงพอจะแยกไม่ออกจากเวทมนต์
ripper234

4
โชคดีที่ IDEs ส่วนใหญ่สามารถแยกแยะได้! การแปลงโดยนัยได้ใช้จำนวนมากในสกาลา หากคุณเพิ่งอ่านไฟล์ข้อความอาจทำให้เกิดความสับสน ("วิธีการนั้นมาจาก") แต่ด้วยการสนับสนุนเครื่องมือที่เหมาะสมคุณควรจะสามารถหาทางของคุณได้ในจุดที่สกาล่ามีความหมายและกระชับ (เช่น 20.seconds มากขึ้นกว่าที่อ่านได้new DurationInt(20).seconds()ตราบใดที่คุณรู้ว่ามันไม่ได้)
วิลเลียม Billingsley

1
หากคุณพบว่าตัวเองใช้สิ่งต่าง ๆ ให้ถามตัวเองเสมอว่ามีวิธีการที่จะบรรลุสิ่งเดียวกันโดยไม่ได้รับความช่วยเหลือหรือไม่ twitter.github.com/effectivescala/#Typesและ Generics-Implicits
oluies

4
ที่จริงแล้วsecondsวิธีการนั้นถูกกำหนดโดยไม่มี parens ดังนั้นการเรียกมันด้วย parens จึงเป็นข้อผิดพลาด
Frank S. Thomas

1
@ Frank นั่นเป็นจุดที่ดี ฉันไม่ได้ตั้งใจจะแนะนำว่าคุณสามารถเขียน20.seconds()ใน Scala ได้เฉพาะผู้แปลที่แปลการโทรในลักษณะนั้น เป็นมูลค่าชี้ให้เห็นว่า Scala ต้องการให้คุณละเว้น parens หากวิธีการที่สอดคล้องกันไม่มีรายการพารามิเตอร์เช่นในกรณีนี้
Aaron Novstrup

7

"เวทมนต์" ที่เกิดขึ้นมีชื่อว่า "การแปลงโดยนัย" คุณกำลังนำเข้าการแปลงโดยนัยและบางรายการจัดการการแปลงระหว่าง Int (และ Double) เป็นระยะเวลา นั่นคือสิ่งที่คุณกำลังเผชิญกับ


1
ความคิดใดว่าทำไมการนำเข้าimport scala.concurrent.duration._แก้ไข20 secondsแต่จริง ๆ แล้วการนำเข้าDurationConversionsลักษณะไม่ได้ แก้ไข : เพิ่งรู้ว่าสิ่งที่พวกเขานำเข้าคือDurationIntอะไร ฉันเดาว่าเป็นเพราะคุณไม่สามารถนำเข้าคุณลักษณะที่แท้จริงได้หรือไม่ มีเพียงการดำเนินการตามลักษณะที่เป็นรูปธรรมเท่านั้น?
franklin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.