æè¿ãKotlinã®äººæ°ãé«ãŸã£ãŠããŸãã ãããããããšããŸããã¯ãªèšèªãéžæãããããã«åãåŒæ°ãé©çšããããšãããšã©ããªããŸããïŒ èšäºã¯ããã«åºã¥ããŠæžãããŠãããKotlinã®ãã¹ãŠã®è°è«ãäºå®äžç¹°ãè¿ããŠããŸãã äž»ãªã¿ã¹ã¯ïŒJavaã«é¢ããŠãCeylonãå®è³ªçã«Kotlinãšåãã§ããããšã瀺ãããšã ããããããã«å ããŠãã»ã€ãã³ã«ã¯æ¬¡ã®èšäºã§èª¬æããäœãä»ã®ãã®ããããŸãã
CeylonãšåŒã°ããæ°ããããã°ã©ãã³ã°èšèªã«ã€ããŠè©±ããæ¬¡ã®ãããžã§ã¯ãã§äœ¿çšããçç±ã説æããããšæããŸãã ç§ã¯Javaã䜿çšããŠïŒ10幎以äžãJava 1.4ã§å§ãŸãJava 8ã§çµãã10幎以äžïŒãJavaã奜ãã§ããã ããããScalaã¯ç§ã«å€§ããªå°è±¡ãäžããŸããããã®çµæãèšèªãšããŠã®Javaãå°ãã ã奜ãã«ãªãå§ããŸããã ããããéåœã¯ã»ã€ãã³èšèªãšäžç·ã«ç§ããããããŸããããããŠããã®äžå¹Žåã§ãæã
ã¯ã©ãã§ãã»ã€ãã³ãæžããŠããŸããã å®éã®åæ¥ãããžã§ã¯ãã§ã¯ãçå®ã¯å
éšã«ãããŸãã ãããŠãçŸæç¹ã§ã¯ãJavaãéžæããã»ããããç¶æ³ãæ³åããŠããŸãããJavaãæ°ãããããžã§ã¯ããéå§ãã䟡å€ãããèšèªãšã¯èããŠããŸããã
Ceylonã¯Red Hatã§éçºãããèšèªã®äœæè
ã¯Hibernateãªã©ã®ãã¬ãŒã ã¯ãŒã¯ã§ç¥ãããGavin Kingã§ãã Javaã®æ¬ ç¹ãããçè§£ããŠãã人ã
ã«ãã£ãŠäœæãããŸãããäž»ãªç®æšã¯ãçŽç²ã«é©çšãããåé¡ã解決ããã³ãŒãã®èªã¿ããããå¯èœãªéã容æã«ããææ§ããèœãšã穎ãé¿ããããšã§ããã 蚱容å¯èœãªã³ã³ãã€ã«æéã«ãå€ãã®æ³šæãæãããŸããã çŸåšãèšèªããŒãžã§ã³ã¯1.3.2ã§ãããããŒãžã§ã³1.2.0ããªãªãŒã¹ããããšãã«èšèªãçŽæ¥ç¥ããŸããã
Ceylonã¯JavaScriptã§ã³ã³ãã€ã«ããŸãããäž»ãªç°å¢ã§ããJVMã«éäžããŸãã
ãã®ãããCeylonã«å®å
šã«åãæ¿ããå¿
èŠãããããã€ãã®çç±ïŒé åºã¯ã察å¿ããKotlinèšäºã®åãååã®ã¢ã€ãã ãšåãã§ãïŒïŒ
0ïŒJavaã®äºææ§
Kotlinã®ããã«ãScalaã®ããã«ãCeylonã¯100ïŒ
Javaäºæã§ãã æåéããå€ãJavaãããžã§ã¯ãã§äœæ¥ãç¶ããããšãã§ããŸããããã§ã«Ceylonã䜿çšããŠããŸãã ãã¹ãŠã®Javaãã¬ãŒã ã¯ãŒã¯ãå©çšã§ããŸããã©ã®ãã¬ãŒã ã¯ãŒã¯ãäœæããå Žåã§ããCeylonã¯é åºãªJavaã®æå¥œå®¶ã«ç°¡åã«åãå
¥ããããŸãã Java Ceylonããåé¡ãªãã³ãŒããåŒã³åºãããšãã§ããJavaã³ãŒããåé¡ãªãåŒã³åºãããŸãã
1ïŒäœ¿ãæ
£ããæ§æ
Ceylonèšèªã®äž»ãªæ©èœã®1ã€ã¯ãæ¢åã®éçºè
ã«ãšã£ãŠæãèªã¿ãããæ§æã§ãã æ¢åã®Javaéçºè
ãåãäžããå ŽåãCeylonæ§æãçè§£ããŠããã°ã圌ã¯ããããªåé¡ãæ±ããããšã¯ãããŸããã ScalaãKotlinã®ãããªèšèªã§ãããJavaã«ã¯ããŸã䌌ãŠããŸããã 以äžã¯ãKotlinã®äŸã«äŒŒããããªãã®æ°ã®èšèªæ§æã瀺ãã³ãŒãã§ãã
class Foo(String a) { String b= "b"; // unmodifiable variable Integer i = 0; // variable means modifiable void hello() { value str = "Hello"; print("``str`` World"); } Integer sum(Integer x, Integer y) { return x + y; } Float maxOf(Float a, Float b) => if (a > b) then a else b }
ãããã£ãŠãCeylonã§ç°¡åã«Javaã¹ã¿ã€ã«ã§æžãç¶ããããšãã§ããŸãã
2ïŒæååè£é
ããã¯ãèšèªã«çµã¿èŸŒãŸããJavaã®String.formatïŒïŒã®ããã¹ããŒãã§èªã¿ãããããŒãžã§ã³ã®ãããªãã®ã§ãã
value x = 4; value y = 7; print("sum of ``x`` and ``y`` is ``x + y``") ; // sum of 4 and 7 is 11
ããã®æ§æã¯ãKotlinã®æ§æãããå¿«é©ã§ããJavaãšæ¯èŒãããã¯ãããŸããã
3ïŒåæšè«
èªã¿ããããåäžãããšæãããå ŽåãCeylonã¯ã¿ã€ããåºåããŸãã
value a = "abc"; // type inferred to String value b = 4; // type inferred to Integer Float c = 0.7; // type declared explicitly List<String> d = ArrayList<String>(); // type declared explicitly
4ïŒã¹ããŒããã£ã¹ã
Ceylonã³ã³ãã€ã©ãŒã¯ããžãã¯ãç£èŠããå¯èœãªå Žåã¯èªåçã«å倿ãå®è¡ããŸããã€ãŸããæç€ºçãªãã£ã¹ãåŸã®instanceofãã§ãã¯ã¯äžèŠã«ãªããŸãã
if (is String obj) { print(obj.uppercased)
5ïŒçŽèгçã«çãã
==æŒç®åãæ§é çãªç䟡æ§ããã§ãã¯ããããã«ãªã£ããããæç€ºçã«equalsïŒïŒãåŒã³åºãããšã¯ã§ããªããªããŸããã
value john1 = Person("John"); //we override equals in Person value john2 = Person("John"); print(john1 == john2); // true (structural equality) print(john1 === john2); // false (referential equality)
6ïŒããã©ã«ãåŒæ°
åŒæ°ãç°ãªãè€æ°ã®åäžã®ã¡ãœãããå®çŸ©ããå¿
èŠããªããªããŸããã
void build(String title, Integer width = 800, Integer height = 600) { return Frame(title, width, height); }
7ïŒååä»ãåŒæ°
ããã©ã«ãã®åŒæ°ãšçµã¿åãããŠãååä»ãåŒæ°ã䜿çšãããšããã«ããŒã䜿çšããå¿
èŠããªããªããŸãã
build("PacMan", 400, 300) // equivalent build {title = "PacMan"; width = 400; height = 300;} // equivalent build {title = "PacMan"; height = 300;} // equivalent with default width
8ïŒåŒã¹ã€ãã
å岿Œç®åã¯ãã¯ããã«èªã¿ãããæè»ãªswitchã¹ããŒãã¡ã³ãã«çœ®ãæããããŸããã
switch (obj) case(1) { print("x is 1"); } case(2) { print("x is 2"); } case(3 | 4) { print("x is 3 or 4"); } case(is String) { print ("x is String"); } case([Integer a, Float b, String c]) {print ("x is tuple with Integer ``a``, Float ``b`` and String ``c``");} else { print("x is out of range");}
ã¹ã€ããã¯åŒãšããŠæ©èœããã¹ã€ããã®çµæã倿°ã«å²ãåœãŠãããšãã§ããŸãã
Boolean|IllegalStateException res = switch(obj) case(null) false case(is String) true else IllegalStateException();
ããã¯æ¬æ Œçãªãã¿ãŒã³ãããã³ã°ã§ã¯ãããŸããããã»ãšãã©ã®å ŽåãçŸåšã®æ©èœã§ååã§ãã
Kotlinãšã¯ç°ãªããCeylonã§ã¯ãã¹ã€ããã®ãã¹ãŠã®æ¡ä»¶ãäºãã«çŽ ã§ããå¿
èŠããããŸããã€ãŸãããªãŒããŒã©ããããªãããšãå¿
èŠã§ãã ç¯å²ã®äžèŽãå¿
èŠãªå ŽåããŸãã¯æ¡ä»¶ã亀差ããå Žåã¯ãéåžžã®ifã䜿çšããå¿
èŠããããŸãã
9ïŒããããã£
ã«ã¹ã¿ã ã»ããã远å ããŠããããªãã¯ãã£ãŒã«ãã«ããã€ãã¢ãååŸã§ããŸããã€ãŸããã¯ã¬ã€ãžãŒãªã²ãã¿ãŒãšã»ãã¿ãŒã§ã³ãŒãã®å
¥åã忢ã§ããŸãã
class Frame() { variable Integer width = 800; variable Integer height = 600; Integer pixels => width * height; }
10ïŒããŒã¿ã¯ã©ã¹
æ®å¿µãªããããã®æ©èœã¯ãŸã å©çšã§ããŸããã toStringïŒïŒãequalsïŒïŒãhashCodeïŒïŒãcopyïŒïŒãèªåçã«ãªãŒããŒã©ã€ãããäžå€ã®ã¯ã©ã¹ãå¿
èŠã§ãããJavaãšã¯ç°ãªãã100è¡ã®ã³ãŒããå æããŸããã§ããã
ããããããããŸã èšèªã«ãªããšããäºå®ã¯ããããäžå¯èœã§ããããšãæå³ããŸããã èšèªèªäœã䜿çšããã©ã€ãã©ãªãä»ããŠãç®çã®æ©èœãå®è£
ããæ¹æ³ã®äŸã瀺ããŸãã
class Person(shared String name, shared String email, shared Integer age) extends DataObject() {} value john = Person("John", "john@gmail.com", 112); value johnAfterBirhstday = john.copy<Person>({`Person.age`->113;}); assertEquals(john, john.copy<Person>()); assertEquals(john.hash, john.copy<Person>().hash);
ã€ãŸããã©ã€ãã©ãªã¬ãã«ã§ã¯ãtoStringãåå®çŸ©ããã¯ã©ã¹ãäžå€ã®ãŸãŸã«ããŠããããšãå¯èœã§ãåã
ã®å±æ§ã倿Žããã¯ããŒã³ãäœæããæ©äŒããããŸããã æ®å¿µãªãããããã¯ãµããŒããèšèªã§è¡ãããå Žåã»ã©éãåäœããŸããã ãŸããã³ã³ãã€ã«æã«åãã§ãã¯ã¯ãããŸãã=幎霢ã§åå®çŸ©ããŠã¯ããŒã³ãäœæããå€ãšããŠæååãæå®ãããšãå®è¡æã«ãšã©ãŒãçºçããŸãã ãã®ãããªæ©èœããŸã ãªããšããäºå®ã¯ç¢ºãã«æªãã§ãã ããããå¿
èŠã«å¿ããŠã©ã€ãã©ãªã¬ãã«ã§ç¬ç«ããŠå¿
èŠãªæ©èœãèšè¿°ã§ãããšããäºå®ã¯éåžžã«åªããŠããŸãã
11ïŒãªãã¬ãŒã¿ãŒã®ãªãŒããŒããŒã
èªã¿ãããããããã«ãªãŒããŒããŒãã§ããäºåå®çŸ©ãããäžé£ã®æŒç®åïŒ
class Vec(shared Float x, shared Float y) satisfies Summable<Vec> { shared actual Vec plus(Vec v) => Vec(x + vx, y + vy); } value v = Vec(2.0, 3.0) + Vec(4.0, 1.0);
12ïŒå®£èšã®ç Žå£
äžéšã®ãªããžã§ã¯ãã¯ç Žæ£ã§ããŸããããã¯ãããšãã°ããããã®å埩åŠçã«åœ¹ç«ã¡ãŸãã
for ([key -> [val1, val2, val3]] in map) { print("Key: ``key``"); print("Value: ``val1``, ``val2``, ``val3``"); }
13ïŒç¯å²
èªã¿ããããæ¹åããã«ã¯ïŒ
for (i in 1..100) { ... } for (i in 0 : 100) { ... } for (i in (2..10).by(2)) { ... } for (i in 10..2) { ... } if (x in 1..10) { ... }
察ç
§çã«ãKotlinã¯ããŒã¯ãŒãdownToãªãã§å®è¡ããŸããã
14ïŒæ¡åŒµæ©èœ
圌ãã¯ããã«ããŸããã åæã®èšèªä»æ§ã§ã¯ããã®ãããªå¯èœæ§ãèæ
®ãããŠããããã§ãã ãã ããååãšããŠãæ¡åŒµæ©èœã®ä»£ããã«ãããã¬ãã«ã®æ©èœãæ©èœããŸãã ããšãã°ãsayHelloã¡ãœãããStringã¯ã©ã¹ã«è¿œå ããå Žåããworldã.sayHelloïŒïŒã¯sayHelloïŒãworldãïŒãããèŠæ ãããããããŸããã å°æ¥çã«ã¯è¡šç€ºãããå¯èœæ§ããããŸãã
ååãšããŠãã¯ã©ã¹ã§äœ¿çšå¯èœãªå¯Ÿå¿ãã颿°ã¯IDEèªäœã§èŠã€ããããšãã§ããŸãããåäœããããšããããŸãã
15ïŒNullã»ãã¥ãªãã£
Javaã¯ã»ãŒéçã«åä»ããããèšèªãšåŒã°ããã¹ãã§ãã ãã®å
éšã§ã¯ãStringåã®å€æ°ã¯Stringãåç
§ããããšãä¿èšŒãããŠããŸãã-nullãåç
§ããå ŽåããããŸãã ç§ãã¡ã¯æ
£ããŠããŸãããããã¯éçåä»ããã§ãã¯ã®ã»ãã¥ãªãã£ãäœäžããããã®çµæãJavaéçºè
ã¯NPEã«å¯Ÿããçµ¶ãéãªãææã«èããããåŸãŸããã
Ceylonã§ã¯ãnullå€ãèš±å¯ããã¿ã€ããšèš±å¯ããªãã¿ã€ããåé¢ããããšã§ããã®åé¡ã解決ããŸããã ããã©ã«ãã§ã¯ãåã¯nullãèš±å¯ããŸãããã远å ããããšã§åãèš±å¯ããããã«å€æã§ããŸããïŒïŒ
variable String a = "abc"; a = null; // compile error variable String? b = "xyz"; b = null; // no problem
ãŠããªã³åæååã®æ©èœã®ããã§ããïŒ ããã¯String | Nullã®åãªãæ§æç³ã§ãã ãããã£ãŠã次ã®ããã«èšè¿°ã§ããŸãã
variable String|Null = "xyz"; = null; // no problem
Ceylonã䜿çšãããšãnull蚱容åãåŒã³åºããšãã«NPEãšæ Œéã§ããŸãã
value x = b.length
倧ããèŠãããããããŸããããããã€ãã®æ©èœã®ãããã§éåžžã«äŸ¿å©ã§ãã nullãèš±å¯ããåãnullãèš±å¯ããªãåã«å€æããå Žåã§ããã¹ããŒããªå倿ããããŸãã
if (!exists b) { return; } value x = b.length // no problem
å®å
šãªåŒã³åºãã䜿çšããããšãã§ããŸããïŒããNPEãã¹ããŒãã代ããã«nullãè¿ããŸãã
value x = b?.length; // type of x is nullable Int
ã»ãã¥ã¢ã³ãŒã«ããã§ãŒã³ããŠãä»ã®èšèªã§èšè¿°ãããããšããããã¹ããããnullã§ãªãifãã§ãã¯ãåé¿ã§ããŸãã ããã©ã«ãã§ãã«å€ãå¿
èŠãªãå Žåã¯ãelvis elseæŒç®åã䜿çšããŸã
value name = ship?.captain?.name else "unknown";
ãããã®ãã¹ãŠãããªãã«åãããããªãã絶察ã«NPEãå¿
èŠãšãããªããããæç€ºçã«èšã£ãŠãã ããïŒ
value x = b?.length else NullPointerException() // same as below assert(!NullPointerException x);
16ïŒæ¹åãããã©ã ã
ããã¯åªããã©ã ãã·ã¹ãã ã§ããããã€ãã®è³¢æãªãœãªã¥ãŒã·ã§ã³ã®ãããã§ãèªã¿ããããšç°¡æœãã®å®ç§ãªãã©ã³ã¹ãä¿ãããŠããŸãã æ§æã¯ç°¡åã§ãïŒ
value sum = (Integer x, Integer y) => x + y; // type: Integer(Integer, Integer) value res = sum(4,7) // res == 11
ãããã£ãŠãæ§æã¯æ¬¡ã®ããã«ãªããŸãã
numbers.filter( (x) => x.isPrime() ); numbers.filter(isPrime)
ããã«ãããç°¡æœãªæ©èœã³ãŒããäœæã§ããŸãã
persons .filter ( (it) => it.age >= 18) .sort(byIncreasing(Person.name)) .map ( Person.email ) .each ( print );
ã©ã ãã·ã¹ãã ãšèšèªã®æ§ææ©èœã«ãããCeylonã¯DSLãäœæããããã®åªããããŒã«ã«ãªããŸãã Ceylonæ§æã®Ankoã®ãããªDSLã®äŸïŒ
VerticalLayout { padding = dip(30); { editText { hint = "Name"; textSize = 24.0; }, editText { hint = "Password"; textSize = 24.0; }, button { "Login"; textSize = 45.0; } } };
17ïŒIDEãµããŒã
ã¡ãªã¿ã«åœŒå¥³ã¯ãšãŠãããã§ãã Eclipseãã©ã°ã€ã³ããããIDEAãã©ã°ã€ã³ããããŸãã ã¯ããæ©èœãšãã°ã®ç¹ã§ã¯ããã¹ãŠãScalaãKotlinãããããæªãã§ãã ããããååãšããŠãIDEã®åé¡ã¯å®éã«ã¯éçºé床ã«åœ±é¿ããªããããéåžžã«å¿«é©ã«äœæ¥ã§ããŸãã
åèšãããšãKotlinã®åŒ·ã¿ã掻çšãããšãCeylonã¯DataObjectæ©èœã®æ¬ åŠã«ããKotlinã«å£ããŸãïŒã©ã€ãã©ãªã䜿çšããŠåå¥ã«ãšãã¥ã¬ãŒãã§ããŸãïŒã ãã以å€ã®å Žåãããã¯ä»¥äžã®æ©èœãæäŸããŸãããããèªã¿ãããæ§æãåããŠããŸãã
ãŸããKotlinãšåæ§ã«ãCeylonã¯Androidçšã«äœæã§ããŸãã
äžèšãèªãã åŸãå°è±¡ãçãããããããŸãã-ãªããããå¿
èŠãªã®ã§ããïŒ åãããšãKotlinã«ããããã»ãŒ1åã®1ã§ãã
ãããŠãã»ã€ãã³ã«ã¯ã³ããªã³ã«ãã¹ã«ã©ã«ããªããã®ããããšããäºå®ãšããããã®ããšã®ããã«ãèšèªèªäœã¯ä»ã®èšèªãããã¯ããã«åªããŠããŸãã ããšãã°ããŠããªã³åã亀差åãåæåããã匷åãªãžã§ããªãã¯ãã¢ãžã¥ãŒã«æ§ã矀ããæ³šéãšã¡ã¿ã¢ãã«ãã¿ãã«ãçè§£çšã ããã«ãããããã°ã©ãã³ã°ãžã®ã¢ãããŒãã倧ããå€ãããããä¿¡é Œæ§ãé«ããçè§£ãããããæ®éçãªã³ãŒããæžãããšãã§ããŸãã ããããããã«ã€ããŠã¯æ¬¡ã®ããŒãã§è©³ãã説æããŸãã
èå³ã®ããæ¹ã®ããã«ãããã€ãã®äŸ¿å©ãªãªã³ã¯