ทำไม Scala ใช้โอเปอเรเตอร์ '_' สำหรับการนำเข้าแพ็คเกจแทน '*' เหมือนกับใน Java


17

ในความคิดของฉันสิ่งหนึ่งที่ยิ่งใหญ่ที่สุดเกี่ยวกับ Scala คือความสามารถในการทำงานร่วมกันกับ Java และไวยากรณ์ที่คล้ายคลึงกัน สิ่งหนึ่งที่ฉันพบว่าแปลกคือการใช้ตัว_ดำเนินการสำหรับการนำเข้าแพคเกจ wilcard แทนตัว*ดำเนินการที่ใช้ใน Java

มีเหตุผลทางเทคนิคสำหรับการใช้_แทน*หรือไม่? ถ้าไม่เช่นนั้นทำไมการเปลี่ยนแปลงนี้ถึงเกิดขึ้น?


นี่อาจเป็นสิ่งที่ใช้งานได้ ฉันรู้ว่า Haskell ใช้ _ ในไม่กี่ที่เพื่อทำหน้าที่เป็นค่าตัวแทน / ไม่ระบุ
KChaloux

คำตอบ:


36

ใน Scala *หมายถึงตัวระบุที่ถูกต้อง หนึ่งสามารถเขียน:

val * = "trollin'"
println(*)

ด้วยผลการเป็น:

trollin'

เราสามารถเขียนคลาสที่ชื่อว่า*:

class * {
  def test():String = {
    "trollin'"
  }
}

ดังนั้นในกรณีนี้เมื่อฉันมีคลาส*ในแพ็คเกจus.hexcoderและฉันเขียน:

import us.hexcoder.*

*คุณจะบอกว่าคุณต้องการที่จะนำเข้าชั้นเรียนที่มีชื่อ ด้วยเหตุนี้สกาล่าจึงต้องใช้สัญลักษณ์อื่นเพื่อระบุการนำเข้าไวด์การ์ด ด้วยเหตุผลใดก็ตามพวกเขาตัดสินใจที่จะใช้_เป็นสัญลักษณ์ตัวแทน


9
จากนั้นคำถามจะกลายเป็นเพราะเหตุใด * จึงถูกเลือกให้เป็นตัวระบุที่ถูกต้องและ _ เป็นสัญลักษณ์แทน
Mike Partridge

2
แม้ว่าฉันจะมี upvotes มากกว่านี้เป็นคำตอบที่ถูกต้องมากขึ้น ไม่เคยได้ยิน * เป็นตัวระบุมาก่อน
Michael Brown

1
@MikeBrown มันยังใช้งานได้ใน Lisp นี่คือตัวอย่างในScheme

18
@ MikePatridge เกือบจะแน่นอนเพราะ Scala กำหนดผู้ประกอบการทั้งหมดเป็นฟังก์ชั่นและช่วยให้นักพัฒนาสามารถกำหนดผู้ประกอบการของตัวเองเช่น มันไม่ได้ทำไวยากรณ์กรณีพิเศษสำหรับผู้ประกอบการและ*จำเป็นต้องรวมสำหรับการคูณ ดังนั้นจึงจำเป็นต้องใช้อักขระทั่วไปที่น้อยกว่าอีกตัวเป็นอักขระที่สงวนไว้
KChaloux

3
อักขระ _ คล้ายกับช่องว่าง (เช่นใน "เติมคำในช่องว่าง") ดังนั้นไม่ว่า Scala จะยืมมาจากที่อื่นหรือมาด้วยตัวมันเองมันสมเหตุสมผลที่จะใช้มันเป็นสัญลักษณ์
Michael Shaw

13

ในภาษาที่ใช้งานได้มักใช้อักขระ _ ในการพูดว่า "ฉันไม่สนใจพารามิเตอร์นี้" หรือ "อะไรก็ได้ที่นี่" การขยายค่านั้นไปยังการนำเข้าเนมสเปซนั้นสมเหตุสมผล


2

นอกจากคำตอบของ Glenn แล้วimportมันเป็นคำสั่งที่ถูกต้องที่ใดก็ได้ใน Scala และคุณสามารถimportวัตถุหรือสมาชิกอินสแตนซ์ในขอบเขต ในฐานะที่*จะเห็นได้ชัดเป็นสมาชิกของชั้นเรียนจำนวนมากก็ไม่สามารถนำมาใช้เป็นสัญลักษณ์แทนสำหรับในimportคำสั่ง ดังนั้นคุณจะจบลงด้วยสตริงซึ่งจะต้องไม่เป็นตัวระบุที่ถูกต้อง

_อยู่ในใจ ความจริงที่ว่ามันถูกใช้ในสถานที่อื่นสำหรับความหมายที่แตกต่างกัน (ประเภทการดำรงอยู่ฟังก์ชั่นเป็นตัวอย่าง) ก็เป็นเพราะปัญหาเดียวกัน


0

ในสกาล่ามีสถานที่มากมายที่ใช้การขีดเส้นใต้ การใช้มันเพื่อการนำเข้าไวลด์การ์ดนั้นเป็นเพียงผลที่ตามมา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.