สำหรับชาว Python:
Scala ของ_*
ผู้ประกอบการจะมากหรือน้อยเทียบเท่า ธ-operator *
ตัวอย่าง
การแปลงตัวอย่าง scala จากลิงค์ที่จัดทำโดยLuigi Plinge :
def echo(args: String*) =
for (arg <- args) println(arg)
val arr = Array("What's", "up", "doc?")
echo(arr: _*)
ถึง Python จะมีลักษณะดังนี้:
def echo(*args):
for arg in args:
print "%s" % arg
arr = ["What's", "up", "doc?"]
echo(*arr)
และทั้งสองให้ผลลัพธ์ต่อไปนี้:
อะไร
ขึ้น
doc?
ความแตกต่าง: การคลายพารามิเตอร์ตำแหน่ง
ในขณะที่*
-operator ของ Python สามารถจัดการกับการคลายพารามิเตอร์ตำแหน่ง / พารามิเตอร์สำหรับฟังก์ชัน fixed-arity:
def multiply (x, y):
return x * y
operands = (2, 4)
multiply(*operands)
8
ทำเช่นเดียวกันกับ Scala:
def multiply(x:Int, y:Int) = {
x * y;
}
val operands = (2, 4)
multiply (operands : _*)
จะล้มเหลว:
อาร์กิวเมนต์ไม่เพียงพอสำหรับวิธีการคูณ: (x: Int, y: Int) Int
พารามิเตอร์ค่าที่ไม่ระบุ y
แต่เป็นไปได้ที่จะบรรลุสิ่งเดียวกันกับสกาล่า:
def multiply(x:Int, y:Int) = {
x*y;
}
val operands = (2, 4)
multiply _ tupled operands
ตามLorrin Nelsonนี่คือวิธีการทำงาน:
ส่วนแรก f _ คือไวยากรณ์สำหรับฟังก์ชันที่นำไปใช้บางส่วนซึ่งไม่มีการระบุอาร์กิวเมนต์ใด ๆ สิ่งนี้ทำงานเป็นกลไกในการยึดวัตถุฟังก์ชัน tupled ส่งคืนฟังก์ชันใหม่ซึ่งของ arity-1 ที่ใช้ arity-n tuple ตัวเดียว
การอ่านต่อไป:
def sum(xs: _*)
พ่น 'error: unbound wildcard type'