Scala 3 โ€” Book

Scala for Python Developers

Language

ๆœฌ่Š‚ๆไพ›ไบ† Python ๅ’Œ Scala ็ผ–็จ‹่ฏญ่จ€ไน‹้—ด็š„ๆฏ”่พƒใ€‚ ๅฎƒ้€‚็”จไบŽๆ‡‚ๅพ— Python ๅนถๅธŒๆœ›ไบ†่งฃ Scala ็š„็จ‹ๅบๅ‘˜๏ผŒ็‰นๅˆซๆ˜ฏ้€š่ฟ‡ๆŸฅ็œ‹ Python ่ฏญ่จ€็‰นๆ€งไธŽ Scala ๆฏ”่พƒ็š„็คบไพ‹ใ€‚

ไป‹็ป

ๅœจ่ฟ›ๅ…ฅ็คบไพ‹ไน‹ๅ‰๏ผŒ็ฌฌไธ€้ƒจๅˆ†ๆไพ›ไบ†ไปฅไธ‹้ƒจๅˆ†็š„็›ธๅฏน็ฎ€็Ÿญ็š„ไป‹็ปๅ’Œๆ€ป็ป“ใ€‚ ่ฟ™ไธค็ง่ฏญ่จ€้ฆ–ๅ…ˆๅœจ้ซ˜ๅฑ‚ๆฌกไธŠ่ฟ›่กŒๆฏ”่พƒ๏ผŒ็„ถๅŽๅœจๆ—ฅๅธธ็ผ–็จ‹ๅฑ‚ๆฌกไธŠ่ฟ›่กŒๆฏ”่พƒใ€‚

้ซ˜ๅฑ‚ๆฌก็›ธไผผๆ€ง

ๅœจ้ซ˜ๅฑ‚ๆฌกไธŠ๏ผŒScala ไธŽ Python ๆœ‰่ฟ™ไบ›็›ธไผผไน‹ๅค„๏ผš

  • ไธค่€…้ƒฝๆ˜ฏ้ซ˜็บง็ผ–็จ‹่ฏญ่จ€๏ผŒๆ‚จไธๅฟ…ๅ…ณๅฟƒๆŒ‡้’ˆๅ’Œๆ‰‹ๅŠจๅ†…ๅญ˜็ฎก็†็ญ‰ไฝŽ็บงๆฆ‚ๅฟต
  • ไธค่€…้ƒฝๆœ‰ไธ€ไธช็›ธๅฏน็ฎ€ๅ•ใ€็ฎ€ๆด็š„่ฏญๆณ•
  • ไธค่€…้ƒฝๆ”ฏๆŒๅ‡ฝๆ•ฐๅผ็ผ–็จ‹
  • ไธค่€…้ƒฝๆ˜ฏ้ขๅ‘ๅฏน่ฑก็š„็ผ–็จ‹ (OOP) ่ฏญ่จ€
  • ไธค่€…้ƒฝๆœ‰ๆŽจๅฏผ๏ผšPython ๆœ‰ๅˆ—่กจๆŽจๅฏผ๏ผŒScala ๆœ‰ for ๆŽจๅฏผ
  • ไธค็ง่ฏญ่จ€้ƒฝๆ”ฏๆŒ lambdas ๅ’Œ ้ซ˜้˜ถๅ‡ฝๆ•ฐ
  • ไธค่€…้ƒฝๅฏไปฅไธŽ Apache Spark ไธ€่ตท็”จไบŽๅคงๆ•ฐๆฎๅค„็†
  • ไธค่€…้ƒฝๆœ‰ๅพˆๅคšๅพˆๆฃ’็š„ๅบ“

้ซ˜ๅฑ‚ๆฌกๅทฎๅผ‚

ๅŒๆ ทๅœจ้ซ˜ๅฑ‚ๆฌกไธŠ๏ผŒPython ๅ’Œ Scala ไน‹้—ด็š„_ๅทฎๅผ‚_ๆ˜ฏ๏ผš

  • Python ๆ˜ฏๅŠจๆ€็ฑปๅž‹็š„๏ผŒScala ๆ˜ฏ้™ๆ€็ฑปๅž‹็š„
    • ่™ฝ็„ถๅฎƒๆ˜ฏ้™ๆ€็ฑปๅž‹็š„๏ผŒไฝ† Scala ็š„็ฑปๅž‹ๆŽจๆ–ญ็ญ‰็‰นๆ€ง่ฎฉๅฎƒๆ„Ÿ่ง‰ๅƒๆ˜ฏไธ€้—จๅŠจๆ€่ฏญ่จ€
  • Python ่ขซ่งฃ้‡Š๏ผŒScala ไปฃ็ ่ขซ็ผ–่ฏ‘ๆˆ .class ๆ–‡ไปถ๏ผŒๅนถๅœจ Java ่™šๆ‹Ÿๆœบ (JVM) ไธŠ่ฟ่กŒ
  • ้™คไบ†ๅœจ JVM ไธŠ่ฟ่กŒไน‹ๅค–๏ผŒScala.js ้กน็›ฎๅ…่ฎธๆ‚จไฝฟ็”จ Scala ไฝœไธบ JavaScript ๆ›ฟไปฃๅ“
  • Scala Native ้กน็›ฎๅฏ่ฎฉๆ‚จ็ผ–ๅ†™โ€œ็ณป็ปŸโ€็บงไปฃ็ ๏ผŒๅนถ็ผ–่ฏ‘ไธบๆœฌๆœบๅฏๆ‰ง่กŒๆ–‡ไปถ
  • Scala ไธญ็š„ไธ€ๅˆ‡้ƒฝๆ˜ฏไธ€ไธช_่กจ่พพๅผ_๏ผšๅƒ if ่ฏญๅฅใ€for ๅพช็Žฏใ€match ่กจ่พพๅผ๏ผŒ็”š่‡ณ try/catch ่กจ่พพๅผ้ƒฝๆœ‰่ฟ”ๅ›žๅ€ผ
  • Scala ไน ๆƒฏ้ป˜่ฎคไธๅ˜ๆ€ง๏ผš้ผ“ๅŠฑๆ‚จไฝฟ็”จไธๅฏๅ˜ๅ˜้‡ๅ’Œไธๅฏๅ˜้›†ๅˆ
  • Scala ๅฏนๅนถๅ‘ๅ’Œๅนถ่กŒ็ผ–็จ‹ๆœ‰ๅพˆๅฅฝ็š„ๆ”ฏๆŒ

็ผ–็จ‹ๅฑ‚ๆฌก็›ธไผผๆ€ง

ๆœฌ่Š‚ไป‹็ปๆ‚จๅœจๆ—ฅๅธธ็ผ–ๅ†™ไปฃ็ ๆ—ถไผš็œ‹ๅˆฐ Python ๅ’Œ Scala ไน‹้—ด็š„็›ธไผผไน‹ๅค„๏ผš

  • Scala ็š„็ฑปๅž‹ๆŽจๆ–ญๅธธๅธธ่ฎฉไบบๆ„Ÿ่ง‰ๅƒๆ˜ฏไธ€็งๅŠจๆ€็ฑปๅž‹่ฏญ่จ€
  • ไธค็ง่ฏญ่จ€้ƒฝไธไฝฟ็”จๅˆ†ๅทๆฅ็ป“ๆŸ่กจ่พพๅผ
  • ไธค็ง่ฏญ่จ€้ƒฝๆ”ฏๆŒไฝฟ็”จ้‡่ฆ็š„็ผฉ่ฟ›่€Œไธๆ˜ฏๅคงๆ‹ฌๅทๅ’Œๅœ†ๆ‹ฌๅท
  • ๅฎšไน‰ๆ–นๆณ•็š„่ฏญๆณ•็ฑปไผผ
  • ไธค่€…้ƒฝๆœ‰ๅˆ—่กจใ€ๅญ—ๅ…ธ๏ผˆๆ˜ ๅฐ„๏ผ‰ใ€้›†ๅˆๅ’Œๅ…ƒ็ป„
  • ไธค่€…้ƒฝๆœ‰ๆ˜ ๅฐ„ๅ’Œ่ฟ‡ๆปค็š„ๆŽจๅฏผ
  • ไฝฟ็”จ Scala 3 ็š„้กถ็บงๅฎšไน‰๏ผŒๆ‚จๅฏไปฅๅฐ†ๆ–นๆณ•ใ€ๅญ—ๆฎตๅ’Œๅ…ถไป–ๅฎšไน‰ๆ”พๅœจไปปไฝ•ๅœฐๆ–น
    • ไธ€ไธชๅŒบๅˆซๆ˜ฏ Python ็”š่‡ณๅฏไปฅๅœจไธๅฃฐๆ˜Žๅ•ไธชๆ–นๆณ•็š„ๆƒ…ๅ†ตไธ‹่ฟ่กŒ๏ผŒ่€Œ Scala 3 ไธ่ƒฝๅœจ้กถๅฑ‚ๅš_ๆ‰€ๆœ‰ไบ‹_๏ผ›ไพ‹ๅฆ‚๏ผŒๅฏๅŠจ Scala ๅบ”็”จ็จ‹ๅบ้œ€่ฆไธ€ไธช main ๆ–นๆณ• (@main def)

็ผ–็จ‹ๅฑ‚ๆฌกๅทฎๅผ‚

ๅŒๆ ทๅœจ็ผ–็จ‹็บงๅˆซ๏ผŒ่ฟ™ไบ›ๆ˜ฏๆ‚จๅœจ็ผ–ๅ†™ไปฃ็ ๆ—ถๆฏๅคฉ้ƒฝไผš็œ‹ๅˆฐ็š„ไธ€ไบ›ๅทฎๅผ‚๏ผš

  • ๅœจ Scala ไธญ็ผ–็จ‹ๆ„Ÿ่ง‰้žๅธธไธ€่‡ด๏ผš
    • val ๅ’Œ var ๅญ—ๆฎต็”จไบŽๅฎšไน‰ๅญ—ๆฎตๅ’Œๅ‚ๆ•ฐ
    • ๅˆ—่กจใ€ๆ˜ ๅฐ„ใ€้›†ๅˆๅ’Œๅ…ƒ็ป„้ƒฝไปฅ็ฑปไผผๆ–นๅผๅˆ›ๅปบๅ’Œ่ฎฟ้—ฎ๏ผ›ไพ‹ๅฆ‚๏ผŒๆ‹ฌๅท็”จไบŽๅˆ›ๅปบๆ‰€ๆœ‰็ฑปๅž‹โ€”List(1,2,3), Set(1,2,3), Map(1->"one")โ€”ๅฐฑๅƒๅˆ›ๅปบไปปไฝ•ๅ…ถไป– Scala ็ฑป
    • ้›†ๅˆ็ฑป ้€šๅธธๅ…ทๆœ‰ๅคง้ƒจๅˆ†็›ธๅŒ็š„้ซ˜้˜ถๅ‡ฝๆ•ฐ
    • ๆจกๅผๅŒน้…ๅœจๆ•ดไธช่ฏญ่จ€ไธญไธ€่‡ดไฝฟ็”จ
    • ็”จไบŽๅฎšไน‰ไผ ้€’็ป™ๆ–นๆณ•็š„ๅ‡ฝๆ•ฐ็š„่ฏญๆณ•ไธŽ็”จไบŽๅฎšไน‰ๅŒฟๅๅ‡ฝๆ•ฐ็š„่ฏญๆณ•็›ธๅŒ
  • Scala ๅ˜้‡ๅ’Œๅ‚ๆ•ฐไฝฟ็”จ val๏ผˆไธๅฏๅ˜๏ผ‰ๆˆ– var๏ผˆๅฏๅ˜๏ผ‰ๅ…ณ้”ฎๅญ—ๅฎšไน‰
  • Scala ไน ๆƒฏ็”จๆณ•ๆ›ดๅ–œๆฌขไธๅฏๅ˜็š„ๆ•ฐๆฎ็ป“ๆž„
  • Scala ้€š่ฟ‡ IntelliJ IDEA ๅ’Œ Microsoft VS Code ๆไพ›ไบ†ๆžๅฅฝ็š„ IDE ๆ”ฏๆŒ
  • ๆณจ้‡Š๏ผšPython ไฝฟ็”จ # ่กจ็คบๆณจ้‡Š๏ผ› Scala ไฝฟ็”จ Cใ€C++ ๅ’Œ Java ๆ ทๅผ๏ผš//ใ€/*...*/ ๅ’Œ /**...*/
  • ๅ‘ฝๅ็บฆๅฎš๏ผšPython ๆ ‡ๅ‡†ๆ˜ฏไฝฟ็”จไธ‹ๅˆ’็บฟ๏ผŒไพ‹ๅฆ‚ my_list๏ผ› Scala ไฝฟ็”จ myList
  • Scala ๆ˜ฏ้™ๆ€็ฑปๅž‹็š„๏ผŒๅ› ๆญคๆ‚จๅฏไปฅๅฃฐๆ˜Žๆ–นๆณ•ๅ‚ๆ•ฐใ€ๆ–นๆณ•่ฟ”ๅ›žๅ€ผๅ’Œๅ…ถไป–ๅœฐๆ–น็š„็ฑปๅž‹
  • ๆจกๅผๅŒน้…ๅ’Œ match ่กจ่พพๅผๅœจ Scala ไธญ่ขซๅนฟๆณ›ไฝฟ็”จ๏ผˆๅนถไธ”ไผšๆ”นๅ˜ไฝ ็ผ–ๅ†™ไปฃ็ ็š„ๆ–นๅผ๏ผ‰
  • Scala ไธญๅคง้‡ไฝฟ็”จ trait๏ผ›ๆŽฅๅฃๅ’ŒๆŠฝ่ฑก็ฑปๅœจ Python ไธญไฝฟ็”จ่พƒๅฐ‘
  • Scala ็š„ ไธŠไธ‹ๆ–‡ๆŠฝ่ฑก ๅ’Œ _ๆœฏ่ฏญๆŽจๅฏผ_ๆไพ›ไบ†ไธ€็ณปๅˆ—ไธๅŒ็š„็‰นๆ€ง๏ผš
    • [ๆ‰ฉๅฑ•ๆ–นๆณ•][extension-method]่ฎฉๆ‚จไฝฟ็”จๆธ…ๆ™ฐ็š„่ฏญๆณ•่ฝปๆพๅœฐๅ‘็ฑปๆทปๅŠ ๆ–ฐๅŠŸ่ƒฝ
    • ๅคšๅ…ƒ็ญ‰ๅผ ่ฎฉๆ‚จ้™ๅˆถ็›ธ็ญ‰ๆฏ”่พƒโ€”ๅœจ็ผ–่ฏ‘ๆ—ถโ€”โ€”ๅชๆœ‰้‚ฃไบ›ๆœ‰ๆ„ไน‰็š„ๆฏ”่พƒ
  • Scala ๆ‹ฅๆœ‰ๆœ€ๅ…ˆ่ฟ›็š„ๅผ€ๆบๅ‡ฝๆ•ฐๅผ็ผ–็จ‹ๅบ“๏ผˆๅ‚่ง โ€œAwesome Scalaโ€ ๅˆ—่กจ๏ผ‰
  • ๅ€ŸๅŠฉๅฏน่ฑกใ€ๆŒ‰ๅ็งฐๅ‚ๆ•ฐใ€ไธญ็ผ€่กจ็คบๆณ•ใ€ๅฏ้€‰ๆ‹ฌๅทใ€ๆ‰ฉๅฑ•ๆ–นๆณ•ใ€้ซ˜้˜ถๅ‡ฝๆ•ฐ็ญ‰ๅŠŸ่ƒฝ๏ผŒๆ‚จๅฏไปฅๅˆ›ๅปบ่‡ชๅทฑ็š„โ€œๆŽงๅˆถ็ป“ๆž„โ€ๅ’Œ DSL
  • Scala ไปฃ็ ๅฏไปฅๅœจ JVM ไธญ่ฟ่กŒ๏ผŒ็”š่‡ณๅฏไปฅ็ผ–่ฏ‘ไธบๅŽŸ็”Ÿไปฃ็ ๏ผˆไฝฟ็”จ Scala Native ๅ’Œ GraalVM .org)) ๅฎž็Žฐ้ซ˜ๆ€ง่ƒฝ
  • ่ฎธๅคšๅ…ถไป–ๅฅฝไธœ่ฅฟ๏ผšๆ ทไพ‹็ฑปใ€ไผด็”Ÿ็ฑปๅ’Œๅฏน่ฑกใ€ๅฎใ€่”ๅˆ ๅ’Œ ไบค้›† ็ฑปๅž‹ใ€้กถ็บงๅฎšไน‰ใ€ๆ•ฐๅญ—ๅญ—้ข้‡ใ€ๅคšๅ‚ๆ•ฐๅˆ—่กจๅ’Œๆ›ดๅคš็š„

็‰นๆ€งๆฏ”่พƒ็คบไพ‹

้‰ดไบŽ่ฏฅไป‹็ป๏ผŒไปฅไธ‹้ƒจๅˆ†ๆไพ›ไบ† Python ๅ’Œ Scala ็ผ–็จ‹่ฏญ่จ€ๅŠŸ่ƒฝ็š„ๅนถๆŽ’ๆฏ”่พƒใ€‚

ๆณจ้‡Š

Python ไฝฟ็”จ # ่กจ็คบๆณจ้‡Š๏ผŒ่€Œ Scala ็š„ๆณจ้‡Š่ฏญๆณ•ไธŽ Cใ€C++ ๅ’Œ Java ็ญ‰่ฏญ่จ€็›ธๅŒ๏ผš

# a comment
// a comment
/* ... */
/** ... */

ๅ˜้‡่ต‹ๅ€ผ

่ฟ™ไบ›ไพ‹ๅญๆผ”็คบไบ†ๅฆ‚ไฝ•ๅœจ Python ๅ’Œ Scala ไธญๅˆ›ๅปบๅ˜้‡ใ€‚

ๅˆ›ๅปบๆ•ดๆ•ฐๅ’Œๅญ—็ฌฆไธฒๅ˜้‡๏ผš

x = 1
x = "Hi"
y = """foo
       bar
       baz"""
val x = 1
val x = "Hi"
val y = """foo
           bar
           baz"""

ๅˆ—่กจ๏ผš

x = [1,2,3]
val x = List(1,2,3)

ๅญ—ๅ…ธ/ๆ˜ ๅฐ„๏ผš

x = {
  "Toy Story": 8.3,
  "Forrest Gump": 8.8,
  "Cloud Atlas": 7.4
}
val x = Map(
  "Toy Story" -> 8.3,
  "Forrest Gump" -> 8.8,
  "Cloud Atlas" -> 7.4
)

้›†ๅˆ๏ผš

x = {1,2,3}
val x = Set(1,2,3)

ๅ…ƒ็ป„๏ผš

x = (11, "Eleven")
val x = (11, "Eleven")

ๅฆ‚ๆžœ Scala ๅญ—ๆฎตๆ˜ฏๅฏๅ˜็š„๏ผŒ่ฏทไฝฟ็”จ var ่€Œไธๆ˜ฏ val ๆฅๅฎšไน‰ๅ˜้‡๏ผš

var x = 1
x += 1

็„ถ่€Œ๏ผŒScala ไธญ็š„็ป้ชŒๆณ•ๅˆ™ๆ˜ฏๅง‹็ปˆไฝฟ็”จ val๏ผŒ้™ค้žๅ˜้‡็กฎๅฎž้œ€่ฆ่ขซๆ”นๅ˜ใ€‚

OOP ้ฃŽๆ ผ็š„็ฑปๅ’Œๆ–นๆณ•

ๆœฌ่Š‚ๆฏ”่พƒไบ†ไธŽ OOP ้ฃŽๆ ผ็š„็ฑปๅ’Œๆ–นๆณ•็›ธๅ…ณ็š„็‰นๆ€งใ€‚

OOP ้ฃŽๆ ผ็ฑป๏ผŒไธปๆž„้€ ๅ‡ฝๆ•ฐ๏ผš

class Person(object):
  def __init__(self, name):
    self.name = name

  def speak(self):
    print(f'Hello, my name is {self.name}')
class Person (var name: String):
  def speak() = println(s"Hello, my name is $name")

ๅˆ›ๅปบๅ’Œไฝฟ็”จๅฎžไพ‹๏ผš

p = Person("John")
p.name   # John
p.name = 'Fred'
p.name   # Fred
p.speak()
val p = Person("John")
p.name   // John
p.name = "Fred"
p.name   // Fred
p.speak()

ๅ•่กŒๆ–นๆณ•๏ผš

def add(a, b): return a + b
def add(a: Int, b: Int): Int = a + b

ๅคš่กŒๆ–นๆณ•๏ผš

def walkThenRun():
  print('walk')
  print('run')
def walkThenRun() =
  println("walk")
  println("run")

ๆŽฅๅฃ๏ผŒtraits๏ผŒๅ’Œ็ปงๆ‰ฟ

ๅฆ‚ๆžœๆ‚จ็†Ÿๆ‚‰ Java 8 ๅ’Œๆ›ดๆ–ฐ็‰ˆๆœฌ๏ผŒScala trait ็ฑปไผผไบŽ้‚ฃไบ› Java ๆŽฅๅฃใ€‚ Traits ๅœจ Scala ไธญไธ€็›ดไฝฟ็”จ๏ผŒ่€Œ Python ๆŽฅๅฃๅ’ŒๆŠฝ่ฑก็ฑป็š„ไฝฟ็”จ้ข‘็އ่ฆไฝŽๅพ—ๅคšใ€‚ ๅ› ๆญค๏ผŒไธŽๅ…ถ่ฏ•ๅ›พๆฏ”่พƒไธค่€…๏ผŒไธๅฆ‚็”จ่ฟ™ไธชไพ‹ๅญๆฅๅฑ•็คบๅฆ‚ไฝ•ไฝฟ็”จ Scala traitๆฅๆž„ๅปบไธ€ไธชๆจกๆ‹Ÿๆ•ฐๅญฆ้—ฎ้ข˜็š„ๅฐ่งฃๅ†ณๆ–นๆกˆ๏ผš

trait Adder:
  def add(a: Int, b: Int) = a + b

trait Multiplier:
  def multiply(a: Int, b: Int) = a * b

// create a class from the traits
class SimpleMath extends Adder, Multiplier
val sm = new SimpleMath
sm.add(1,1)        // 2
sm.multiply(2,2)   // 4

่ฟ˜ๆœ‰่ฎธๅคšๅ…ถไป–ๆ–นๆณ•ๅฏไปฅๅฐ† trait ไธŽ็ฑปๅ’Œๅฏน่ฑกไธ€่ตทไฝฟ็”จ๏ผŒไฝ†่ฟ™่ฎฉๆ‚จไบ†่งฃๅฆ‚ไฝ•ไฝฟ็”จๅฎƒไปฌๅฐ†ๆฆ‚ๅฟต็ป„็ป‡ๆˆ่กŒไธบ็š„้€ป่พ‘็ป„๏ผŒ็„ถๅŽๆ นๆฎ้œ€่ฆๅฐ†ๅฎƒไปฌๅˆๅนถไปฅๅˆ›ๅปบไธ€ไธชๅฎŒๆ•ด็š„่งฃๅ†ณๆ–นๆกˆใ€‚

ๆŽงๅˆถ็ป“ๆž„

ๆœฌ่Š‚ๆฏ”่พƒ Python ๅ’Œ Scala ไธญ็š„ๆŽงๅˆถ็ป“ๆž„ใ€‚ ไธค็ง่ฏญ่จ€้ƒฝๆœ‰็ฑปไผผ if/elseใ€whileใ€for ๅพช็Žฏๅ’Œ try ็š„็ป“ๆž„ใ€‚ Scala ไนŸๆœ‰ match ่กจ่พพๅผใ€‚

if ่ฏญๅฅ๏ผŒๅ•่กŒ๏ผš

if x == 1: print(x)
if x == 1 then println(x)

if ่ฏญๅฅ๏ผŒๅคš่กŒ๏ผš

if x == 1:
  print("x is 1, as you can see:")
  print(x)
if x == 1 then
  println("x is 1, as you can see:")
  println(x)

if, else if, else:

if x < 0:
  print("negative")
elif x == 0:
  print("zero")
else:
  print("positive")
if x < 0 then
  println("negative")
else if x == 0 then
  println("zero")
else
  println("positive")

ไปŽ if ่ฟ”ๅ›žๅ€ผ๏ผš

min_val = a if a < b else b
val minValue = if a < b then a else b

if ไฝœไธบๆ–นๆณ•ไฝ“๏ผš

def min(a, b):
  return a if a < b else b
def min(a: Int, b: Int): Int =
  if a < b then a else b

while ๅพช็Žฏ๏ผš

i = 1
while i < 3:
  print(i)
  i += 1
var i = 1
while i < 3 do
  println(i)
  i += 1

ๆœ‰่Œƒๅ›ด็š„ for ๅพช็Žฏ๏ผš

for i in range(0,3):
  print(i)
// preferred
for i <- 0 until 3 do println(i)

// also available
for (i <- 0 until 3) println(i)

// multiline syntax
for
  i <- 0 until 3
do
  println(i)

ๅˆ—่กจ็š„ for ๅพช็Žฏ๏ผš

for i in ints: print(i)

for i in ints:
  print(i)
for i <- ints do println(i)

for ๅพช็Žฏ๏ผŒๅคš่กŒ๏ผš

for i in ints:
  x = i * 2
  print(f"i = {i}, x = {x}")
for
  i <- ints
do
  val x = i * 2
  println(s"i = $i, x = $x")

ๅคšโ€œ่Œƒๅ›ดโ€็”Ÿๆˆๅ™จ๏ผš

for i in range(1,3):
  for j in range(4,6):
    for k in range(1,10,3):
      print(f"i = {i}, j = {j}, k = {k}")
for
  i <- 1 to 2
  j <- 4 to 5
  k <- 1 until 10 by 3
do
  println(s"i = $i, j = $j, k = $k")

ๅธฆๅฎˆๅซ๏ผˆif ่กจ่พพๅผ๏ผ‰็š„็”Ÿๆˆๅ™จ๏ผš

for i in range(1,11):
  if i % 2 == 0:
    if i < 5:
      print(i)
for
  i <- 1 to 10
  if i % 2 == 0
  if i < 5
do
  println(i)

ๆฏ่กŒๆœ‰ๅคšไธช if ๆกไปถ๏ผš

for i in range(1,11):
  if i % 2 == 0 and i < 5:
    print(i)
for
  i <- 1 to 10
  if i % 2 == 0 && i < 5
do
  println(i)

ๆŽจๅฏผ๏ผš

xs = [i * 10 for i in range(1, 4)]
# xs: [10,20,30]
val xs = for i <- 1 to 3 yield i * 10
// xs: Vector(10, 20, 30)

match ่กจ่พพๅผ๏ผš

# From 3.10, Python supports structural pattern matching
# You can also use dictionaries for basic โ€œswitchโ€ functionality
match month:
  case 1:
    monthAsString = "January"
  case 2:
    monthAsString = "February"
  case _:
    monthAsString = "Other"
val monthAsString = month match
  case 1 => "January"
  case 2 => "February"
  _ => "Other"

switch/match:

# Only from Python 3.10
match i:
  case 1 | 3 | 5 | 7 | 9:
    numAsString = "odd"
  case 2 | 4 | 6 | 8 | 10:
    numAsString = "even"
  case _:
    numAsString = "too big"
val numAsString = i match
  case 1 | 3 | 5 | 7 | 9 => "odd"
  case 2 | 4 | 6 | 8 | 10 => "even"
  case _ => "too big"

try, catch, finally:

try:
  print(a)
except NameError:
  print("NameError")
except:
  print("Other")
finally:
  print("Finally")
try
  writeTextToFile(text)
catch
  case ioe: IOException =>
    println(ioe.getMessage)
  case fnf: FileNotFoundException =>
    println(fnf.getMessage)
finally
  println("Finally")

ๅŒน้…่กจ่พพๅผๅ’ŒๆจกๅผๅŒน้…ๆ˜ฏ Scala ็ผ–็จ‹ไฝ“้ชŒ็š„้‡่ฆ็ป„ๆˆ้ƒจๅˆ†๏ผŒไฝ†่ฟ™้‡Œๅชๅฑ•็คบไบ†ๅ‡ ไธช match ่กจ่พพๅผๅŠŸ่ƒฝใ€‚ ๆœ‰ๅ…ณๆ›ดๅคš็คบไพ‹๏ผŒ่ฏทๅ‚่ง ๆŽงๅˆถ็ป“ๆž„ ้กต้ขใ€‚

้›†ๅˆ็ฑป

ๆœฌ่Š‚ๆฏ”่พƒ Python ๅ’Œ Scala ไธญๅฏ็”จ็š„ ้›†ๅˆ็ฑป๏ผŒๅŒ…ๆ‹ฌๅˆ—่กจใ€ๅญ—ๅ…ธ/ๆ˜ ๅฐ„ใ€้›†ๅˆๅ’Œๅ…ƒ็ป„ใ€‚

ๅˆ—่กจ

Python ๆœ‰ๅฎƒ็š„ๅˆ—่กจ๏ผŒScala ๆœ‰ๅ‡ ไธชไธๅŒ็š„ไธ“้—จ็š„ๅฏๅ˜ๅ’Œไธๅฏๅ˜ๅบๅˆ—็ฑป๏ผŒๅ…ทไฝ“ๅ–ๅ†ณไบŽๆ‚จ็š„้œ€่ฆใ€‚ ๅ› ไธบ Python ๅˆ—่กจๆ˜ฏๅฏๅ˜็š„๏ผŒๆ‰€ไปฅๅฎƒๆœ€็›ดๆŽฅๅœฐไธŽ Scala ็š„ ArrayBuffer ่ฟ›่กŒๆฏ”่พƒใ€‚

Python ๅˆ—่กจ & Scalaๅบๅˆ—๏ผš

Match expressions and pattern matching are a big part of the Scala programming experience, but only a few match expression features are shown here. See the Control Structures page for many more examples.

Collections classes

This section compares the collections classes that are available in Python and Scala, including lists, dictionaries/maps, sets, and tuples.

Lists

Where Python has its list, Scala has several different specialized mutable and immutable sequence classes, depending on your needs. Because the Python list is mutable, it most directly compares to Scalaโ€™s ArrayBuffer.

Python list & Scala sequences:

a = [1,2,3]
// use different sequence classes
// as needed
val a = List(1,2,3)
val a = Vector(1,2,3)
val a = ArrayBuffer(1,2,3)

่Žทๅ–ๅˆ—่กจๅ…ƒ็ด ๏ผš

a[0]
a[1]
a(0)
a(1)
// just like all other method calls

ๆ›ดๆ–ฐๅˆ—่กจๅ…ƒ็ด ๏ผš

a[0] = 10
a[1] = 20
// ArrayBuffer is mutable
a(0) = 10
a(1) = 20

ๅˆๅนถไธคไธชๅˆ—่กจ๏ผš

c = a + b
val c = a ++ b

้ๅކๅˆ—่กจ๏ผš

for i in ints: print(i)

for i in ints:
  print(i)
// preferred
for i <- ints do println(i)

// also available
for (i <- ints) println(i)

Scala ็š„ไธป่ฆๅบๅˆ—็ฑปๆ˜ฏ Listใ€Vector ๅ’Œ ArrayBufferใ€‚ List ๅ’Œ Vector ๆ˜ฏๅฝ“ไฝ ๆƒณ่ฆไธ€ไธชไธๅฏๅ˜ๅบๅˆ—ๆ—ถไฝฟ็”จ็š„ไธป่ฆ็ฑป๏ผŒ่€Œ ArrayBuffer ๆ˜ฏๅฝ“ไฝ ๆƒณ่ฆไธ€ไธชๅฏๅ˜ๅบๅˆ—ๆ—ถไฝฟ็”จ็š„ไธป่ฆ็ฑปใ€‚ ๏ผˆScala ไธญ็š„โ€œ็ผ“ๅ†ฒๅŒบโ€ๆ˜ฏไธ€ไธชๅฏไปฅๅขž้•ฟๅ’Œ็ผฉๅฐ็š„ๅบๅˆ—ใ€‚๏ผ‰

ๅญ—ๅ…ธ/ๆ˜ ๅฐ„

Python ๅญ—ๅ…ธๅฐฑๅƒ_ๅฏๅ˜็š„_ Scala Map ็ฑปใ€‚ ไฝ†ๆ˜ฏ๏ผŒ้ป˜่ฎค็š„ Scala ๆ˜ ๅฐ„ๆ˜ฏ_ไธๅฏๅ˜็š„_๏ผŒๅนถไธ”ๆœ‰่ฎธๅคš่ฝฌๆขๆ–นๆณ•ๅฏไปฅ่ฎฉๆ‚จ่ฝปๆพๅˆ›ๅปบๆ–ฐๆ˜ ๅฐ„ใ€‚

ๅญ—ๅ…ธ/ๆ˜ ๅฐ„ ๅˆ›ๅปบ๏ผš

my_dict = {
  'a': 1,
  'b': 2,
  'c': 3
}
val myMap = Map(
  "a" -> 1,
  "b" -> 2,
  "c" -> 3
)

่Žทๅ–ๅญ—ๅ…ธ/ๆ˜ ๅฐ„ๅ…ƒ็ด ๏ผš

my_dict['a']   # 1
myMap("a")   // 1

ๅธฆ for ๅพช็Žฏ็š„ๅญ—ๅ…ธ/ๆ˜ ๅฐ„๏ผš

for key, value in my_dict.items():
  print(key)
  print(value)
for (key,value) <- myMap do
  println(key)
  println(value)

Scala ๆœ‰ๅ…ถไป–ไธ“้—จ็š„ Map ็ฑปๆฅๆปก่ถณไธๅŒ็š„้œ€ๆฑ‚ใ€‚

้›†ๅˆ

Python ้›†ๅˆ็ฑปไผผไบŽ_ๅฏๅ˜็š„_ Scala Set ็ฑปใ€‚

้›†ๅˆๅˆ›ๅปบ๏ผš

set = {"a", "b", "c"}
val set = Set(1,2,3)

้‡ๅคๅ…ƒ็ด ๏ผš

set = {1,2,1}
# set: {1,2}
val set = Set(1,2,1)
// set: Set(1,2)

Scala ๆœ‰ๅ…ถไป–ไธ“้—จ็š„ Set ็ฑปๆฅๆปก่ถณไธๅŒ็š„้œ€ๆฑ‚ใ€‚

ๅ…ƒ็ป„

Python ๅ’Œ Scala ๅ…ƒ็ป„ไนŸๅพˆ็›ธไผผใ€‚

ๅ…ƒ็ป„ๅˆ›ๅปบ๏ผš

t = (11, 11.0, "Eleven")
val t = (11, 11.0, "Eleven")

่Žทๅ–ๅ…ƒ็ป„ๅ…ƒ็ด ๏ผš

t[0]   # 11
t[1]   # 11.0
t(0)   // 11
t(1)   // 11.0

้›†ๅˆ็ฑปไธŠ็š„ๆ–นๆณ•

Python ๅ’Œ Scala ๆœ‰ๅ‡ ไธช็›ธๅŒ็š„ๅธธ็”จๅ‡ฝๆ•ฐๆ–นๆณ•ๅฏไพ›ๅฎƒไปฌไฝฟ็”จ๏ผš

  • map
  • filter
  • reduce

ๅฆ‚ๆžœๆ‚จไน ๆƒฏไบŽๅœจ Python ไธญๅฐ†่ฟ™ไบ›ๆ–นๆณ•ไธŽ lambda ่กจ่พพๅผไธ€่ตทไฝฟ็”จ๏ผŒๆ‚จไผšๅ‘็Žฐ Scala ๅœจๅ…ถ้›†ๅˆ็ฑปไธญไฝฟ็”จไบ†็ฑปไผผ็š„ๆ–นๆณ•ใ€‚ ไธบไบ†ๆผ”็คบๆญคๅŠŸ่ƒฝ๏ผŒ่ฟ™้‡Œๆœ‰ไธคไธช็คบไพ‹ๅˆ—่กจ๏ผš

numbers = (1,2,3)           // python
val numbers = List(1,2,3)   // scala

ไธ‹่กจไธญไฝฟ็”จไบ†่ฟ™ไบ›ๅˆ—่กจ๏ผŒๆ˜พ็คบไบ†ๅฆ‚ไฝ•ๅฏนๅ…ถๅบ”็”จๆ˜ ๅฐ„ๅ’Œ่ฟ‡ๆปค็ฎ—ๆณ•ใ€‚

ๆ˜ ๅฐ„ไธŽๆŽจๅฏผ๏ผš

x = [i * 10 for i in numbers]
val x = for i <- numbers yield i * 10

ๆœ‰ๆŽจๅฏผ็š„่ฟ‡ๆปค๏ผš

evens = [i for i in numbers if i % 2 == 0]
val evens = numbers.filter(_ % 2 == 0)
// or
val evens = for i <- numbers if i % 2 == 0 yield i

ๆ˜ ๅฐ„ & ๆœ‰ๆŽจๅฏผ็š„่ฟ‡ๆปค๏ผš

x = [i * 10 for i in numbers if i % 2 == 0]
val x = numbers.filter(_ % 2 == 0).map(_ * 10)
// or
val x = for i <- numbers if i % 2 == 0 yield i * 10

ๆ˜ ๅฐ„๏ผš

x = map(lambda x: x * 10, numbers)
val x = numbers.map(_ * 10)

่ฟ‡ๆปค๏ผš

f = lambda x: x > 1
x = filter(f, numbers)
val x = numbers.filter(_ > 1)

Scala ้›†ๅˆๆ–นๆณ•๏ผš

Scala ้›†ๅˆ็ฑปๆœ‰่ถ…่ฟ‡ 100 ็งๅŠŸ่ƒฝๆ–นๆณ•ๆฅ็ฎ€ๅŒ–ๆ‚จ็š„ไปฃ็ ใ€‚ ้™คไบ† mapใ€filter ๅ’Œ reduce๏ผŒไธ‹้ขๅˆ—ๅ‡บไบ†ๅ…ถไป–ๅธธ็”จ็š„ๆ–นๆณ•ใ€‚ ๅœจ่ฟ™ไบ›ๆ–นๆณ•็คบไพ‹ไธญ๏ผš

  • c ๆŒ‡็š„ๆ˜ฏไธ€ไธช้›†ๅˆ
  • p ๆ˜ฏ่ฐ“่ฏ
  • f ๆ˜ฏไธ€ไธชๅ‡ฝๆ•ฐใ€ๅŒฟๅๅ‡ฝๆ•ฐๆˆ–ๆ–นๆณ•
  • n ๆŒ‡็š„ๆ˜ฏไธ€ไธชๆ•ดๆ•ฐๅ€ผ

ไปฅไธ‹ๆ˜ฏไธ€ไบ›ๅฏ็”จ็š„่ฟ‡ๆปคๆ–นๆณ•๏ผš

ๆ–นๆณ• ่ฏดๆ˜Ž
c1.diff(c2) ่ฟ”ๅ›ž c1 ๅ’Œ c2 ไธญๅ…ƒ็ด ็š„ๅทฎๅผ‚ใ€‚
c.distinct ่ฟ”ๅ›ž c ไธญ็š„ๅ”ฏไธ€ๅ…ƒ็ด ใ€‚
c.drop(n) ่ฟ”ๅ›ž้›†ๅˆไธญ้™คๅ‰ n ไธชๅ…ƒ็ด ไน‹ๅค–็š„ๆ‰€ๆœ‰ๅ…ƒ็ด ใ€‚
c.filter(p) ่ฟ”ๅ›ž้›†ๅˆไธญ่ฐ“่ฏไธบ true ็š„ๆ‰€ๆœ‰ๅ…ƒ็ด ใ€‚
c.head ่ฟ”ๅ›ž้›†ๅˆ็š„็ฌฌไธ€ไธชๅ…ƒ็ด ใ€‚ ๏ผˆๅฆ‚ๆžœ้›†ๅˆไธบ็ฉบ๏ผŒๅˆ™ๆŠ›ๅ‡บ NoSuchElementExceptionใ€‚๏ผ‰
c.tail ่ฟ”ๅ›ž้›†ๅˆไธญ้™ค็ฌฌไธ€ไธชๅ…ƒ็ด ไน‹ๅค–็š„ๆ‰€ๆœ‰ๅ…ƒ็ด ใ€‚ ๏ผˆๅฆ‚ๆžœ้›†ๅˆไธบ็ฉบ๏ผŒๅˆ™ๆŠ›ๅ‡บ UnsupportedOperationExceptionใ€‚๏ผ‰
c.take(n) ่ฟ”ๅ›ž้›†ๅˆ c ็š„ๅ‰ n ไธชๅ…ƒ็ด ใ€‚

ไปฅไธ‹ๆ˜ฏไธ€ไบ›่ฝฌๆขๆ–นๆณ•๏ผš

ๆ–นๆณ• ่ฏดๆ˜Ž
c.flatten ๅฐ†้›†ๅˆ็š„้›†ๅˆ๏ผˆไพ‹ๅฆ‚ๅˆ—่กจๅˆ—่กจ๏ผ‰่ฝฌๆขไธบๅ•ไธช้›†ๅˆ๏ผˆๅ•ไธชๅˆ—่กจ๏ผ‰ใ€‚
c.flatMap(f) ้€š่ฟ‡ๅฐ† f ๅบ”็”จไบŽ้›†ๅˆ c ็š„ๆ‰€ๆœ‰ๅ…ƒ็ด ๏ผˆๅฆ‚ map๏ผ‰่ฟ”ๅ›žไธ€ไธชๆ–ฐ้›†ๅˆ๏ผŒ็„ถๅŽๅฐ†็ป“ๆžœ้›†ๅˆ็š„ๅ…ƒ็ด ๅฑ•ๅนณใ€‚
c.map(f) ้€š่ฟ‡ๅฐ† f ๅบ”็”จไบŽ้›†ๅˆ c ็š„ๆ‰€ๆœ‰ๅ…ƒ็ด ๆฅๅˆ›ๅปบไธ€ไธชๆ–ฐ้›†ๅˆใ€‚
c.reduce(f) ๅฐ† reduction ๅ‡ฝๆ•ฐ f ๅบ”็”จไบŽ c ไธญ็š„่ฟž็ปญๅ…ƒ็ด ไปฅไบง็”Ÿๅ•ไธชๅ€ผใ€‚
c.sortWith(f) ่ฟ”ๅ›ž็”ฑๆฏ”่พƒๅ‡ฝๆ•ฐ f ๆŽ’ๅบ็š„ c ็‰ˆๆœฌใ€‚

ไธ€ไบ›ๅธธ่ง็š„ๅˆ†็ป„ๆ–นๆณ•๏ผš

ๆ–นๆณ• ่ฏดๆ˜Ž
c.groupBy(f) ๆ นๆฎ f ๅฐ†้›†ๅˆๅˆ’ๅˆ†ไธบ้›†ๅˆ็š„ Mapใ€‚
c.partition(p) ๆ นๆฎ่ฐ“่ฏ p ่ฟ”ๅ›žไธคไธช้›†ๅˆใ€‚
c.span(p) ่ฟ”ๅ›žไธคไธช้›†ๅˆ็š„้›†ๅˆ๏ผŒ็ฌฌไธ€ไธช็”ฑ c.takeWhile(p) ๅˆ›ๅปบ๏ผŒ็ฌฌไบŒไธช็”ฑ c.dropWhile(p) ๅˆ›ๅปบใ€‚
c.splitAt(n) ้€š่ฟ‡ๅœจๅ…ƒ็ด  n ๅค„ๆ‹†ๅˆ†้›†ๅˆ c ๆฅ่ฟ”ๅ›žไธคไธช้›†ๅˆ็š„้›†ๅˆใ€‚

ไธ€ไบ›ไฟกๆฏๅ’Œๆ•ฐๅญฆๆ–นๆณ•๏ผš

ๆ–นๆณ• ่ฏดๆ˜Ž
c1.containsSlice(c2) ๅฆ‚ๆžœ c1 ๅŒ…ๅซๅบๅˆ— c2๏ผŒๅˆ™่ฟ”ๅ›ž trueใ€‚
c.count(p) ่ฎก็ฎ— c ไธญๅ…ƒ็ด ็š„ๆ•ฐ้‡๏ผŒๅ…ถไธญ p ไธบ trueใ€‚
c.distinct ่ฟ”ๅ›ž c ไธญ็š„ไธ้‡ๅค็š„ๅ…ƒ็ด ใ€‚
c.exists(p) ๅฆ‚ๆžœ้›†ๅˆไธญไปปไฝ•ๅ…ƒ็ด ็š„ p ไธบ true ๏ผŒๅˆ™่ฟ”ๅ›ž true ใ€‚
c.find(p) ่ฟ”ๅ›žๅŒน้… p ็š„็ฌฌไธ€ไธชๅ…ƒ็ด ใ€‚่ฏฅๅ…ƒ็ด ไปฅ Option[A] ็š„ๅฝขๅผ่ฟ”ๅ›žใ€‚
c.min ่ฟ”ๅ›ž้›†ๅˆไธญ็š„ๆœ€ๅฐๅ…ƒ็ด ใ€‚ ๏ผˆๅฏไปฅๆŠ›ๅ‡บ_java.lang.UnsupportedOperationException_ใ€‚๏ผ‰
c.max ่ฟ”ๅ›ž้›†ๅˆไธญ็š„ๆœ€ๅคงๅ…ƒ็ด ใ€‚ ๏ผˆๅฏไปฅๆŠ›ๅ‡บ_java.lang.UnsupportedOperationException_ใ€‚๏ผ‰
c.slice(from, to) ่ฟ”ๅ›žไปŽๅ…ƒ็ด  from ๅผ€ๅง‹ๅˆฐๅ…ƒ็ด  to ็ป“ๆŸ็š„ๅ…ƒ็ด ้—ด้š”ใ€‚
c.sum ่ฟ”ๅ›ž้›†ๅˆไธญๆ‰€ๆœ‰ๅ…ƒ็ด ็š„ๆ€ปๅ’Œใ€‚ ๏ผˆ้œ€่ฆไธบ้›†ๅˆไธญ็š„ๅ…ƒ็ด ๅฎšไน‰ Orderingใ€‚๏ผ‰

ไปฅไธ‹ๆ˜ฏไธ€ไบ›็คบไพ‹๏ผŒๅฑ•็คบไบ†่ฟ™ไบ›ๆ–นๆณ•ๅฆ‚ไฝ•ๅœจๅˆ—่กจไธŠๅทฅไฝœ๏ผš

val a = List(10, 20, 30, 40, 10)      // List(10, 20, 30, 40, 10)
a.distinct                            // List(10, 20, 30, 40)
a.drop(2)                             // List(30, 40, 10)
a.dropRight(2)                        // List(10, 20, 30)
a.dropWhile(_ < 25)                   // List(30, 40, 10)
a.filter(_ < 25)                      // List(10, 20, 10)
a.filter(_ > 100)                     // List()
a.find(_ > 20)                        // Some(30)
a.head                                // 10
a.headOption                          // Some(10)
a.init                                // List(10, 20, 30, 40)
a.intersect(List(19,20,21))           // List(20)
a.last                                // 10
a.lastOption                          // Some(10)
a.slice(2,4)                          // List(30, 40)
a.tail                                // List(20, 30, 40, 10)
a.take(3)                             // List(10, 20, 30)
a.takeRight(2)                        // List(40, 10)
a.takeWhile(_ < 30)                   // List(10, 20)

่ฟ™ไบ›ๆ–นๆณ•ๅฑ•็คบไบ† Scala ไธญ็š„ไธ€ไธชๅธธ่งๆจกๅผ๏ผšๅฏน่ฑกไธŠๅฏ็”จ็š„ๅ‡ฝๆ•ฐๅผๆ–นๆณ•ใ€‚ ่ฟ™ไบ›ๆ–นๆณ•้ƒฝไธไผšๆ”นๅ˜ๅˆๅง‹ๅˆ—่กจโ€œaโ€๏ผ› ็›ธๅ๏ผŒๅฎƒไปฌ้ƒฝ่ฟ”ๅ›ž็š„ๆ•ฐๆฎๅœจๆณจ้‡ŠๅŽๆ˜พ็คบใ€‚

่ฟ˜ๆœ‰ๆ›ดๅคšๅฏ็”จ็š„ๆ–นๆณ•๏ผŒไฝ†ๅธŒๆœ›่ฟ™ไบ›ๆ่ฟฐๅ’Œ็คบไพ‹่ƒฝ่ฎฉๆ‚จไฝ“้ชŒๅˆฐ้ข„ๅปบ้›†ๅˆๆ–นๆณ•็š„ๅผบๅคงๅŠŸ่ƒฝใ€‚

ๆžšไธพ

ๆœฌ่Š‚ๆฏ”่พƒ Python ๅ’Œ Scala 3 ไธญ็š„ๆžšไธพใ€‚

ๅˆ›ๅปบๆžšไธพ๏ผš

from enum import Enum, auto
class Color(Enum):
    RED = auto()
    GREEN = auto()
    BLUE = auto()
enum Color:
  case Red, Green, Blue

ๅ€ผๅ’Œๆฏ”่พƒ๏ผš

Color.RED == Color.BLUE  # False
Color.Red == Color.Blue  // false

ๅ‚ๆ•ฐๅŒ–ๆžšไธพ๏ผš

N/A
enum Color(val rgb: Int):
  case Red   extends Color(0xFF0000)
  case Green extends Color(0x00FF00)
  case Blue  extends Color(0x0000FF)

็”จๆˆทๅฎšไน‰ๆžšไธพๆˆๅ‘˜๏ผš

N/A
enum Planet(
    mass: Double,
    radius: Double
  ):
  case Mercury extends
    Planet(3.303e+23, 2.4397e6)
  case Venus extends
    Planet(4.869e+24, 6.0518e6)
  case Earth extends
    Planet(5.976e+24, 6.37814e6)
  // more planets ...

  // fields and methods
  private final val G = 6.67300E-11
  def surfaceGravity = G * mass /
    (radius * radius)
  def surfaceWeight(otherMass: Double)
    = otherMass * surfaceGravity

Scala ็‹ฌๆœ‰็š„ๆฆ‚ๅฟต

Scala ไธญ็š„ๆœ‰ไบ›ๆฆ‚ๅฟต็›ฎๅ‰ๅœจ Python ไธญๆฒกๆœ‰็ญ‰ๆ•ˆ็š„ๅŠŸ่ƒฝใ€‚ ่ฏท็‚นๅ‡ปไปฅไธ‹้“พๆŽฅไบ†่งฃๆ›ดๅคš่ฏฆๆƒ…๏ผš

  • ๅคงๅคšๆ•ฐไธŽไธŠไธ‹ๆ–‡ๆŠฝ่ฑก็›ธๅ…ณ็š„ๆฆ‚ๅฟต๏ผŒๅฆ‚ๆ‰ฉๅฑ•ๆ–นๆณ•ใ€็ฑปๅž‹็ฑปใ€้šๅผๅ€ผ
  • Scala ๅ…่ฎธๅคšๅ‚ๆ•ฐๅˆ—่กจ๏ผŒไปŽ่€Œๅฎž็Žฐ้ƒจๅˆ†ๅบ”็”จๅ‡ฝๆ•ฐ็ญ‰็‰นๆ€ง๏ผŒไปฅๅŠๅˆ›ๅปบ่‡ชๅทฑ็š„ DSL ็š„่ƒฝๅŠ›
  • ๆ ทไพ‹็ฑป๏ผŒๅฏนไบŽๅ‡ฝๆ•ฐๅผ็ผ–็จ‹ๅ’ŒๆจกๅผๅŒน้…้žๅธธๆœ‰็”จ
  • ๅˆ›ๅปบ่‡ชๅทฑ็š„ๆŽงๅˆถ็ป“ๆž„ๅ’Œ DSL ็š„่ƒฝๅŠ›
  • ๆจกๅผๅŒน้…ๅ’Œ match ่กจ่พพๅผ
  • ๅคš้‡็ญ‰ๅผ๏ผšๅœจ็ผ–่ฏ‘ๆ—ถๆŽงๅˆถๅ“ชไบ›็ญ‰ๅผๆฏ”่พƒๆœ‰ๆ„ไน‰็š„่ƒฝๅŠ›
  • ไธญ็ผ€ๆ–นๆณ•
  • ๅฎๅ’Œๅ…ƒ็ผ–็จ‹

Scala ๅ’Œ่™šๆ‹Ÿ็Žฏๅขƒ

ๅœจ Scala ไธญ๏ผŒๆ— ้œ€ๆ˜พๅผ่ฎพ็ฝฎ Python ่™šๆ‹Ÿ็Žฏๅขƒ็š„็ญ‰ไปท็‰ฉใ€‚้ป˜่ฎคๆƒ…ๅ†ตไธ‹๏ผŒScala ๆž„ๅปบๅทฅๅ…ท็ฎก็†้กน็›ฎไพ่ต–้กน๏ผŒๅ› ๆญค็”จๆˆทไธๅฟ…่€ƒ่™‘ๆ‰‹ๅŠจๅฎ‰่ฃ…ๅŒ…ใ€‚ไพ‹ๅฆ‚๏ผŒไฝฟ็”จ sbt ๆž„ๅปบๅทฅๅ…ท๏ผŒๆˆ‘ไปฌๅœจ libraryDependencies ่ฎพ็ฝฎไธ‹็š„ build.sbt ๆ–‡ไปถไธญๆŒ‡ๅฎšไพ่ต–ๅ…ณ็ณป๏ผŒ็„ถๅŽๆ‰ง่กŒ

cd myapp
sbt compile

่‡ชๅŠจ่งฃๆž่ฏฅ็‰นๅฎš้กน็›ฎ็š„ๆ‰€ๆœ‰ไพ่ต–้กนใ€‚ ไธ‹่ฝฝไพ่ต–็š„ไฝ็ฝฎๅพˆๅคง็จ‹ๅบฆไธŠๆ˜ฏๆž„ๅปบๅทฅๅ…ท็š„ไธ€ไธชๅฎž็Žฐ็ป†่Š‚๏ผŒ็”จๆˆทไธๅฟ…็›ดๆŽฅไธŽ่ฟ™ไบ›ไธ‹่ฝฝ็š„ไพ่ต–ไบคไบ’ใ€‚ ไพ‹ๅฆ‚๏ผŒๅฆ‚ๆžœๆˆ‘ไปฌๅˆ ้™คๆ•ดไธช sbt ไพ่ต–้กน็ผ“ๅญ˜๏ผŒๅˆ™ๅœจ้กน็›ฎ็š„ไธ‹ไธ€ๆฌก็ผ–่ฏ‘ๆ—ถ๏ผŒsbt ไผš่‡ชๅŠจ้‡ๆ–ฐ่งฃๆžๅนถๅ†ๆฌกไธ‹่ฝฝๆ‰€ๆœ‰ๅฟ…้œ€็š„ไพ่ต–้กนใ€‚

่ฟ™ไธŽ Python ไธๅŒ๏ผŒ้ป˜่ฎคๆƒ…ๅ†ตไธ‹๏ผŒไพ่ต–้กนๅฎ‰่ฃ…ๅœจ็ณป็ปŸ่Œƒๅ›ดๆˆ–็”จๆˆท่Œƒๅ›ด็š„็›ฎๅฝ•ไธญ๏ผŒๅ› ๆญค่ฆๅœจๆฏไธช้กน็›ฎ็š„ๅŸบ็ก€ไธŠ่Žทๅพ—้š”็ฆป็Žฏๅขƒ๏ผŒๅฟ…้กปๅˆ›ๅปบ็›ธๅบ”็š„่™šๆ‹Ÿ็Žฏๅขƒใ€‚ ไพ‹ๅฆ‚๏ผŒไฝฟ็”จ venv ๆจกๅ—๏ผŒๆˆ‘ไปฌๅฏไปฅๅƒ่ฟ™ๆ ทไธบ็‰นๅฎš้กน็›ฎๅˆ›ๅปบไธ€ไธช

cd myapp
python3 -m venv myapp-env
source myapp-env/bin/activate
pip install -r requirements.txt

่ฟ™ไผšๅœจ้กน็›ฎ็š„ myapp/myapp-env ็›ฎๅฝ•ไธ‹ๅฎ‰่ฃ…ๆ‰€ๆœ‰ไพ่ต–้กน๏ผŒๅนถๆ›ดๆ”น shell ็Žฏๅขƒๅ˜้‡ PATH ไปฅไปŽ myapp-env ๆŸฅๆ‰พไพ่ต–้กนใ€‚ ๅœจ Scala ไธญ๏ผŒ่ฟ™ไบ›ๆ‰‹ๅŠจ่ฟ‡็จ‹้ƒฝไธๆ˜ฏๅฟ…้œ€็š„ใ€‚

Contributors to this page: