普段C#使っている僕から見た、Kotlin
@RyotaMurohoshi
いやー、みなさんすばらしいLTでしたね
残念ながら、
僕のLTは技術的な内容薄くなってます
過度な期待はしないで下さい
普段C#使っている僕から見た、Kotlin
おまえだれよ
• 室星亮太
• Unityでモバイルゲーム開発
• 3年くらい前までAndroid開発
• C#(Unityだと、dynamicやasyncなどは使えない)
• 26歳、プログラマ4年目
C#が好きです
もちろん、Kotlinも好きですよ
実はGroovyとかも好きです
この場にいる方は、
• Kotlinに少しでも興味がある方
• Kotlinをこれから勉強してたいと思っている方
• Kotlinを使っていて流行らせたい方
だと思います。
Kotlinを使っていて流行らせたい方
そして
Kotlin(勉強中で)仲間を増やしたい方
ちょっと聞いてください。
Scalaプログラマの方に
Kotlinをすすめると...
Kotlin公式、Comparison-to-Scala-より
Taking'this'into'account,'if'you'are'happy'with'Scala,'you'probably'
do'not'need'Kotlin
h"p://kotlinlang.org/docs/reference/comparison6to6scala.html
Scalaプログラマの方には、
やはりScalaで満足?
僕の主張
Kotlinを流行らせたい方、
C#プログラマの人に勧めるのいいのでは!
C#が大好きなC#プログラマ、
だけど仕事でJVM言語を使う必要がある方
(C#に割と近い機能を持つ)Kotlinでプロダクトを作りながら
C#6.0で加わったり・今後加わりそうな機能を試すの、
いいと思うんですよ!
(あくまで僕の妄想ですが...)
C#プログラマが、
Javaで何か書く必要が出てきたとして...
「あの機能がない」
「C#だとできるのに...」
ってなりそう(あくまで僕の妄想です)
あくまで僕の妄想です
例を挙げます
C#とKotlinにはあるけれど
Javaになくてつらい機能
個人的に第1位
例その1"名前付き引数
メソッド呼び出しが超読みやすくなる
例えばこんなメソッドがあったとて
fun reformat(
str: String,
normalizeCase: Boolean,
upperCaseFirstLetter: Boolean,
divideByCamelHumps: Boolean,
wordSeparator: Character) {
(略)
}
呼び出し側はこんな感じ
reformat(str, true, true, false, '_')
なるほど、わからん。実装を見ないと。
IDEだったら実装側にジャンプすればいいけれど
githubとかでこういうののリビューだるい
呼び出し側で名前付き引数を使うと!
reformat(
str,
normalizeCase = true,
uppercaseFirstLetter = true,
divideByCamelHumps = false,
wordSeparator = '_'
)
どの引数がどのような意味なのか、すんなり読める!
名前付き引数はデフォルト引数(C#のオプショナル引数)
と組み合わせるとさらに強力!
派手さはないけど、使えるところ多くて便利
例その2"拡張メソッド(拡張関数)
クラスにメソッドを追加したい、継承せずに
例えば...
java.u&li.Collec&onにisNotEmptyメソッドを追加したい
(要素が存在すればtrueを、空ならfalseを返すメソッド)
実はKotlinでは、拡張関数でこれが標準で追加さていれる
h"ps://github.com/JetBrains/kotlin/blob/build90.12.1525/libraries/stdlib/src/kotlin/collec>ons/JU>l.kt@
より
package kotlin
import java.util.*
(前略)
/** Returns true if the collection is not empty */
public fun <T> Collection<T>.isNotEmpty(): Boolean = !isEmpty()
(後略)
雑な解説
• 名前空間の下に関数が定義できる
• 拡張関数で関数の追加
• 単一式関数
h"ps://github.com/JetBrains/kotlin/blob/build90.12.1525/libraries/stdlib/src/kotlin/collec>ons/JU>l.kt@
より
package kotlin
import java.util.*
(前略)
/** Returns true if the collection is not empty */
public fun <T> Collection<T>.isNotEmpty(): Boolean = !isEmpty()
(後略)
C#から見たさっきの例
• 文法や定義できる場所は違うけどクラスに関数を追加できる
• C#6.0のexpression/bodiedみたいに式形式で関数を書ける
C##6.0だけでなく、更にその先
拡張プロパティ
/**
* Returns the index of the last item in the list or -1 if the list is empty
*
* @sample test.collections.ListSpecificTest.lastIndex
*/
public val <T> List<T>.lastIndex: Int
get() = this.size() - 1
thisが無くても拡張関数(プロパティ)が呼べる
Test fun lastIndex() {
assertEquals(-1, empty.lastIndex)
assertEquals(1, data.lastIndex)
}
C#7.0で入るかどうか分からないけれど
ディスカッションされているもの、
Kotlinではもすでに使える!!!
普段C#使っている僕から見た、Kotlin
Kotlin、C#にわりと近い気がするの
Kotlin仲間増やすなら
Scalaバリバリの人を勧誘されるよりも
JVM言語をやる必要になったC#バリバリの方
勧誘されてはどうでしょう?
そして未来のC#は、
Kotlinと似ている部分が増える気がする
まとめ
C#erな僕は、Kotlinがすきです
蛇足
C#とかGroovyとか勉強していて
deprecateになっている機能・文法・クラスがあったり
歴史的な経緯で変えられないものが多いのがちょいつらい
Kotlinはそれらの失敗から学んだり、破壊的な変更ができたりす
る
のかな(?)
kotlinパッケージのメソッドのソース読むの面白い
Kotlinの文法の復習になると思うの
懇親会で
仕事では使わないかもしれない「言語」を学ぶ事と、仕事での「実用」について
お話しさせてもらえると嬉しいです

普段C#を使っている僕から見たKotlin