Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Kotlin/JSと格闘しながらKotlinのイケてる文法を学ぶ
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
subroh_0508
March 19, 2019
Technology
800
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Kotlin/JSと格闘しながらKotlinのイケてる文法を学ぶ
【とらのあな主催】オタクがKotlinを追うライトニングトークイベントのLT発表資料です
subroh_0508
March 19, 2019
More Decks by subroh_0508
See All by subroh_0508
Pull Request、AIレビューだけでマージしてOK?
subroh0508
0
53
ぼっちではじめた登壇が「51名」「241件」の発信に化けた
subroh0508
1
520
ポケモンの型をTypeScriptの型システムで表現してみた
subroh0508
0
420
"スキルファースト"で作る、AIの自走環境
subroh0508
1
920
AIを賢くしたいなら、まずは人間の改善ループから
subroh0508
0
190
"S/N-GUL4R1TY"に向けて人類は何をすべきなのか
subroh0508
0
56
画面の向こうから「気づき」を得る 画面の向こうを「物差し」として捉える
subroh0508
1
360
蓮ノ空女学院スクールアイドルクラブはなぜ強いのか
subroh0508
0
93
2026年、書籍をちゃんと読むぞ👊 〜約3万円分の書籍を積読にしないためにやること〜
subroh0508
5
880
Other Decks in Technology
See All in Technology
『AIに負けない』より『AIと遊ぶ』」〜ワクワクが最強のテスト・QA学習戦略_公開用
odan611
1
450
AIに障害切り分けを全部やってもらった。 。 。 。
estie
0
370
Claude Code 珍プレー好プレー
shinyasaita
0
270
証券システムを10年Scalaで作り続けるということ - 関数型まつり2026
krrrr38
3
700
SRE Lounge Hiroshimaへの招待
grimoh
0
310
Why is RC4 still being used?
tamaiyutaro
0
300
最近評価が難しくなった
maroon8021
0
250
なぜ人は自分のプロジェクトを 「なんちゃってアジャイル」と 自嘲するのか
kozotaira
0
260
DMM.com 購入改善推進チーム におけるCodeRabbitを用いた レビューフロー改善の一例
ysknsid25
1
360
クラウド上のデータ復旧で見落としがちな制約: 医療系 SaaS の BCP 設計から得た教訓
kakehashi
PRO
0
1.1k
Agentic AI 時代のテスト手法: Kiro とはじめるプロパティベーステスト (AWS Summit Japan 2026 | DEV212)
ymhiroki
0
210
記録をかんたんに、提案をパーソナルに ── AIであすけんが目指すもの
oprstchn
0
160
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
528
40k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
380
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
Mind Mapping
helmedeiros
PRO
1
280
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Darren the Foodie - Storyboard
khoart
PRO
3
3.4k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
230
Measuring & Analyzing Core Web Vitals
bluesmoon
9
880
Embracing the Ebb and Flow
colly
88
5.1k
The Invisible Side of Design
smashingmag
301
52k
Transcript
,PUMJO+4ͱ֨ಆ͠ͳ͕Β ,PUMJOͷΠέͯΔจ๏ΛֶͿ ʹ͜͠Γ͞ͿΖʙ!TVCSPI@
ࣗݾհ w ʹ͜͠Γ͞ͿΖʙ ຊ໊ࡔ্৴ w גࣜձࣾ#FBS5BJM w "OESPJEΤϯδχΞ ,PUMJO+BWB
ˑ w 8FCΤϯδχΞ 3BJMT3FBDU w ,PUMJOྺ
࣍ ,PUMJO+4ͷ֓ཁ ,PUMJOͷΠέͯΔจ๏հ w ϥϜμࣜ w ֦ுؔ w
ԋࢉࢠΦʔόʔϩʔυ ,PUMJO+4ͱͷ֨ಆͷه
,PUMJO+4ͷ֓ཁ w ϑϩϯτΤϯυͷίʔυ,PUMJOͰॻ͍ͯ͠·͓͏ʂ w ,PUMJOˠ+4ʹมɺ(SBEMFϓϥάΠϯΛ+FU#SBJOT͕ఏڙ w LPUMJOKTɺLPUMJOGSPOUFOEQMVHJO w (SBEMFʹίϯύΠϧ8FCQBDLͷઃఆΛهड़ w
࣮ߦˠ+4มޙͷϑΝΠϧ͕ग़ྗ͞ΕΔ
,PUMJOͰ+4͕ॻ͚Δʜ w ܕ҆શʂॻ͖׳Εͨ,PUMJOͰϑϩϯτΤϯυॻָ͚͍ͯ͠ʂ w ਓྨʹ·ͩૣ͗͢Δ ࣮ࡍʹ֨ಆͨ࣌͠ͷͭΒΈޙ΄Ͳʜ w ίʔυϦʔσΟϯάˠ,PUMJOͷݴޠ༷Λϑϧʹ׆༻ w
ಛʹΑͦ͞͏ͳϞϊΛ͍͔ͭ͘հ w %4- υϝΠϯݻ༗ݴޠ ͷ࣮ʹʹཱͭ
,PUMJOͷΠέͯΔจ๏հ w ϥϜμࣜؔΛએݴͤͣɺͦͷͰมͷΑ͏ʹ͢ // 2つのInt型変数の和を返す val sum = { x:
Int, y: Int -> x + y } print(sum(3, 4)) // => 7 // 別の関数の引数として渡すことも可 fun addAndTimes(sum: (Int, Int) -> Int, n: Int): Int { return sum(n, n) * n } print(addAndTimes(sum, 5)) // => 50
,PUMJOͷΠέͯΔจ๏հ w ֦ுؔطଘͷΫϥεʹ֎͔Β৽ؔ͘͠ΛՃ͢Δ w 4UBUJDͳϝιουΛՃ+BWB͔ΒΫϥεϝιουͱͯ͠ղऍ // Int型のリストに平均値を返す関数を追加 fun List<Int>.average(): Double
{ return this.sum().toDouble() / this.size.toDouble() } print(listOf(1, 2, 3, 4).average()) // => 2.5
,PUMJOͷΠέͯΔจ๏հ w ԋࢉࢠΦʔόʔϩʔυԋࢉࢠͷॲཧΛॻ͖͑Δ w ීஈ͔͍ͮ͋·Γ͠ͳ͍ɺ%4-Λ࡞Δ࣌ʹͱͯศར data class Person(val name: String)
data class People(val names: List<String>) // Person同士を足してPeopleに変換して返す operator fun Person.plus(other: Person): People = People(listOf(this.name, other.name)) Person("音無小鳥") + Person("青羽美咲") // => People(["音無小鳥", "青羽美咲"])
,PUMJO+4Ͱʜ w 3FBDUͷSFOEFSϝιουΛ,PUMJO+4Ͱॻ͘ͱʜ class App : RComponent<RProps, RState>() { override
fun RBuilder.render() { div("title") { +"Welcome to React with Kotlin" } } } class App extends React.Component { render() { return ( <div className='title'> Welcome to React with Kotlin </div> ) } } ,PUMJO+4 3FBDU
,PUMJO+4Ͱʜ w 3FBDUͷSFOEFSϝιουΛ,PUMJO+4Ͱॻ͘ͱʜ class App : RComponent<RProps, RState>() { override
fun RBuilder.render() { div("title") { +"Welcome to React with Kotlin" } } }
,PUMJO+4Ͱʜ w 3FBDUͷSFOEFSϝιουΛ,PUMJO+4Ͱॻ͘ͱʜ class App : RComponent<RProps, RState>() { override
fun RBuilder.render() { div("title") { +"Welcome to React with Kotlin" } } } SFOEFSϝιου͕ ʮ3#VJMEFSΫϥεͷ֦ுؔʯ ͱͯ͠ఆٛ
,PUMJO+4Ͱʜ w 3FBDUͷSFOEFSϝιουΛ,PUMJO+4Ͱॻ͘ͱʜ class App : RComponent<RProps, RState>() { override
fun RBuilder.render() { div("title") { +"Welcome to React with Kotlin" } } } EJW ϝιου ˠEJWλάΛߏங͢Δ
fun RBuilder.div( classes: String? = null, block: RDOMBuilder<DIV>.() -> Unit
): ReactElement = … ,PUMJO+4Ͱʜ w 3FBDUͷSFOEFSϝιουΛ,PUMJO+4Ͱॻ͘ͱʜ class App : RComponent<RProps, RState>() { override fun RBuilder.render() { div("title") { +"Welcome to React with Kotlin" } } } EJW ϝιου ˠ3#VJMEFSΫϥεͷ֦ுؔ
fun RBuilder.div( classes: String? = null, block: RDOMBuilder<DIV>.() -> Unit
): ReactElement = … ,PUMJO+4Ͱʜ w 3FBDUͷSFOEFSϝιουΛ,PUMJO+4Ͱॻ͘ͱʜ class App : RComponent<RProps, RState>() { override fun RBuilder.render() { div("title") { +"Welcome to React with Kotlin" } } } SFOEFS είʔϓͷUIJT 3#VJMEFSΫϥε ˠUIJTEJW\ʜ^EJW\ʜ^ )UNMͬΆ͍ݟͨͰॻ͚Δ ˠ֦ுؔͰείʔϓ੍ޚ
fun RBuilder.div( classes: String? = null, block: RDOMBuilder<DIV>.() -> Unit
): ReactElement = … ,PUMJO+4Ͱʜ w 3FBDUͷSFOEFSϝιουΛ,PUMJO+4Ͱॻ͘ͱʜ class App : RComponent<RProps, RState>() { override fun RBuilder.render() { div("title") { +"Welcome to React with Kotlin" } } } ϥϜμࣜ ҾΛऔΒͳ͍ɺԿฦ͞ͳ͍ είʔϓͷUIJT͕ 3%0.#VJMEFSʹͳΔ ˞3%0.#VJMEFSFYUFOET3#VJMEFS
,PUMJO+4Ͱʜ w 3FBDUͷSFOEFSϝιουΛ,PUMJO+4Ͱॻ͘ͱʜ class App : RComponent<RProps, RState>() { override
fun RBuilder.render() { div("title") { +"Welcome to React with Kotlin" } } } ԋࢉࢠΦʔόʔϩʔυ ˠʮEJWλάͰจࣈྻΛڬΉʯ ˠPQFSBUPSGVO4USJOHVOBSZ1MVT Ͳ͜Ͱ࣮͞ΕͯΔͷʁ
w 3FBDUͷSFOEFSϝιουΛ,PUMJO+4Ͱॻ͘ͱʜ open class RBuilder { operator fun String.unaryPlus() {
childList.add(this) } ... } ,PUMJO+4Ͱʜ class App : RComponent<RProps, RState>() { override fun RBuilder.render() { div("title") { +"Welcome to React with Kotlin" } } } 3#VJMEFSͷதʹ࣮ʂ SFOEFSEJWͷείʔϓͳΒ zIPHFzˠDIJME-JTUBEE lIPHFz ˠϥϜμࣜʹΑΔ είʔϓ੍ޚͷ͓͔͛ ˠԋࢉࢠΦʔόʔϩʔυࠇຐज़ ͑ΔՕॴΛݶఆɺ෭࡞༻⾪
·ͱΊ w ϥϜμࣜɺ֦ுؔɺԋࢉࢠΦʔόʔϩʔυͷϞμϯͳจ๏ w ݴޠͱͯ͠ͷදݱྗ͕ߴ͍ w είʔϓ੍ޚΛҙࣝ͢Δͱɺීஈݣ͍ͷ࣌ʹ׆͔ͤΔ w "OESPJEαʔόʔαΠυ͔ΒˠΓͳ͘ͳ͖ͬͯͨΒ,PUMJO+4
,PUMJO+4ͱͷ֨ಆͷه w ͖͔͚ͬ w #ʮαʔόʔαΠυ,PUMJO৮Γ͍ͨʔʯˠௐΔ w #ʮ,PUMJO+4ʜʁɹϑϩϯτ,PUMJOͰॻ͚Δͷ͔ʯˠॻ͍ͯΈΔ
,PUMJO+4ͱͷ֨ಆͷه w ׂͱΠέͨ DSFBUFSFBDULPUMJOBQQ (JUIVC w ,PUMJO+4 3FBDUͷڥΛ ༻ҙͯ͘͠ΕΔOQNϞδϡʔϧ
w $44͔Β)UNM·Ͱશͯ,PUMJOԽͰ͖ͨ
,PUMJOͷ8FCαΠτ ࡞Δ͔͠Ͷ͑ʂ ,PUMJOͷ8FCαΠτ࣮࣭ͬͯখௗ͞ΜͩΑͶʜ ͦΕ࡞ͬͨΒখௗ͞ΜͷੜΈͷͱݴͬͯաݴͰͳ͍ͷͰʜ
,PUMJO+4ͱͷ֨ಆͷه w ࠈ͔͜͜Β w +4ͷϥΠϒϥϦʮ.BUFSJBM6*ʯΛͬͯ࡞Δͧ w ಥવͷొɺʮEZOBNJDʯܕ @JsModule("@material-ui/core/Button") private external
val buttonModule: dynamic @Suppress("UnsafeCastFromDynamic") private val buttonComponent: RComponent<RProps, RState> = buttonModule.default ίϨ
,PUMJO+4ͱͷ֨ಆͷه w EZNBOJDܕ,PUMJOͱ+4ͷϒϦοδʹඞਢͳຐ๏ͷܕ w \GPPbGPP` CBS\IPHF^^ͱ͍͏ΦϒδΣΫτͷ߹ʜ val jsObject: dynamic =
js("{ foo: 'foo', bar: { hoge: '111' } }") print(jsObject["foo"]) // => 'foo' print(jsObject["bar"]["hoge"]) // => 111 jsObject["aaa"]["bbb"] = "add from kotlin" print(jsObject["aaa"]["bbb"]) // => add from kotlin ͋ɺ͋Γͷ··ࠓىͬͨ͜͜ͱΛͥ͢ʜ ʮΦϨ,PUMJOΛॻ͍͍ͯΔͱࢥͬͨΒ +BWBTDSJQUΛॻ͍͍ͯͨʯ ͳɺԿΛݴͬͯΔ͔Θ͔ΒͶʔͱ SZ
,PUMJO+4ͱͷ֨ಆͷه w +4ϥΠϒϥϦΛ͏ʹɺEZOBNJDΛΑ͠ͳʹม͢ΔΫϥε͕ඞਢʂ w .BUFSJBM6*ɺίϯϙʔωϯτҎ্ɹશͯϥούʔ͕ඞཁ w ϥούʔϥΠϒϥϦӶҙ࡞தʂ8FMDPNF$POUSJCVUFT ,PUMJO.BUFSJBM6*TVCSPILPUMJONBUFSJBMVJ
None
ࠓͳΒԿͯ͠Εͳ͘ઌۦऀʂ ,PUMJO+4ָ͍͠ʂ ΈΜͳ৮ͬͯར༻࣮ྫ૿͑ͯཉ͍͠ʂ