วิธีการรวบรวมดังต่อไปนี้:
import scala.concurrent.duration._
val time = 20 seconds
เกิดอะไรขึ้นที่นี่จริง ๆ ?
วิธีการรวบรวมดังต่อไปนี้:
import scala.concurrent.duration._
val time = 20 seconds
เกิดอะไรขึ้นที่นี่จริง ๆ ?
คำตอบ:
มีบางสิ่งเกิดขึ้น
ครั้งแรก 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เป็นคลาสที่มีค่าดังนั้นคอมไพเลอร์จะหลีกเลี่ยงการตัดจำนวนเต็มถ้าเป็นไปได้
new DurationInt(20).seconds()ตราบใดที่คุณรู้ว่ามันไม่ได้)
secondsวิธีการนั้นถูกกำหนดโดยไม่มี parens ดังนั้นการเรียกมันด้วย parens จึงเป็นข้อผิดพลาด
20.seconds()ใน Scala ได้เฉพาะผู้แปลที่แปลการโทรในลักษณะนั้น เป็นมูลค่าชี้ให้เห็นว่า Scala ต้องการให้คุณละเว้น parens หากวิธีการที่สอดคล้องกันไม่มีรายการพารามิเตอร์เช่นในกรณีนี้
"เวทมนต์" ที่เกิดขึ้นมีชื่อว่า "การแปลงโดยนัย" คุณกำลังนำเข้าการแปลงโดยนัยและบางรายการจัดการการแปลงระหว่าง Int (และ Double) เป็นระยะเวลา นั่นคือสิ่งที่คุณกำลังเผชิญกับ
import scala.concurrent.duration._แก้ไข20 secondsแต่จริง ๆ แล้วการนำเข้าDurationConversionsลักษณะไม่ได้ แก้ไข : เพิ่งรู้ว่าสิ่งที่พวกเขานำเข้าคือDurationIntอะไร ฉันเดาว่าเป็นเพราะคุณไม่สามารถนำเข้าคุณลักษณะที่แท้จริงได้หรือไม่ มีเพียงการดำเนินการตามลักษณะที่เป็นรูปธรรมเท่านั้น?