Slide 1

Slide 1 text

5SBJUJO4DBMB  -JWFTFOTF4*$1۞ָ෦-5େձ ౡ઒༔ଠ

Slide 2

Slide 2 text

4DBMB

Slide 3

Slide 3 text

CMPHFOGSBODIJTFENJOEDPNTDBMBOPUGVODUJPOBM

Slide 4

Slide 4 text

4DBMB

Slide 5

Slide 5 text

+BWB

Slide 6

Slide 6 text

w JOUFSGBDFͷσϑΥϧτ࣮૷ w ϥϜμࣜ w ߴ֊ؔ਺ w ܕਪ࿦ͷڧԽ w ฒྻੑͷڧԽʢฒྻίϨΫγϣϯɺ$PNQMFUF'VUVSFʣ w ஗ԆධՁ w 4USFBN w 0QUJPOBM w FUD IUUQXXXJOGPRDPNKQBSUJDMFTKBWBWTTDBMB IUUQOFXTNZOBWJKQTQFDJBMKBWB

Slide 7

Slide 7 text

ͦΕͰ΋4DBMB Λ࢖͍͍͔ͨʁ

Slide 8

Slide 8 text

͜Μͳࢿྉ࡞Δ͘Β͍ ͔ͩΒΘ͔Γ·͢ΑͶʁ

Slide 9

Slide 9 text

ຊ೔ͷςʔϚ ʰτϨΠτʱ

Slide 10

Slide 10 text

ͳͥτϨΠτΛ ͱΓ͋͛Δ͔ʁ

Slide 11

Slide 11 text

w τϨΠτ͸4DBMBͷΦϒδΣΫτࢦ޲ݴޠͱ ͯ͠ͷϋΠϥΠτͷҰͭͩͱࢥ͏ɻ w "DUPS΍Β'VUVSF΍ΒΛ࢖ͬͨฒߦੑ੍ޚ ͷར఺͸ଟ͍͚Ͳɺଟ͘ͷ৬ۀϓϩάϥϚ͕ ௚໘͢Δ՝୊͸ɺ001Λ࢖ͬͨιϑτ΢ΣΞ ՝୊ͷղܾʹ͋ΔͷͰ͸ͳ͍͔ͱࢥ͏ɻ w ͱ͍͏͜ͱͰɺ4DBMBͷݴޠ঺հͱͯ͠τϨ Πτ͔ΒऔΓ্͛ͯΈΔɻ

Slide 12

Slide 12 text

$ scala scala> “trait”.translate(“ja_JP”) res0: List[String] = List(ಛੑ, ಛ௃, ಛ৭) IUUQFKKFXFCMJPKQDPOUFOUUSBJU

Slide 13

Slide 13 text

τϨΠτͱ͸ʁ

Slide 14

Slide 14 text

ΫϥεͷΑ͏ʹɺϝιουͱϑΟʔ ϧυͷఆٛΛΧϓηϧԽͨ͠΋ͷ Ͱɺ4DBMBʹ͓͚Δίʔυ࠶ར ༻ͷجຊ୯ҐʢίοϓຊΑΓʣ

Slide 15

Slide 15 text

trait Philosophical { def philosophize() { println(“զࢥ͏ނʹզ͋Γ”) } }

Slide 16

Slide 16 text

ΫϥεʹϛοΫεΠϯ w ந৅ϝϯόʔ͚ͩΛએݴͯ͠ɺϛοΫεΠϯ͢Δ ΫϥεͰͷ࣮૷Λڧ੍ w ࣮૷Λఆٛ͢Δ͜ͱ΋Ͱ͖Δ w ෳ਺ͷτϨΠτΛಉ࣌ʹϛοΫεΠϯ͢Δ͜ͱ΋ Ͱ͖Δ w ϛοΫεΠϯͨ͠ϝιουΛΦʔόʔϥΠυͨ͠ ΓɺTVQFSݺͼग़͢͠Δ͜ͱ΋Ͱ͖Δ

Slide 17

Slide 17 text

trait A { def f() // ந৅ϝιου } ! trait B { def foo() = println("foo") } ! trait C { def bar() = println("bar") } ! class D extends A with B with C { def f() = foo() // ந৅ϝιουΛ࣮૷ˍτϨΠτBͷfooΛݺͼग़͠ override def bar() = { // τϨΠτCͷbarϝιουΛoverride super.bar() // τϨΠτCͷbarϝιουΛݺͼग़͠ println("BAR") } }

Slide 18

Slide 18 text

Πϯελϯεੜ੒࣌ʹ ϛοΫεΠϯ

Slide 19

Slide 19 text

class Japanese ! trait Kansai ! trait Kanto ! val me = new Japanese with Kansai with Kanto

Slide 20

Slide 20 text

TVQFSݺͼग़͠ͷઢܗԽ

Slide 21

Slide 21 text

class Animal ! trait HasLegs extends Animal ! trait FourLegged extends HasLegs ! trait Furry extends Animal ! class Cat extends Animal with Furry with FourLegged

Slide 22

Slide 22 text

"OJNBM )BT-FHT 'VSSZ 'PVS-FHHFE $BU DMBTT$BUFYUFOET"OJNBM XJUI'VSSZXJUI'PVS-FHHFE $BU'PVS-FHHFE )BT-FHHFE'VSSZ"OJNBM ઢܗԽ

Slide 23

Slide 23 text

ੵΈॏͶՄೳͳมߋ

Slide 24

Slide 24 text

abstract class IntQueue { def put(x: Int) def get(): Int } ! import scala.collection.mutable.ArrayBuffer class BasicIntQueue { private val but = new ArrayBuffer[Int] def put(x: Int) = but += x def get() = but.remove(0) } ! trait Doubling extends IntQueue { abstract override def put(x: Int) = { super.put(2 * x) } } ! trait Filtering extends IntQueue { abstract override def put(x: Int) = { super.put(x.abs) } }

Slide 25

Slide 25 text

val q1 = new BasicIntQueue q1.put(10) q1.get() // Int = 10 ! val q2 = new BasicIntQueue with Doubling q2.put(10) q2.get() // Int = 20 ! val q3 = new BasicIntQueue with Doubling with Filtering q3.put(-10) q3.get() // Int = 20 ʰ4DBMBεέʔϥϒϧϓϩάϥϛϯάʱষΑΓ

Slide 26

Slide 26 text

"01ͬΆ͍͜ͱ΋Մೳ ࢀߟ IUUQEIBUFOBOFKQKJLP

Slide 27

Slide 27 text

trait Executor { def execute(): Unit } ! trait LoggableExecutor extends Executor { def log(() => Unit):Unit = … abstract override def execute(): Unit { log { super.execute } } } ! class SomeExecutor extends Executor { def execute(): Unit = … } ! val e = new SomeExecutor with LoggableExecutor e.execute

Slide 28

Slide 28 text

ࣗ෼ܕΞϊςʔγϣϯ

Slide 29

Slide 29 text

trait A { def foo() = “foo” } ! trait B { def bar() = “bar” } ! trait C { this: A with B => def f() = foo + bar } ! val c = new C with A with B c.f // String = foobar

Slide 30

Slide 30 text

5SBJU$ͷΠϯελϯεΛੜ੒͢ Δʹ͸"ͱ#ΛϛοΫεΠϯ͠ͳ ͚Ε͹ͳΒͳ͍ɻ$͔Β"ͱ#΁ ͷґଘੑΛ໌ࣔ͢Δ͜ͱ͕Ͱ͖Δɻ

Slide 31

Slide 31 text

$BLF1BUUFSOͰ%*

Slide 32

Slide 32 text

class User ! trait UserRepositoryComponent { val repos: UserRepository trait UserRepository { def findById(id: Int): User } } ! class UserService { this: UserRepositoryComponent => def findById(id: Int): User = { repos.findById(id) } }

Slide 33

Slide 33 text

trait MySQLUserRepositoryComponent extends UserRepository Component { val repos = new MySQLUserRepository class MySQLUserRepository = { def findById(id: Int): User = … } } ! val userService = new UserService with MySQLUserRepositoryComponent ! val user = userService.findById(1)

Slide 34

Slide 34 text

஫ʣDBLFQBUUFSO ʹ͍ͭͯ͸໰୊఺΋ࢦఠ ͞Ε͍ͯΔͷͰ஫ҙ

Slide 35

Slide 35 text

IUUQUPHFUUFSDPNMJ

Slide 36

Slide 36 text

·ͱΊ

Slide 37

Slide 37 text

τϨΠτ࢖͏ͱ001͕ؾ ࣋ͪΑ͘ͳΔɻ͔΋Ͷɻ