คำจำกัดความของคลาส:
val
หรือvar
สามารถละเว้นจากพารามิเตอร์คลาสซึ่งจะทำให้พารามิเตอร์เป็นส่วนตัว
การเพิ่ม var หรือ val จะทำให้เป็นแบบสาธารณะ (นั่นคือมีการสร้างตัวเข้าถึงเมธอดและตัวเปลี่ยนค่า)
{}
สามารถละเว้นได้หากชั้นเรียนไม่มีเนื้อความนั่นคือ
class EmptyClass
การสร้างอินสแตนซ์ของคลาส:
พารามิเตอร์ทั่วไปสามารถละเว้นได้หากคอมไพเลอร์อนุมานได้ อย่างไรก็ตามโปรดทราบว่าหากประเภทของคุณไม่ตรงกันพารามิเตอร์ type จะถูกอนุมานเพื่อให้ตรงกันเสมอ ดังนั้นหากไม่ระบุประเภทคุณอาจไม่ได้รับสิ่งที่คุณคาดหวังนั่นคือได้รับ
class D[T](val x:T, val y:T);
สิ่งนี้จะทำให้คุณมีข้อผิดพลาดประเภท(พบ Int, สตริงที่คาดหวัง)
var zz = new D[String]("Hi1", 1) // type error
ในขณะที่ใช้งานได้ดี:
var z = new D("Hi1", 1)
== D{def x: Any; def y: Any}
เนื่องจากพารามิเตอร์ type T ถูกอนุมานว่าเป็น supertype ทั่วไปที่น้อยที่สุดของทั้งสอง - Any
คำจำกัดความของฟังก์ชัน:
=
สามารถทิ้งได้หากฟังก์ชันส่งคืนหน่วย (ไม่มีอะไร)
{}
สำหรับเนื้อหาของฟังก์ชันสามารถทิ้งได้หากฟังก์ชันเป็นคำสั่งเดียว แต่เฉพาะในกรณีที่คำสั่งส่งคืนค่า (คุณต้องการ=
เครื่องหมาย) นั่นคือ
def returnAString = "Hi!"
แต่ไม่ได้ผล:
def returnAString "Hi!" // Compile error - '=' expected but string literal found."
ประเภทการส่งคืนของฟังก์ชันสามารถละเว้นได้หากสามารถอนุมานได้ (วิธีการเรียกซ้ำต้องระบุประเภทการส่งคืน)
()
สามารถทิ้งได้หากฟังก์ชันไม่ใช้อาร์กิวเมนต์ใด ๆ นั่นคือ
def endOfString {
return "myDog".substring(2,1)
}
ซึ่งตามอนุสัญญาสงวนไว้สำหรับวิธีการที่ไม่มีผลข้างเคียง - เพิ่มเติมในภายหลัง
()
ไม่ได้ลดลงตามความเป็นจริงเมื่อกำหนดชื่อ paramenter แต่จริงๆแล้วมันเป็นสัญกรณ์ที่แตกต่างกันทางความหมายนั่นคือ
def myOp(passByNameString: => String)
กล่าวว่า myOp รับพารามิเตอร์ pass-by-name ซึ่งส่งผลให้สตริง (นั่นคืออาจเป็นบล็อกรหัสที่ส่งคืนสตริง) ซึ่งตรงข้ามกับพารามิเตอร์ฟังก์ชัน
def myOp(functionParam: () => String)
ซึ่งบอกว่าmyOp
รับฟังก์ชันที่มีพารามิเตอร์เป็นศูนย์และส่งคืนสตริง
(โปรดทราบว่าพารามิเตอร์ pass-by-name จะรวบรวมเป็นฟังก์ชันมันทำให้ไวยากรณ์ดีขึ้นเท่านั้น)
()
สามารถลดลงในนิยามพารามิเตอร์ของฟังก์ชันหากฟังก์ชันรับอาร์กิวเมนต์เดียวเท่านั้นตัวอย่างเช่น:
def myOp2(passByNameString:(Int) => String) { .. } // - You can drop the ()
def myOp2(passByNameString:Int => String) { .. }
แต่ถ้าต้องใช้มากกว่าหนึ่งอาร์กิวเมนต์คุณต้องใส่ ():
def myOp2(passByNameString:(Int, String) => String) { .. }
งบ:
.
สามารถลดลงเพื่อใช้สัญกรณ์ตัวดำเนินการซึ่งสามารถใช้ได้เฉพาะกับตัวดำเนินการ infix (ตัวดำเนินการของวิธีการที่ใช้อาร์กิวเมนต์) ดูคำตอบของ Danielสำหรับข้อมูลเพิ่มเติม
.
นอกจากนี้ยังสามารถทิ้งไว้สำหรับหางรายการฟังก์ชัน postfix
()
สามารถทิ้งไว้สำหรับ postfix operator list.tail
()
ไม่สามารถใช้กับวิธีการที่กำหนดเป็น:
def aMethod = "hi!" // Missing () on method definition
aMethod // Works
aMethod() // Compile error when calling method
เนื่องจากสัญกรณ์นี้สงวนไว้โดยแบบแผนสำหรับวิธีการที่ไม่มีผลข้างเคียงเช่น List # tail (นั่นคือการเรียกใช้ฟังก์ชันที่ไม่มีผลข้างเคียงหมายความว่าฟังก์ชันนั้นไม่มีผลที่สังเกตได้ยกเว้นค่าที่ส่งคืน)
()
สามารถทิ้งสัญกรณ์ตัวดำเนินการเมื่อส่งผ่านในอาร์กิวเมนต์เดียว
()
อาจจำเป็นต้องใช้ตัวดำเนินการ postfix ซึ่งไม่ได้อยู่ที่ส่วนท้ายของคำสั่ง
()
อาจจำเป็นต้องกำหนดคำสั่งซ้อนการสิ้นสุดของฟังก์ชันที่ไม่ระบุตัวตนหรือสำหรับตัวดำเนินการที่ใช้พารามิเตอร์มากกว่าหนึ่งตัว
เมื่อเรียกใช้ฟังก์ชันที่รับฟังก์ชันคุณไม่สามารถละเว้น () จากนิยามฟังก์ชันภายในตัวอย่างเช่น:
def myOp3(paramFunc0:() => String) {
println(paramFunc0)
}
myOp3(() => "myop3") // Works
myOp3(=> "myop3") // Doesn't work
เมื่อเรียกใช้ฟังก์ชันที่รับพารามิเตอร์ตามชื่อคุณไม่สามารถระบุอาร์กิวเมนต์เป็นฟังก์ชันที่ไม่ระบุชื่อพารามิเตอร์ ตัวอย่างเช่นกำหนด:
def myOp2(passByNameString:Int => String) {
println(passByNameString)
}
คุณต้องเรียกมันว่า:
myOp("myop3")
หรือ
myOp({
val source = sourceProvider.source
val p = myObject.findNameFromSource(source)
p
})
แต่ไม่:
myOp(() => "myop3") // Doesn't work
IMO การใช้ประเภทการส่งคืนที่ลดลงมากเกินไปอาจเป็นอันตรายต่อการใช้รหัสซ้ำ เพียงดูข้อกำหนดสำหรับตัวอย่างที่ดีของความสามารถในการอ่านที่ลดลงเนื่องจากไม่มีข้อมูลที่ชัดเจนในโค้ด จำนวนระดับของทิศทางที่แท้จริงเพื่อหาประเภทของตัวแปรที่สามารถเป็นถั่วได้ หวังว่าเครื่องมือที่ดีกว่าจะสามารถหลีกเลี่ยงปัญหานี้และทำให้โค้ดของเรากระชับ
(ตกลงในการรวบรวมคำตอบที่สมบูรณ์และกระชับยิ่งขึ้น (หากฉันพลาดอะไรไปหรือมีอะไรผิดพลาด / ไม่ถูกต้องโปรดแสดงความคิดเห็น) ฉันได้เพิ่มคำตอบไว้ในตอนต้นแล้วโปรดทราบว่านี่ไม่ใช่ภาษา ข้อมูลจำเพาะดังนั้นฉันจึงไม่พยายามทำให้ถูกต้องในเชิงวิชาการ - เหมือนกับการ์ดอ้างอิงมากกว่า)