ã¯ããã«ïŒScalaãšã¯
ããã°ã©ãã³ã°èšèªã®äžçã«ã¯ããŸããŸãå€ãã®éžæè¢ãçŸããŠããŸãããã®äžã§ã€ããªã·ã®èšèªãšããŠæ³šç®ãéããŠããã®ãã”Scala”ã§ãã
Scalaã®æŠèŠ
Scalaã¯ãã«ããã©ãã€ã ãªããã°ã©ãã³ã°èšèªã§ããªããžã§ã¯ãæåãšé¢æ°åã®ç¹æ§ãäž¡ç«ãããèšèªã§ãããžã£ã¯ç°å¢ã§åäœãããããJavaãšã®çžäºéçšæ§ãé«ãã®ãç¹åŸŽã§ãããJavaã®ã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ããã®ãŸãŸå©çšããããšãå¯èœã§ãããŸããéçåä»ããæ¡çšããããšã§ãå®è¡åã«ããã°ã©ã ã®ãšã©ãŒãæ€åºã§ããå®å šæ§ãé«ãã®ãé·æã§ãã
Scalaã®æŽå²ãšç¹åŸŽ
Scalaã¯2004幎ã«ãšããã©ãŠïŒEPFLïŒEcole Polytechnique Federale de LausanneïŒã®ããŒãã£ã³ã»ãªãŒããŒã¹ããŒææã«ããéçºãããŸãããå称㯔Scalable Language”ã®ç¥ã§ã“å°ããªã¹ã¯ãªãã”ãã”倧èŠæš¡ãªãšã³ã¿ãŒãã©ã€ãºã·ã¹ãã ”ãŸã§ãèŠæš¡ã«å¿ããŠé©å¿ã§ãããšããæå³ã蟌ããããŠããŸãã
ãŸããScalaã®ç¹åŸŽãšããŠã¯ã以äžã®3ã€ãæããããŸãã
- éçåä»ãïŒå®è¡åã«å€æ°ãæ»ãå€ã®åããã§ãã¯ããããšã§ãã©ã³ã¿ã€ã ãšã©ãŒãé²ããŸãã
- é¢æ°åãšãªããžã§ã¯ãæåã®çµ±åïŒã©ã¡ãã®ãã©ãã€ã ã䜿ãããªãããšã§ãããå¹ççãªã³ãŒããæžãããšãã§ããŸãã
- Javaãšã®èŠªåæ§ïŒJavaã©ã€ãã©ãªã®å©çšãJavaãšã®ã¯ãã¹ã³ã³ãã€ã«ãå¯èœãªãããJavaãšã³ã·ã¹ãã ãšã®é©åæ§ãé«ãã§ãã
ãªãScalaãåŠã¶ã¹ãã
ããŠãScalaãåŠã¶ã¹ãçç±ã¯äœã§ããããïŒããã¯ãScalaãéçåä»ãã§ãããªããè¡šçŸåãé«ãããã§ããéçåä»ãã«ãããã³ã³ãã€ã«æã«ãšã©ãŒãæ€åºã§ãããããã©ã³ã¿ã€ã ãšã©ãŒãå€§å¹ ã«æžããŸãã
ãŸããScalaã¯é¢æ°åããã°ã©ãã³ã°ãšãªããžã§ã¯ãæåããã°ã©ãã³ã°ã®äž¡æ¹ãçµ±åããŠãããããããããã®è¯ãæãåãå ¥ããæè»ãªããã°ã©ãã³ã°ãå¯èœã§ããããã«ãããå質ã®é«ãã³ãŒããå¹çããæžãããšãã§ããŸãã
ããã«ãã¹ã±ãŒã©ãã«ãªèšèšã«ãããScalaã¯å°ããªã¹ã¯ãªãããã倧èŠæš¡ãªã·ã¹ãã ãŸã§å¯Ÿå¿å¯èœã§ããããã«ãããã¹ã¯ãªããã©ã€ã¯ãªã³ãŒãã£ã³ã°ãããå ç¢ãªãšã³ã¿ãŒãã©ã€ãºã·ã¹ãã ã®éçºãŸã§ãå€å²ã«ãããçšéã§Scalaã掻çšããããšãã§ããŸãã
ããã«ãScalaã¯AkkaãApache Sparkãšãã£ã人æ°ã®ãã¬ãŒã ã¯ãŒã¯ã§äœ¿çšãããŠãããããããåŠã¶ããã®è¶³ãããã«ããªããŸãã
Scalaã®ã€ã³ã¹ããŒã«
ãã®ç« ã§ã¯ãScalaã®ã€ã³ã¹ããŒã«æ¹æ³ãšããã«å ç«ã€Javaã®ã€ã³ã¹ããŒã«æ¹æ³ãããã«ã¯Scalaã®éçºç°å¢ã®èšå®æ¹æ³ã«ã€ããŠå ·äœçã«èª¬æããŸããScalaã¯Javaã®äžã«æ§ç¯ãããŠããèšèªã§ããããããŸãæåã«Javaã®ã€ã³ã¹ããŒã«ãå¿ èŠãšãªããŸãã
Javaã®ã€ã³ã¹ããŒã«
Javaã®å ¬åŒãµã€ãããJava Development KitïŒJDKïŒãããŠã³ããŒãããŸããããææ°å®å®çãéžã³ãèªèº«ã®OSã«åèŽãããã®ãéžæããã°è¯ãã§ããããããŠã³ããŒããå®äºãããã€ã³ã¹ããŒã©ãå®è¡ããæ瀺ã«åŸã£ãŠã€ã³ã¹ããŒã«ãé²ããŠãã ããã
ã€ã³ã¹ããŒã«åŸã¯ãã³ãã³ãããã³ããïŒã¿ãŒããã«ïŒãéããjava -versionããšå ¥åããŠç¢ºèªããŸããããé©åã«ã€ã³ã¹ããŒã«ãå®äºããŠããã°ãJavaã®ããŒãžã§ã³æ å ±ã衚瀺ãããã¯ãã§ãã
Scalaã®ã€ã³ã¹ããŒã«æ¹æ³
ç¶ããŠãScalaã®ã€ã³ã¹ããŒã«ã«ç§»ããŸããScalaã®å ¬åŒãµã€ãããææ°å®å®çã®ScalaãããŠã³ããŒãããåæ§ã«ã€ã³ã¹ããŒã©ãå®è¡ããŸããScalaã®ã€ã³ã¹ããŒã«ãæ¯èŒçç°¡åã«è¡ãããšãã§ããŸãã
ã€ã³ã¹ããŒã«ãå®äºããããåããã³ãã³ãããã³ããïŒã¿ãŒããã«ïŒãéããscala -versionããšå ¥åããŠç¢ºèªããŸãããããã¡ããJavaåæ§ãé©åã«ã€ã³ã¹ããŒã«ãå®äºããŠããã°Scalaã®ããŒãžã§ã³æ å ±ã衚瀺ãããŸãã
Scalaã®ç°å¢èšå®
ããã§ã¯æåŸã«Scalaã®éçºç°å¢ã®èšå®ãè¡ããŸããScalaã®éçºã«ã¯çµ±åéçºç°å¢ïŒIDEïŒã䟿å©ã§ãç¹ã« IntelliJ IDEA ã Scala IDE for Eclipse ãäžè¬çã«äœ¿ãããŸãã
äž¡æ¹ãšãèªèº«ã®OSã«åã£ããã®ãéžãã§ããŠã³ããŒãããã€ã³ã¹ããŒã©ãå®è¡ããŸããéçºç°å¢ã®èšå®ã¯æ¯èŒçç°¡åã§ãåºæ¬çã«ã¯ã€ã³ã¹ããŒã©ã®æ瀺ã«åŸã£ãŠé²ããŠããã°åé¡ãããŸããããŸããå ·äœçãªäœ¿çšæ¹æ³ã¯ããããå ¬åŒãµã€ãã®ããã¥ã¡ã³ããªã©ã§ç¢ºèªã§ããŸãã
以äžãScalaã®ã€ã³ã¹ããŒã«ãšç°å¢èšå®ã§ãã次ã®ç« ããã¯ããã®ç°å¢ãçšããŠScalaã®åºæ¬çãªããã°ã©ãã³ã°æ¹æ³ãåŠãã§ãããŸãããã
Scalaã®åºæ¬æŠå¿µ
Scalaã§ã¯ãããã°ã©ã ãå¶åŸ¡ããããã®ããŸããŸãªåºæ¬çãªä»çµã¿ãæäŸãããŠããŸãããã®äžæ žããªãã®ãå€æ°ãšå®æ°ãããŒã¿åãšãªãã©ã«ãæŒç®åãšæŒç®ããããŠå¶åŸ¡æ§æã§ãããããã«ã€ããŠç解ãæ·±ããScalaã®é åãåŒãåºããŸãããã
å€æ°ãšå®æ°
å€æ°ãšã¯ãããã°ã©ã ã®å®è¡äžã«ãã®å€ãå€æŽå¯èœãªããŒã¿ãæ ŒçŽããããã®ãã®ã§ãã
Scalaã§ã¯ãå€æ°ã宣èšããããã«varããŒã¯ãŒãã䜿çšããŸããããšãã°ããvar a = 1ããšããã³ãŒãã¯ãå€1ãæã€å€æ°aã宣èšããŸãã
äžæ¹ãå®æ°ã¯å€æ°ãšã¯ç°ãªããäžåºŠå€ãèšå®ããããšãã以éå€æŽããããšãã§ããªãããŒã¿ãæããŸããScalaã§ã¯ãå®æ°ã宣èšããããã«valããŒã¯ãŒãã䜿çšããŸããããšãã°ããval b = 2ããšããã³ãŒãã¯ãå€2ãæã€å®æ°bã宣èšããŸãã
ããŒã¿åãšãªãã©ã«
Scalaã§ã¯ãæŽæ°ã¯Intåãå®æ°ã¯Doubleåãæååã¯Stringåãè«çå€ã¯Booleanåãšããããã«ãããŒã¿ã®çš®é¡ã«å¿ããããŒã¿åãååšããŸãããŸããçŽæ¥ã³ãŒãäžã«èšè¿°ãããæ°å€ãæååãªã©ã®ããŒã¿ããªãã©ã«ãšåŒã³ãŸãã
æŒç®åãšæŒç®
Scalaã§ã¯ãååæŒç®ãæ¯èŒãè«çæŒç®ãªã©ãäžè¬çãªæŒç®åã䜿çšã§ããŸãããããã¯ãå€æ°ãå®æ°ããªãã©ã«ãšåãããŠäœ¿çšããããŸããŸãªæŒç®ãè¡ããŸããããšãã°ããa + bãããa == bããªã©ããããŸãã
å¶åŸ¡æ§æïŒifæãforæãwhileæïŒ
Scalaã§ã¯ãããã°ã©ã ã®æµããå¶rolããããã®å¶åŸ¡æ§æãè±å¯ã«æäŸãããŠããŸãããã®äžã§ãåºæ¬ãšãªãã®ãifæãforæãwhileæã§ãã
ifæã¯æ¡ä»¶ã«å¿ããåŠçãè¡ããforæã¯ç¹°ãè¿ãåŠçãè¡ããwhileæã¯æ¡ä»¶ãæºãããããŸã§ç¹°ãè¿ãåŠçãè¡ããŸããããããçµã¿åãããããšã§ãæè»ãªããã°ã©ã ãäœæããããšãå¯èœã§ãã
ããããã®åºæ¬æŠå¿µãé ã«èŠãŠããããšã§ãScalaããã°ã©ãã³ã°ã®åºç€ãåºããããšãã§ããŸãããã®åºç€ãããããšã§ãããå¿çšçãªå 容ã«é²ãæºåãæŽããŸãã
Scalaã®é¢æ°ãšã¡ãœãã
Scalaã®é¢æ°ãšã¡ãœããã«ã€ããŠã¯ãä»ã®å€ãã®ããã°ã©ãã³ã°èšèªãšåæ§ã«éèŠãªååšã§ããã§ã¯ãScalaã§ã®é¢æ°ãã¡ãœããã¯ã©ã®ããã«å®çŸ©ããã©ã®ããã«äœ¿çšããã®ãã次ã«èŠãŠãããŸãããã
é¢æ°ã®å®çŸ©ãšå©çšæ¹æ³
Scalaã®é¢æ°ã¯ä»¥äžã®ããã«å®çŸ©ããŸãããdefãã§å§ãŸããé¢æ°åããã©ã¡ãŒã¿ãªã¹ããæ»ãå€ã®åããããŠé¢æ°ã®æ¬äœãšç¶ããŸããæ»ãå€ã¯=ã®åŸã«èšè¿°ãããæåŸã«è©äŸ¡ãããåŒããã®ãŸãŸæ»ãå€ãšãªããŸãã
def é¢æ°å(åŒæ°å1: å1, åŒæ°å2: å2,...): æ»ãå€ã®å = { åŠç return æ»ãå€ }
å®éã«ã2ã€ã®æŽæ°ãå ç®ããé¢æ°ãaddããå®çŸ©ããŠã¿ãŸãããã
def add(x: Int, y: Int): Int = { return x + y }
é¢æ°ã¯ãã®ååãšåŒæ°ãæ¬åŒ§ã§å²ãã§åŒã³åºããŸããäžèšã®é¢æ°ã¯ä»¥äžã®ããã«åŒã³åºããŸãã
val result = add(3, 7)
ã¡ãœããã®å®çŸ©ãšå©çšæ¹æ³
次ã«ãScalaã®ã¡ãœããã«ã€ããŠã§ããã¡ãœããã¯ã¯ã©ã¹ããªããžã§ã¯ãã®äžã«å®çŸ©ããããã®ã¯ã©ã¹ããªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ããåŒã³åºãããšãã§ããŸããã¡ãœããã®æ§æã¯é¢æ°ãšéåžžã«äŒŒãŠããŸããããã¯ãããŒã¯ãŒããdefãã§éå§ããã¡ãœããåãåŒæ°ãªã¹ããæ»ãå€ã®åãšã¡ãœããã®æ¬äœãç¶ããŸãã
def ã¡ãœããå(ãã©ã¡ãŒã¿:å): æ»ãå€ã®å = { åŠç return æ»ãå€ }
以äžã«ãæŽæ°ã2åã«ããã¡ãœãããæã€ã¯ã©ã¹ãIntDoublerããå®çŸ©ããŠã¿ãŸãã
class IntDoubler { def double(x: Int): Int = { return x * 2 } }
ãã®ã¡ãœããã¯ãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ããåŒã³åºãããšãã§ããŸãã
val doubler = new IntDoubler val result = doubler.double(5)
ã©ã ãïŒç¡åé¢æ°ïŒãšé«éé¢æ°
Scalaã«ã¯ã©ã ãåŒïŒç¡åé¢æ°ïŒãšåŒã°ããæ©èœããããŸããããã¯ãååãæããªãé¢æ°ã®ããšãæããŸããäžåºŠã ã䜿çšãããããªå°ããªé¢æ°ã«é¢ããŠã¯ãç¡åé¢æ°ã䜿ã£ãŠç°¡æœã«èšè¿°ããããšãã§ããŸãã
val add = (x: Int, y: Int) => x + y
ãŸããScalaã§ã¯é¢æ°ãåŒæ°ã«ãšã£ãããæ»ãå€ãšããŠè¿ãããã§ããŸãããã®ãããªé¢æ°ãé«éé¢æ°ãšåŒã³ãŸãã以äžã«ãé¢æ°ãåŒæ°ã«åãé«éé¢æ°ãprocessããå®çŸ©ããŠã¿ãŸãããã
def process(f: (Int, Int) => Int, x: Int, y: Int): Int = { return f(x, y) }
ãã®é¢æ°ã¯ãå¥ã®é¢æ°fãš2ã€ã®æŽæ°ãåŒæ°ã«ãšããé¢æ°fã2ã€ã®æŽæ°ã«é©çšããçµæãè¿ããŸããããã䜿çšããŠãå ã»ã©ã®addé¢æ°ã䜿ã£ãŠã¿ããšã以äžã®ããã«ãªããŸãã
val result = process(add, 3, 7)
ãã®ããã«ãé¢æ°ãšã¡ãœãããç解ã掻çšããããšã¯ãScalaããã°ã©ãã³ã°ã®æ ¹å¹¹ãšãªãæŠå¿µã§ãã
Scalaã®ãªããžã§ã¯ãæå
ããã°ã©ãã³ã°èšèªã®ç解ãæ·±ããäžã§ããªããžã§ã¯ãæåã®æŠå¿µã¯é¿ããŠã¯éããªãé åãšãªããŸããããã§ã¯ãScalaã§ã©ã®ããã«ãªããžã§ã¯ãæåãæ±ãã®ãã«ã€ããŠè§£èª¬ããŠãããŸãããã
ã¯ã©ã¹ã®å®çŸ©ãšã€ã³ã¹ã¿ã³ã¹çæ
Scalaã§ã¯ã©ã¹ãå®çŸ©ããã«ã¯ãclassããŒã¯ãŒãã䜿çšããŸããã¯ã©ã¹ã¯ãªããžã§ã¯ãã®èšèšå³ã®ãããªãã®ã§ããã®ã¯ã©ã¹ããçæããããªããžã§ã¯ãïŒã€ã³ã¹ã¿ã³ã¹ïŒã¯ãã¯ã©ã¹ã§å®çŸ©ãããããããã£ãã¡ãœãããæã¡ãŸãã
class MyClass { var myVar: Int = 0 def myMethod(): Unit = { println("Hello, World!") } } val myObject = new MyClass()
äžèšã®äŸã§ã¯ãMyClassãšããã¯ã©ã¹ãå®çŸ©ãããã®ã¯ã©ã¹ããmyObjectãšããã€ã³ã¹ã¿ã³ã¹ãçæããŠããŸãã
ç¶æ¿ãšãªãŒããŒã©ã€ã
Scalaã§ã¯ãä»ã®ã¯ã©ã¹ã®ããããã£ãã¡ãœãããåŒãç¶ãããã«extendsããŒã¯ãŒããçšããŠç¶æ¿ãå¯èœã§ãããŸãã芪ã¯ã©ã¹ã®ã¡ãœãããåã¯ã©ã¹ã§å¥ã®åäœã«å€æŽãããå Žåã¯ãoverrideããŒã¯ãŒããçšããŠãªãŒããŒã©ã€ãããŸãã
class ParentClass { def greet(): Unit = { println("Hello from ParentClass") } } class ChildClass extends ParentClass { override def greet(): Unit = { println("Hello from ChildClass") } } val childObject = new ChildClass() childObject.greet()
äžèšã®äŸã§ã¯ãChildClassãParentClassãç¶æ¿ãã芪ã¯ã©ã¹ã®greetã¡ãœããããªãŒããŒã©ã€ãããŠããŸãã
æœè±¡ã¯ã©ã¹ãšãã¬ã€ã
Scalaã§ã¯ãabstractããŒã¯ãŒãã䜿ã£ãŠæœè±¡ã¯ã©ã¹ãå®çŸ©ã§ããŸããæœè±¡ã¯ã©ã¹ã¯å ·äœçãªå®è£ ãæããªãã¡ãœããïŒæœè±¡ã¡ãœããïŒãæã€ããšãã§ãããããå ·è±¡ã¯ã©ã¹ã§ãªãŒããŒã©ã€ãããŸãã
äžæ¹ããã¬ã€ãã¯æœè±¡ã¯ã©ã¹ãšäŒŒãŠããŸãããè€æ°ã®ãã¬ã€ããäžã€ã®ã¯ã©ã¹ã§ç¶æ¿ããããšãå¯èœãªç¹æ§ãæã£ãŠããŸããããã«ãããJavaã®ãã€ã³ã¿ãŒãã§ãŒã¹ããšãæœè±¡ã¯ã©ã¹ãã®ç¹æ§ãå Œãåããããšãã§ããŸãããã¬ã€ãã®å®çŸ©ã«ã¯traitããŒã¯ãŒãã䜿çšããŸãã
ãªããžã§ã¯ããšã³ã³ãããªã³ãªããžã§ã¯ã
Scalaã«ã¯ãJavaãC++ã®staticã¡ãœããã®ãããªæ©èœãæäŸãããªããžã§ã¯ããšããæŠå¿µããããŸããããã¯ãã¯ã©ã¹ãšååã®ãªããžã§ã¯ããå®çŸ©ãããã®ã¯ã©ã¹ã®staticã¡ãœãããæš¡å£ããããšã§å®çŸããŠããŸãããªããžã§ã¯ãããŒã¯ãŒããçšããŠå®çŸ©ããååã®ã¯ã©ã¹ãšãªããžã§ã¯ããå®çŸ©ããå Žåãããããã³ã³ãããªã³ã¯ã©ã¹ãšã³ã³ãããªã³ãªããžã§ã¯ããšåŒã³ãŸãã
Scalaã®ããŒã¿åŠç
Scalaã§ã¯ããšãŠã匷åãªããŒã¿åŠçæ©èœãæäŸãããŠããŸãããã®äžã§ããããã§ã¯ãã³ã¬ã¯ã·ã§ã³ããšããªãã·ã§ã³åãã解説ããŸãããããã®æ©èœãç解ããé©åã«æŽ»çšããããšã§ãããå¹ççãªããã°ã©ãã³ã°ãè¡ãããšãå¯èœã«ãªããŸãã
ã³ã¬ã¯ã·ã§ã³ïŒãªã¹ããã»ããããããïŒ
Scalaã®ã³ã¬ã¯ã·ã§ã³ã«ã¯ãããŸããŸãªçš®é¡ãååšããŸãããã®äžã§ãããå©çšãããããªã¹ããããã»ãããããããããã«ã€ããŠèª¬æããŸãã
ããªã¹ããã¯ãé åºä»ããããèŠçŽ ã®éåã§ããåãèŠçŽ ã®éè€ãèš±ãããŸãã
val list: List[Int] = List(1, 2, 2, 3)
ãã»ãããã¯ãäžæãªèŠçŽ ã®éåã§ããåãèŠçŽ ã®éè€ãèš±ããããé åºãä¿èšŒãããŸããã
val set: Set[Int] = Set(1, 2, 2, 3) // ã»ããã§ã¯{1, 2, 3}ãåºåãããŸãã
ãããããã¯ãããŒãšå€ã1察1ã§å¯Ÿå¿ããèŠçŽ ã®éåã§ããããŒã¯äžæã§ãªããã°ãªããŸããã
val map: Map[String, Int] = Map("apple" -> 1, "banana" -> 2)
ã³ã¬ã¯ã·ã§ã³ã®æäœïŒmapãfilterãreduceïŒ
Scalaã®ã³ã¬ã¯ã·ã§ã³ã§ã¯ããmapãããfilterãããreduceãã®ãããªåŒ·åãªé¢æ°ãæäŸãããŠããŸãããããã®é¢æ°ãçšããããšã§ãããŒã¿ã®æäœãšæŽåœ¢ãäžæ°ã«è¡ãããããã³ãŒãã®å¯èªæ§ãå€§å¹ ã«åäžããŸãã
ãmapãé¢æ°ã¯ãã³ã¬ã¯ã·ã§ã³å ã®å šãŠã®èŠçŽ ã«å¯ŸããŠé¢æ°ãé©çšããŸãã
val list: List[Int] = List(1, 2, 3) val multipliedList = list.map(_ * 2) // List(2, 4, 6)ãåºåãããŸãã
ãfilterãé¢æ°ã¯ãã³ã¬ã¯ã·ã§ã³å ã®å šãŠã®èŠçŽ ã«å¯ŸããŠæå®ããæ¡ä»¶ãæºããèŠçŽ ã ããæœåºããŸãã
val list: List[Int] = List(1, 2, 3) val evenList = list.filter(_ % 2 == 0) // List(2)ãåºåãããŸãã
ãreduceãé¢æ°ã¯ãã³ã¬ã¯ã·ã§ã³å ã®å šãŠã®èŠçŽ ãæå®ããæŒç®ã§çµåããŸããããã§ã¯ãªã¹ãå ã®å šãŠã®æ°å€ãå ç®ããŸãã
val list: List[Int] = List(1, 2, 3) val sum = list.reduce(_ + _) // 6ãåºåãããŸãã
ãªãã·ã§ã³å
Scalaã®ãªãã·ã§ã³åã¯ãå€ãååšããªãå¯èœæ§ãè¡šçŸããŸããããã¯nullåç §ã«ããåé¡ãé¿ããã³ãŒãã®å®å šæ§ãåäžãããŸãã
ãªãã·ã§ã³åã«ã¯ããSomeå€ããŸãã¯ãNoneããå«ãŸããŸãããSomeå€ãã¯å€ãååšããããšãããNoneãã¯å€ãååšããªãããšã瀺ããŸãã
val someOption: Option[String] = Some("Scala") // å€"Scala"ãæã€Option val noneOption: Option[String] = None // å€ãæããªãOption
ãªãã·ã§ã³åã䜿ããšãnullãã§ãã¯ã«ããåé·ãªã³ãŒããé¿ãããšã©ãŒãé²ãããšãã§ããŸããOptionåã®å€ã¯ãgetOrElseãããmapãããflatMapããªã©ã®ã¡ãœããã䜿ã£ãŠæäœã§ããŸãã
val someOption: Option[String] = Some("Scala") val value = someOption.getOrElse("default") // "Scala" val noneOption: Option[String] = None val defaultValue = noneOption.getOrElse("default") // "default"
以äžãScalaã®äž»èŠãªããŒã¿åŠçã«ã€ããŠã®è§£èª¬ã§ããããŒã¿åŠçã¯ããã°ã©ãã³ã°ã®åºæ¬äžã®åºæ¬ã§ãã®ã§ããããããã£ããç解ãã掻çšããŠãããŸãããã
Scalaã®äžŠè¡åŠçãšéåæåŠç
ãã®ã»ã¯ã·ã§ã³ã§ã¯Scalaã«ãããã䞊è¡åŠçããšãéåæåŠçãã«ã€ããŠèª¬æããŸãããããã¯ããã°ã©ã ãåŠçãè¡ãé床ãé åºã管çããéèŠãªã³ã³ã»ããã§ãScalaã§ã¯å€ãã®ããŒã«ãæäŸãããŠããŸããããã§ã¯ãäž»ã«ãã¹ã¬ãããããFutureããšãPromiseãã«ã€ããŠèª¬æããŸãã
ã¹ã¬ãã
ããã°ã©ãã³ã°ã®äžçã§ã¯ããã¹ã¬ããããšã¯ããã°ã©ã å ã§åæã«å®è¡ãããè€æ°ã®äœæ¥ã®äžã€ãæããŸããäžã€ã®ããã°ã©ã å ã§è€æ°ã®ã¹ã¬ããã䜿ãããšã§ãããããã®ã¹ã¬ãããç¬ç«ããŠåäœããåæã«ã¿ã¹ã¯ãé²è¡ãããããšãå¯èœãšãªããŸãã
def thread(started: => Unit): Thread = { val t = new Thread { override def run() = started } t.start() t } val hello = thread { println("Hello World") Thread.sleep(1000) } val goodbye = thread { println("Goodbye World") Thread.sleep(1000) }
äžèšã§ã¯ã2ã€ã®ã¹ã¬ãããhelloããšãgoodbyeããããããç°ãªãã¡ãã»ãŒãžã衚瀺ããŠãã1ç§åŸ æ©ããŸãããããã®ã¹ã¬ãããç¬ç«ããŠåäœãããããçŸå®äžçã®æéã§èŠããšåæã«åŠçãé²ããããšãã§ããŸãã
FutureãšPromise
ä»æ¹ããFutureããšãPromiseãã¯éåæåŠçã«ãããŠéèŠãªåœ¹å²ãæãããŸãããFutureããšã¯ããŸã çµäºããŠããªããããããªãèšç®ãè¡šçŸããäžæ¹ã§ããã®èšç®ãå®äºããã°çµæãä¿åããŸãã
import scala.concurrent.{Future, ExecutionContext} import ExecutionContext.Implicits.global val future1 = Future { Thread.sleep(1000) println("Future1 finished!") } val future2 = Future { Thread.sleep(800) println("Future2 finished!") }
äžèšã®ããã«ãFutureã䜿çšããã°ã¹ã¬ããã®ããã«è€æ°ã®èšç®ã䞊è¡ã«è¡ãããšãå¯èœã§ãã
äžæ¹ããPromiseããšã¯æªè§£æ±ºã®ãFutureããçæããããšãã§ãããã®ãFutureãã®çµæãèšå®ããããšãã§ããŸããããã«ããããFutureãã®çµæãåçã«å¶åŸ¡ããããšãå¯èœãšãªããŸãã詳现ãªå®è£ æ¹æ³ã䜿ãæ¹ãªã©ã¯Scalaå ¬åŒããã¥ã¡ã³ããŒã·ã§ã³ãåç §ããŠãã ããã
ãããã®ã䞊è¡åŠçãããéåæåŠçãã¯ãScalaãåªç§ãªåŒ·åãªèšèªã§ããçç±ã®äžã€ã§ãããã®åãæã«å ¥ããããšã§ããé«åºŠãªããã°ã©ãã³ã°ãå¯èœãšãªãã§ãããã
Scalaã§ã®ãã¹ãæ¹æ³
ããã°ã©ãã³ã°ã«ããããã¹ãã¯éåžžã«éèŠãªã¹ãããã§ãããœãããŠã§ã¢ãæå³ããéãã«åäœããããšãæ€èšŒãããã°ãåé¡ãèŠã€ããŠä¿®æ£ããããã®æ¹æ³ã§ããScalaã§ã¯ãæ§ã ãªãã¹ãã®æ¹æ³ãæäŸãããŠããŸãããããã§ã¯ç¹ã«äžè¬çãªãåäœãã¹ãã®æžãæ¹ããšããã¢ãã¯ã®äœãæ¹ãã«ã€ããŠè§£èª¬ããŸãã
åäœãã¹ãã®æžãæ¹
äžè¬çãªãã¹ãæ¹æ³ã®äžã€ã§ããåäœãã¹ãã¯ãç¹å®ã®é¢æ°ãã¡ãœãããæ£ããåäœããããæ€èšŒããããã®ãã¹ãã§ããScalaã§ã¯ãScalaTestãšåŒã°ããã©ã€ãã©ãªã䜿çšããŠåäœãã¹ããæžãããšãäžè¬çã§ããScalaTestã¯ãæè»æ§ãšæçšæ§ãå Œãåããè±å¯ãªæ©èœãç¹åŸŽã§ããã¹ãã¹ã¿ã€ã«ã«ãã£ãŠãã¹ãã³ãŒããèªç±ã«æžãããšãã§ããŸãã
ãŸããæåã«å¿
èŠãªScalaTest
ã®ã©ã€ãã©ãªããããžã§ã¯ãã«è¿œå ããŸããããã«ããããã¹ãã³ãŒããæžãããã®APIãå©çšããããšãã§ããŸããç¶ããŠããã¹ããããé¢æ°ãã¡ãœãããå«ãã¯ã©ã¹ãŸãã¯ãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã次ã«ãtest
ã¡ãœããã䜿ã£ãŠäžã€ã®ãã¹ãã±ãŒã¹ãå®çŸ©ãããã®å
éšã§å®è¡çµæãã¢ãµãŒãããŸããã¢ãµãŒãã¯çµæã®æ€èšŒãè¡ããã®ã§ãæåŸ
ããçµæãšå®éã®çµæãæ¯èŒããŸãã
äžã€ã®äŸãæãããšãããªããŸãã
import org.scalatest._ class SampleTest extends FlatSpec with Matchers { "The 'Hello World' string" should "have length 11" in { "Hello World".length should be (11) } }
ãã®äŸã§ã¯ããHello Worldãæååã®é·ãã11ã§ããããšããã¹ãããŠããŸãããshouldããšãbeãã¡ãœããã䜿ã£ãŠãã¹ãã®æåŸ å€ãè¡šçŸãããinããããã¯ã®äžã§å®éã®ãã¹ããè¡ã£ãŠããŸãã
ã¢ãã¯ã®äœãæ¹
ã¢ãã¯ã¯åäœãã¹ãã§ãã䜿çšãããææ³ã®äžã€ã§ãç¹å®ã®ãªããžã§ã¯ããã¡ãœããã®åäœãã·ãã¥ã¬ãŒã·ã§ã³ããããã«äœ¿çšããŸããScalaã§ã¯ãScalaMockãšããã©ã€ãã©ãªã䜿ã£ãŠã¢ãã¯ãäœãããšãã§ããŸããã¢ãã¯ã䜿çšããããšã§ãå®éã®ãªããžã§ã¯ããã¡ãœãããæ©èœããªãå Žåããå®è£ ãã®ãã®ãäœãããã®ãå°é£ãªå Žåã§ããã¹ããé²ããããšãã§ããŸãã
åºæ¬çãªã¢ãã¯ã®äœãæ¹ã¯æ¬¡ã®éãã§ãããŸããã¢ãã¯ãããªããžã§ã¯ãã®åãæå®ããŠãã¢ãã¯ãªããžã§ã¯ããäœæããŸãã次ã«ãã¢ãã¯ãåŒã³åºããããšãã®æ»ãå€ãèšå®ããŸããæåŸã«ããã¹ã察象ã®ã¡ãœãããã¢ãã¯ã䜿ã£ãŠåŒã³åºãããããšã確èªããŸãã
import org.scalamock.scalatest.MockFactory import org.scalatest._ class ExampleSpec extends FlatSpec with MockFactory { "Example" should "work with mocks" in { val mockedTrait = mock[TraitToMock] (mockedTrait.method _).expects().returning(42).once() assert(new ExampleSystemUnderTest(mockedTrait).run() == 42) } }
ãã®äŸã§ã¯ãTraitToMockãšãããã¬ã€ããã¢ãã¯ããŠããŸããã¢ãã¯ãã¬ã€ãã®methodãåŒã³åºããããšã42ãè¿ãããããã«èšå®ããŠããŸãããããŠãExampleSystemUnderTestãšããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããrunã¡ãœããã42ãè¿ãããšã確èªããŠããŸãã
å®è·µïŒ Scalaã§ã¢ããªã±ãŒã·ã§ã³éçº
Scalaã§ã¢ããªã±ãŒã·ã§ã³éçºãå§ãããšãã«ãä»ãŸã§åŠãã ç¥èãå®éã«ã©ã®ããã«äœ¿ãã®ããã©ã®ããã«é²ããã®ããªã©ã¹ããããã€ã¹ãããã§ãããããã解説ããŸãã
éçºç°å¢ã®æºå
ãŸãåãã«ãéçºç°å¢ã®æºåããå§ããŸããScalaã®éçºç°å¢ãšããŠãã䜿ãããã®ã¯ãIDEïŒçµ±åéçºç°å¢ïŒã®äžã€ã§ããIntelliJ IDEAã§ããIntelliJ IDEAã¯ãå€æ©èœã®ãšãã£ã¿ãŒããããžã§ã¯ã管çæ©èœãããŒãžã§ã³ã³ã³ãããŒã«æ©èœãªã©ãScalaéçºã«å¿ èŠãªããŒã«ãäžéãæã£ãŠããŸãã
æåã«IntelliJ IDEAãã€ã³ã¹ããŒã«ããScalaãã©ã°ã€ã³ãè¿œå ããŸããããã«ãããScalaã³ãŒãã®ã³ã³ãã€ã«ããªãŒãã³ã³ããªãŒããªã©ã®äŸ¿å©ãªæ©èœãå©çšã§ããããã«ãªããŸãã
æ¥åã¢ããªã±ãŒã·ã§ã³ã®äœæ
次ã«ãå ·äœçãªæ¥åã¢ããªã±ãŒã·ã§ã³ãäœæããŠã¿ãŸããããããã§ã¯ãäžè¬çãªWebã¢ããªã±ãŒã·ã§ã³ã®äžäŸãšããŠãç°¡æçã®TODOãªã¹ããäœæããŸãã
ãŸããPlay FrameworkãšããScalaã§Webã¢ããªã±ãŒã·ã§ã³ãäœæããããã®ãã¬ãŒã ã¯ãŒã¯ã䜿çšããŸããããã«ãããã«ãŒãã£ã³ã°ããã³ãã¬ãŒããšã³ãžã³çã®Webã¢ããªã±ãŒã·ã§ã³ã«å¿ èŠãªåºæ¬çãªéšåããã°ããããæ§ç¯ããããšãã§ããŸãã
routesãã¡ã€ã«ã§ã¯ã以äžã®ããã«ãªã¯ãšã¹ããšå®éã®åŠçãå®çŸ©ããŸãã GET / controllers.HomeController.index() GET /tasks controllers.TasksController.list() POST /tasks controllers.TasksController.create() DELETE /tasks/:id controllers.TasksController.delete(id: Long)
ãããã°ãšãã©ãã«ã·ã¥ãŒãã£ã³ã°
ã¢ããªã±ãŒã·ã§ã³éçºã«ã¯æ¬ ãããªããããã°ã§ããIntelliJ IDEAã«ã¯ããã¬ãŒã¯ãã€ã³ããèšå®ããããã¹ãããå®è¡ããããããªã©ã®ãããã°æ©èœãåãã£ãŠããŸãããŸããåäœãã¹ããæžãããšã§ãã³ãŒããæå³éãã«åããŠãããã確èªããããšãéèŠã§ãã
åé¡ãçºçããå Žåã¯ããšã©ãŒã¡ãã»ãŒãžãããèªãããã«ããŸãããããšã©ãŒã¡ãã»ãŒãžã«ã¯ãäœãåé¡ã§ã©ãã«åé¡ãããã®ããèšãããŠããŸãããŸããStack OverflowãScalaã®å ¬åŒããã¥ã¡ã³ãçãåç §ããããšã§ãå°ã£ããšãã®è§£æ±ºçãèŠã€ããããšãã§ããŸãã
以äžãScalaã§ã¢ããªã±ãŒã·ã§ã³éçºãè¡ãéã®åºæ¬çãªæµãã§ãããã®ãã¬ãŒã ã¯ãŒã¯ãå®éã«å©çšããŠãScalaã®å¯èœæ§ãååã«åŒãåºããŸãããã
ãŸãšãïŒScalaåŠç¿ã®ãã€ã³ã
ãããŸã§ã«Scalaã®ã€ã³ã¹ããŒã«ããåºæ¬çãªæ§æãã³ã³ã»ãããé«åºŠãªãã¯ããã¯ãŸã§ãé ãè¿œã£ãŠåŠã³ãScalaãã©ã®ãããªç¹æ§ãæã¡ãããã«ãã£ãŠã©ã®ãããªããšãå¯èœã«ãªãããç解ããŠããã ããããšã§ããããããããåã«æ°ããããã°ã©ãã³ã°èšèªãåŠã¶ããšã§çµããã«ããã®ã§ã¯ãªããããã§æããããã€ãã®ãã€ã³ããæèããªããScalaãšããèšèªãå©çšããŠããã ãããšã§ãæŽã«ãã®å¯èœæ§ãåºããããšãã§ããŸãã
æåã®äžæ©ã¯åºæ¬ã«å¿ å®ã«
Scalaã¯å€æ©èœãªèšèªã§ããããã®å
šãŠã䜿ãããªãã®ã¯ãããªãã®æéãšåªåãå¿
èŠãšããŸããã§ããããæåã®ãã¡ã¯ãã£ãããšåºæ¬æ§æãç解ããåºæ¬çãªäœ¿ãæ¹ã身ã«ã€ããããšããå§ããŠã¿ãŠãã ããããã®äžã§åŸã
ã«é«åºŠãªæ©èœã䜿ãããªããããã«ããŸãããã
åé¡è§£æ±ºã®ããã®å€æ§ãªæ段
Scalaãããããåé¡ã解決ããããã®å€æ§ãªæ段ãæäŸããŠãããããšãå¿ããªãã§ãã ããããªããžã§ã¯ãæåããã°ã©ãã³ã°ãé¢æ°åããã°ã©ãã³ã°ã䞊è¡åŠçãéåæåŠççãå€ãã®ææ³ãããã«æã«åãããã«çšæãããŠããŸããå¿
èŠã«å¿ããŠããããçµã¿åãããŠå©çšããããšã§ãå€æ§ãªåé¡ã«å¯Ÿå¿ããè±ããªãœãªã¥ãŒã·ã§ã³ãçã¿åºãããšãã§ããŸãã
ã³ãŒãã®å質ãæèãã
ãŸããScalaãçšããããšã§èªã¿ããããä¿å®æ§ã®é«ãã³ãŒããæžãããšãå¯èœã«ãªããŸãããªãŒããã«ãªã³ãŒããæžãããšã«ãã£ãŠãä»ã®äººããã®ã³ãŒããç解ãããããªããŸãããããªãèªèº«ãåŸã§ãã®ã³ãŒããèŠçŽãéã«ããã®ã¡ãªãããå®æããããšãã§ããŸãã
ããã«ãŠScalaåŠç¿ã®ã¬ã€ãã¯çµãããŸããScalaã®æ ã¯ããããã§ããããŸããŸãªæ©èœãé§äœ¿ããŠãè±ããªãœãªã¥ãŒã·ã§ã³ãçã¿åºãããšã§ãäžçã«æ°ããªäŸ¡å€ãæäŸããŠãã ããã