èè
ããïŒ
ãã®èšäºã§ã¯ãèã«é¢ããæ³šæäºé
ã玹ä»ããŸããæ§æã«ã€ããŠã¯ãCïŒèšèªãšã®ããããªæ¯èŒãªã©ãKotlinã®ç°¡åãªæŠèŠã§ãã ããã¯ç§ã®æèŠã§ãããJavaãã©ãããã©ãŒã ã®äžçã§ãã®æ¯èŒçè¥ãèšèªã«ã€ããŠã®ç§ã®èãã§ãããç§ã®æèŠã§ã¯æåããå¯èœæ§ãé«ãã§ãã
Kotlinã¯ãJavaãã©ãããã©ãŒã ïŒããã³JavaScriptïŒçšã«ã³ã³ãã€ã«ãããéçã«åæå®ããããªããžã§ã¯ãæåããã°ã©ãã³ã°èšèªã§ãã 2010幎ããJetBrainsã«ãã£ãŠéçºãããŸããã åæãªãªãŒã¹ã¯ããã»ã©åã§ã¯ãããŸããã§ããã èè
ã¯ãJavaãããç°¡æœã§ã¿ã€ãã»ãŒãã§ãScalaãããã·ã³ãã«ãªèšèªãäœæããããšãç®æããŸããã ãŸããScalaãšæ¯èŒããŠç°¡çŽ åããããããIDEã§ã®ã³ã³ãã€ã«ãé«éã«ãªããèšèªãµããŒããåäžããŸããã ãšããããäŒç€Ÿããã®èšèªã®éçºãçºè¡šãããšããéçºè
ãScalaã®ãã©ã°ã€ã³ãæãèµ·ããããæ¹ãè¯ããšã®æ¹å€ã殺å°ããŸããïŒç§ãçè§£ãããšããŸã éåžžã®IDEã¯ãããŸããïŒã ããããäŒæ¥ã«ãšã£ãŠããã°ã©ãã³ã°èšèªã¯éåžžã«éèŠãªããŒã«ã§ãããJavaéçºè
ã¯æ¥ãã§æ°ããæ©èœãèšèªã«å°å
¥ããããšã¯ãããŸããã ãããŠããã€ã³ãã¯åœŒãããããæãã§ããªããšããããšã§ã¯ãªããããŸãã«ãå€ãã®ã³ãŒããæžãããŠãããããŸãã«ãå€ãã®ã·ã¹ãã ããã®ãã©ãããã©ãŒã ã§åäœããŠããããã§ãã ãããŠä»ãããªãã¯ãã©ã¹ãã®ããã«ããªãèªèº«ã®ããã«åŸæ¹äºææ§ãåŒãåºãå¿
èŠããããŸãã ãŸããèšèªã®æåŸã®8ããŒãžã§ã³ã§æ°ããæ©èœïŒã©ã ãåŒãªã©ïŒã远å ããããšããŠãããšã³ã¿ãŒãã©ã€ãºã®äžçã¯JVMã®æŽæ°ãæ¥ãããšã¯ãããŸããã§ããã çµéšã瀺ãããã«ãäžéšã®ã«ã¹ã¿ã ã¡ã€ãã®äŒæ¥ãäŒæ¥
㯠ããã·ã³ãããŒãžã§ã³7ã«ã®ã¿æŽæ°ããŠãããã·ã¹ãã å
ã®æ°çŸå°ã®ãã·ã³ãããŒãžã§ã³8ã«æŽæ°ããããšã¯ã顧客ã®äŒç€Ÿã«ãšã£ãŠããŸã䟿å©ã§é«äŸ¡ã§ã¯ãããŸããã ç§ã®èгç¹ããã¯ãéçºäžã®èšèªã®ãã®ãããªé
å»¶ã¯ãååã«éçºããã匷åãªããŒã«ã§ããã䜿çšé »åºŠãç¥ãããšãã§ãããšç¹åŸŽã¥ããŠããŸãã ãã ããä»ã®Javaèšèªãšæ¯èŒãããšãåé·ã«èŠããå ŽåããããŸãããããã¯ãCïŒã§ååã«ããã°ã©ãã³ã°ããããšãã°ã³ãŒããããã³ã³ãã¯ãã«ããåãLINQãã©ã ãåŒããã®ä»ã®æ§æã·ã¥ã¬ãŒãã³ã䜿çšãã人ãšããŠã®ç§ã®æèŠã§ãã
ãã®ãããJetBrainsã®äººã
ã¯ãJavaãšã®å®å
šãªäºææ§ãåããããã°ã©ãã®æ¥ã
ã®äœæ¥ãç°¡çŽ åããçç£æ§ãåäžãããè¿œå æ©èœãæäŸããèšèªãäœæããããšã«ããŸããã
ç¥äºº...
ç§ã¯å¶ç¶åœŒã«åºäŒããŸããã Javaã§ã®ããã°ã©ãã³ã°ã§ã¯ãCïŒã®å©ç¹ãéããŸãããã©ãã«ãããŠèªåèªèº«ãåã°ãã顧客ã®èŠä»¶ãæºãããããšæããŸãã Kotlinã®ããã¥ã¡ã³ãã確èªããåŸããããå¿
èŠãªãã®ã§ããããšã«æ°ä»ããŸããã 150ããŒãžã®ããã¥ã¡ã³ãã¯èªã¿ããããèšèªã¯åŠç¿ãããããç°¡æœã§ãã ãã ããCïŒãšã®å
±éç¹ãååã«ãããèšèªã§ã®äœæ¥ãããã«å¿«é©ã«ãªããšããäºå®ã«ã€ããŠæãæ°ã«å
¥ã£ãŠããŸãã ããã§ãã.NETãå¿ããããããŸããã
ã°ããº...
ã¯ã©ã¹ãæäœãã
ããŠãä»ããæãè峿·±ããã®ã«ç§»ããèšèªã®æ©èœã®ããã€ããšç§ãããã«ã€ããŠå¥œããªããšãèããŠã¿ãŸãããã
Kotlinã§ã¯ã©ã¹ã宣èšããæ¹æ³ïŒ
class Man { var name: String
ã³ã³ã¹ãã©ã¯ã¿ãŒãã³ã³ã¹ãã©ã¯ã¿ãŒããŒã¯ãŒãã§ã¿ã°ä»ããããŠããããšãé€ããŠãã»ãšãã©ç°åžžãªããšã¯ãããŸããã ããã¯ãå®éã«ã¯KotlinïŒaïŒã®èгç¹ããèŠããšã»ã«ã³ããªã³ã³ã¹ãã©ã¯ã¿ãŒã§ããããã©ã€ããªã³ã³ã¹ãã©ã¯ã¿ãŒãŸãã¯ãã©ã€ããªã³ã³ã¹ãã©ã¯ã¿ãŒã¯ã¯ã©ã¹ããããŒã®äžéšã§ãã
class Man constructor(var name: String, var age: Int) // class Man (var name: String, var age: Int)
ãŸã£ããåãæ§æã¯ãåè¿°ã®ã³ãŒããšåçã§ãã 倿°åãšå¹Žéœ¢ãã¯ã©ã¹ã«ååšããããããvarïŒããªãè峿·±ãæ©èœïŒã䜿çšããŠãã©ã€ããªã³ã³ã¹ãã©ã¯ã¿ãŒã§äœæãããŸããã äžèŠæ®éã§ã¯ãããŸãããããã°ãããããšéåžžã«äŸ¿å©ã ãšæ°ã¥ããŸãã ãã ããã¡ã€ã³ã³ã³ã¹ãã©ã¯ã¿ãŒã«ã¯ã³ãŒããå«ããããšãã§ããªãããããªããžã§ã¯ããäœæããããã³ã«åŒã³åºãããåæåãããã¯ïŒinitïŒããããŸãã
class Man (var name: String, var age: Int){ init {
ç§ã®æèŠã«è峿·±ãã ã³ã³ã¹ãã©ã¯ã¿ãŒã®ãã§ãŒã³ãäœæããããšãã§ããŸãã
class Man (var name: String){ var name: String? = null
宣èšã®ããããã£ãšå®å
šãªæ§æã¯ãããã§è峿·±ãå®è£
ããããŠããŸãã
var <propertyName>: <PropertyType> [= <property_initializer>] [<getter>] [<setter>]
æåã®äŸã«ç€ºãããã«ãã¯ã©ã¹ãèšè¿°ããå Žåãåæååãã²ãã¿ãŒãããã³ã»ãã¿ãŒã¯ãªãã·ã§ã³ã§ãã 倿°ãvalãšããŠèšè¿°ãããŠããå Žåãã»ãã¿ãŒã¯ããã«å¿ããŠçŠæ¢ãããŠããŸãã ããããã£ã®èª¬ææ¹æ³ïŒ
class Man { var name: String get() { return "Name man: $field"
ããŒã¿ã¯ã©ã¹
è峿·±ãã®ã¯ããŒã¿ã¯ã©ã¹ã§ãã ãããã®ã¯ã©ã¹ã¯ãããŒã¿ãä¿åããããã«äœ¿çšãããä»ã«ã¯äœãããŸããã ã³ã³ãã€ã©ã¯ãã¡ã€ã³ã³ã³ã¹ãã©ã¯ã¿ãŒã§å®£èšããããã¹ãŠã®ããããã£ããèªåçã«ã¡ã³ããŒãæšæž¬ããŸãã
- çããïŒïŒ/ hashCodeïŒïŒ
- man圢åŒã®toStringïŒïŒã¡ãœããïŒãAlexãã26ïŒ
- 察å¿ããããããã£ã®é¢æ°ã¯ã宣èšã®é ã«ïŒç Žå£ããã宣èšïŒ
- ã³ããŒïŒïŒé¢æ°
ããã«ããããã®ã¿ã€ãã®ã¯ã©ã¹ãæäœãããšãã«äŸ¿å©ã«ãªããŸãã
data class Man (var name: String, var age: Int) fun main(args: Array<String>) { var man = Man("Alex", 26)
ãã®ã¯ã©ã¹ã®èª¬æã§ãç§ã¯èšèªã®ãã®éšåã§ãããã€ã©ã€ãã§ããéšåãçµäºããŠæ¬¡ã«é²ã¿ãããšæããŸãã
颿°ãšã©ã ã
Kotlinã®é¢æ°ã¯funããŒã¯ãŒãã䜿çšããŠå®£èšãããç¹å®ã®ã¯ã©ã¹ã«ãã€ã³ããããããšãªãã°ããŒãã«ã«å®çŸ©ã§ããŸãã
fun f1(x: Int): Int { return x * 2 }
颿°ã¯ã次ã®å Žåã«æ¿å
¥èšæ³ã䜿çšããŠåŒã³åºãããšãã§ããŸãã
- ãããã¯ãã¡ã³ããŒé¢æ°ãŸãã¯æ¡åŒµé¢æ°ã§ãã
- ãã©ã¡ãŒã¿ã1ã€ãããŸãã
- ãããã«ã¯ããŒã¯ãŒãinfixãä»ããŠããŸãã
颿°ã«ã¯ãååä»ããã©ã¡ãŒã¿ãŒãšããã©ã«ãã®åŒæ°å€ããããŸãã
å¯å€æ°ã®åŒæ°ãæž¡ãããšãã§ããŸãã
fun <T> asList(vararg ts: T): List<T> { val result = ArrayList<T>() for (t in ts)
ããŒã«ã«é¢æ°ããµããŒããããŠããŸãïŒCïŒ7.0ããã®é¢æ°ãå®è£
ããŸããïŒ
fun f1(x: Man): String { fun isTeenager(age: Int): Boolean { return age in 13..19 } if (isTeenager(x.age)) return "Man teenager" return "Man is not a teenager" }
é«é颿°ãšã©ã ãåŒ
ç¹ã«è峿·±ãã®ã¯ãèšèªã®ãã®éšåã§ãã é«é颿°ã¯éåžžãä»ã®é¢æ°ãåŒæ°ãšããŠåã颿°ããŸãã¯çµæãšããŠå¥ã®é¢æ°ãè¿ã颿°ãšåŒã°ããŸãã ããã«ãäž»ãªã¢ã€ãã¢ã¯ã颿°ãä»ã®ããŒã¿ãªããžã§ã¯ããšåãã¹ããŒã¿ã¹ãæã€ããšã§ãã é«é颿°ã䜿çšãããšãèšç®ã®è€éããèæ
®ããŠãæœè±¡çã§ã³ã³ãã¯ããªããã°ã©ã ãäœæãããŸãã
é«é颿°ã®äŸãèããŠã¿ãŸãããã
ãã®ã¢ãããŒãã«ãããLINQã¹ã¿ã€ã«ã®ã³ãŒããèšè¿°ã§ããŸãã
strings.filter { it.length == 5 }.sortBy { it }.map { it.toUpperCase() }
ã©ã ãåŒã®å®å
šãªæ§æã¯æ¬¡ã®ãšããã§ãã
val sum = { x: Int, y: Int -> x + y }
ããã«ã远å ã®æ³šéãæ®ããšã次ã®ããã«ãªããŸãã
val sum: (Int, Int) -> Int = { x, y -> x + y }
æ¬åŒ§å
ã«ã¯ããã©ã¡ãŒã¿ãŒãåžžã«ç€ºãããŠããã->ã䜿çšããŠæ¬äœã«è»¢éãããŸãã
ã©ã ãåŒã®æ§æã«æ¬ ããŠãããã®ã®1ã€ã¯ãæ»ãå€ã®åãæå®ããæ©èœã§ãã ã»ãšãã©ã®å Žåãæ»ãå€ã®åã¯èªåçã«æšæž¬ããããããããã¯äžèŠã§ãã ãã ããæç€ºçã«æå®ããå¿
èŠãããå Žåã¯ãå¥ã®æ§æã
å¿å颿°ã䜿çšã§ããŸãã
fun(x: Int, y: Int): Int = x + y
颿°ã®ã«ãªãŒåãšéšåçãªé©çš
äŸãšããŠé¢æ°ã®ã«ãªãŒåãšéšåçãªé©çšãæ€èšããKotlinãšCïŒã®å®è£
ãæ¯èŒããŸãã
äžéšã®äººã
ã¯ã颿°ã® ã«ãªãŒåãš
éšåçãªäœ¿çšãšããçšèªãæ··åãïŒãããŠãå°ãåã«ãã£ãïŒããããã亀æå¯èœã«äœ¿çšããŸãã ã«ãªãŒåãšéšåé©çšã®äž¡æ¹ã¯ãããçš®ã®æ©èœãå¥ã®çš®é¡ã«å€æããæ¹æ³ã§ãã
éšå颿°ã®äœ¿çš
éšåçãªã¢ããªã±ãŒã·ã§ã³ã¯ãNåã®ãã©ã¡ãŒã¿ãŒãšãããã®ãã©ã¡ãŒã¿ãŒã®ããããã®å€ãæã€é¢æ°ãåããN-1ãã©ã¡ãŒã¿ãŒãæã€é¢æ°ãè¿ããŸãããã®ãããåŒã³åºããããšãå¿
èŠãªãã¹ãŠã®å€ïŒéšåã¢ããªã±ãŒã·ã§ã³é¢æ°èªäœã«æž¡ãããæåã®åŒæ°ãšãæ®ãã®N-1æ»ã颿°ã«æž¡ãããåŒæ°ïŒã ãããã£ãŠããããã®2ã€ã®åŒã³åºãã¯ã3ã€ã®ãã©ã¡ãŒã¿ãŒãæã€ã¡ãœãããšåçã§ãªããã°ãªããŸããã CïŒã§ã¯ãããã«ããªã²ãŒãã䜿çšãããŸãã ãã¡ããããããã¯é«é颿°ã®å®å
šãªä»£æ¿ç©ã§ã¯ãããŸããããå®èšŒããã«ã¯ååã§ãã
class Program { static Int32 SampleFunc(Int32 a, Int32 b, Int32 c) { return a + b + c; }
äžè¬åã«ãããApplyPatrialã¡ãœããã¯å®éãããèŠãç®ãé£ãããªããŸãã CïŒã«é«æ¬¡åãååšããªããšããããšã¯ã䜿çšããããªã²ãŒãããšã«ã¡ãœããå®è£
ãå¿
èŠã§ããããšãæå³ããŸãã ããã«ã¯ãã¢ã¯ã·ã§ã³ãã¡ããªãå¿
èŠã«ãªãå ŽåããããŸãã
Kotlinãµã³ãã«ã³ãŒãïŒ
fun sampleFunc(a: Int, b: Int, c: Int): Int { return a + b + c } fun f3(a: Int, b: Int): Int { return sampleFunc(a, b, 3) } fun f2(a: Int): Int { return f1(a, 2) } fun f1(): Int { return f2(1) }
Kotlinã§ã¯ãCïŒãšåæ§ã«ãN-1åã®åŒæ°ãæã€é¢æ°ãååŸããããã«ãå¥åã®é¢æ°ïŒãªããžã§ã¯ãïŒãäœæããå¿
èŠããããŸãã èšèªã®ã¢ãããŒãã¯åãã§ãããKotlinã§ã®ã¿æ§æãã³ã³ãã¯ãã§ããããããããè¡ãæ¹ã䟿å©ã§ãã
ãã£ãªã³ã°
éšåã¢ããªã±ãŒã·ã§ã³ã¯ã1ã€ã®åŒæ°ã䜿çšããŠNåã®ãã©ã¡ãŒã¿ãŒãæã€é¢æ°ãN-1åã®ãã©ã¡ãŒã¿ãŒãæã€é¢æ°ã«å€æããŸãããã«ãªãŒåã¯é¢æ°ã1ã€ã®åŒæ°ã®é¢æ°ã«åè§£ããŸãã 倿ããã颿°ãé€ããŠãCurryã¡ãœããã«è¿œå ã®åŒæ°ãæž¡ããŸããã
- ã«ãªãŒïŒfïŒã¯ã次ã®ãããªé¢æ°f1ãè¿ããŸãã
- f1ïŒaïŒã¯ã次ã®ãããªé¢æ°f2ãè¿ããŸãã
- f2ïŒbïŒã¯ã次ã®ãããªé¢æ°f3ãè¿ããŸã...
- f3ïŒcïŒã¯fïŒaãbãcïŒãåŒãèµ·ãããŸã
CïŒã§ã®å®è£
ã¯æ¬¡ã®ããã«ãªããŸãã
class Program { static Int32 SampleFunc(Int32 a, Int32 b, Int32 c) { return a + b + c; } static Func<T1, Func<T2, Func<T3, TResult>>> Curry<T1, T2, T3, TResult> (Func<T1, T2, T3, TResult> function) { return a => b => c => function(a, b, c); } static void Main(string[] args) { Func<Int32, Int32, Int32, Int32> function = SampleFunc;
ã³ããªã³ã³ãŒãïŒ
fun curry(body: (a: Int, b: Int, c: Int) -> Int): (Int) -> (Int) -> (Int) -> Int { return fun(a: Int): (Int) -> (Int) -> Int { return fun(b: Int): (Int) -> Int { return fun(c: Int): Int = body(a, b, c) } } }
ã€ã³ã©ã€ã³é¢æ°
ããé«ã颿°ã䜿çšãããšããªãŒããŒããããçºçããŸãã 颿°ãªããžã§ã¯ãã®ã¡ã¢ãªã®å²ãåœãŠãããã³ãã®åŸã®ã¯ãªãŒãã³ã°ã å€ãã®å Žåããã®çš®ã®ãªãŒããŒãããã¯ãã©ã ãåŒã眮ãæããããšã§æé€ã§ããŸãã ãã©ã¡ãŒã¿ãŒãšããŠé¢æ°ãåãåããããã¯ãªããžã§ã¯ããšé¢æ°ãåãåããããã¯ãåãåãã颿°ãå®è¡ããããã¯ãè§£é€ãã颿°ãèããŸãã
fun <T> lock(lock: Lock, body: () -> T): T { lock.lock() try { return body() } finally { lock.unlock() } }
ãã ããåŒã³åºããããšããªããžã§ã¯ããäœæãããŸãã ãªããžã§ã¯ããäœæãã代ããã«ãã³ã³ãã€ã©ã¯æ¬¡ã®ã³ãŒããæ¿å
¥ã§ããŸãã
l.lock() try { foo() } finally { l.unlock() }
ã³ã³ãã€ã©ãŒã«ããã匷å¶ããã«ã¯ãã¡ãœãã宣èšã«ã€ã³ã©ã€ã³ä¿®é£Ÿåã远å ããå¿
èŠããããŸãã
inline fun lock<T>(lock: Lock, body: () -> T): T {
ãã ãã倧ããªé¢æ°ãåã蟌ãŸãªãã§ãã ãããããã¯ããã©ãŒãã³ã¹ã«åœ±é¿ããå ŽåããããŸãã ãã¹ãŠã®é¢æ°ãåã蟌ãå¿
èŠããªãå Žåã¯ãnoinline修食åã远å ã§ããŸãã
inline fun foo(inlined: () -> Unit, noinline notInlined: () -> Unit) {
çµè«...
ã³ããªã³ã¯ãåŠã¶ã®ã楜ããé¢çœãèšèªã§ãã ã³ã³ãã¯ããªæ§æãšãããæäŸããå¹
åºãå¯èœæ§ãæ°ã«å
¥ã£ãŠããŸãã å¥ã®ã¡ãªãããšããŠã1ã€ã®ãããžã§ã¯ãã§Javaãšäžç·ã«äœ¿çšã§ãããšããäºå®ã«èšåãã䟡å€ããããŸããããã¯éåžžã«è峿·±ãããšã§ããããããžã§ã¯ããäœæããéã«éåžžã«æè»æ§ããããŸãã ãã®èšèªã䜿çšãããšãããã°ã©ã ããã°ããéçºããéåžžã«ããŸãå®è¡ã§ããŸãã åãCïŒã䜿çšããåæ§ã®æ§æã«ãããåŠç¿ãããã«å®¹æã«ãªããããåªãããã®ã«ãªããŸãã ãããã£ãŠã誰ããçªç¶.NETãã©ãããã©ãŒã ããJavaãã©ãããã©ãŒã ã«åãæ¿ãããå Žåããã®èšèªã¯è¯ãå°è±¡ãæ®ããããããŸããã
PS Javaããã°ã©ããŒãšããŠã®ãã®èšèªãšCïŒã«ã€ããŠã®è峿·±ãæèŠã ãããžã§ã¯ãã§Kotlinã䜿çšããŸããïŒ