Wednesday, June 04, 2008

Structural Type

เมื่อก่อนเวลาเขียนโปรแกรมใน Java, สิ่งแรกที่นึกขึ้นมาในหัวก็คือการกำหนด Interface
ยังขำที่โปรแกรม ruby แรกที่เขียน ก็พยายามจะ define interface ทั้งๆที่ ruby มันไม่มี interface แถมยังทำ duck typing ได้
วันก่อนอ่านเจอ feature ของ scala ที่ชื่อ Structural types ใน Scala
รู้สึกว่า งามจริงๆ

ดูตัวอย่างการใช้ Structural Type
class Person {
def say():String = "hi"
}

class Duck {
def say():String = "Quack"
}

object Test {
def play(element: {def say():String}) = {
System.out.println(element.say());
}

def main(args : Array[String]) : Unit = {
play(new Person())
play(new Duck())
}
}


Note: สำหรับคนที่ไม่คุ้นกับ Scala
def คือการกำหนด method, เครื่องหมาย : คือการกำหนด type
กรณี code ข้างล่างนี้, method say มี return type เป็น String
def say():String = "Quack"

ส่วน Object {...} ก็คือ Singleton Object

Related link from Roti

4 comments:

iporsut said...

งามแต้ๆจริงๆ
ตรง play มันบอกว่า
จะรับ element class อะไรก็ได้
ที่มีการ def say เอาไว้ใช่ไหมครับ

ผมเข้าใจถูกหรือเปล่า

llun said...

อืม ตอนผมเขียน python ผมก็ยังติดที่จะเขียน Template class ขึ้นมาอยู่ดีแฮะ ไม่รู้จะแก้ยังไงให้ชินกับการไม่มี interface ดี ><"

polawat phetra said...

iportsut: แม่นแล้ว

deans4j said...

งามขนาด :D

ใน JSR 292 เรื่อง invokedynamic ก็มีความพยายามดัน ให้ VM ช่วยเรื่อง structural type อีกแรงเหมือนกันครับ

เรื่องที่ maybe ก็มีเรื่อง tail recursion ที่ถกกันอยู่เพราะเค้าว่ามันน่ากลัวกับ security model ที่ใช้

:D