วิธีการรวบรวมดังต่อไปนี้:
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
อะไร ฉันเดาว่าเป็นเพราะคุณไม่สามารถนำเข้าคุณลักษณะที่แท้จริงได้หรือไม่ มีเพียงการดำเนินการตามลักษณะที่เป็นรูปธรรมเท่านั้น?