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
subroh_0508
March 19, 2019
Technology
0
710
Kotlin/JSと格闘しながらKotlinのイケてる文法を学ぶ
【とらのあな主催】オタクがKotlinを追うライトニングトークイベントのLT発表資料です
subroh_0508
March 19, 2019
Tweet
Share
More Decks by subroh_0508
See All by subroh_0508
登壇の心理的ハードルをコントロールする技術
subroh0508
2
310
テストコードを書きながらCompose Multiplatformを乗りこなす
subroh0508
0
180
自己効力感を二次元アイドル作品から得ながら社会人としての成長を超加速させる
subroh0508
2
440
担当アイドルを応援する傘を作ろう! (として失敗した話)
subroh0508
0
380
buildSrc/Composite Buildで必要なバージョン情報も Version Catalogから参照したい!
subroh0508
0
1.1k
フロントエンドもJetpack Composeで書きたい! -Compose for WebはモダンWebアプリケーションの夢を見るか?-
subroh0508
0
720
det(A-λE) = 0 〜我々はなぜ三峰結華に惹かれるのか〜
subroh0508
0
130
J( 'ー`)し「Jetpack Composeって、Desktopアプリも作れるのよ」
subroh0508
0
85
E=mc2 〜樋口円香のエンジンが質量を生むまで〜
subroh0508
0
180
Other Decks in Technology
See All in Technology
온디바이스 AI 및 로컬 AI의 도전 과제 / Challenges of On-Device AI and Local AI
inureyes
PRO
0
820
データベース06: SQL (3/3) 副問い合わせ
trycycle
0
120
検索失敗率のモニタリングから改善まで - Search Engineering Tech Talk 2024 Spring
magicpieh28
4
190
組織的なクラウド統制のはじめの一歩_20240529
yhana
0
410
Angular Signals under the Hood
fabiangosebrink
0
230
プロダクトオーナー向け生成AI支援サービスの仮説検証事例
yosuke_matsuura
PRO
1
200
機械学習モデルの運用と実用的なアプローチ
databricksjapan
0
270
【OpsJAWS】踏み台サーバーって何がうれしいんだっけ?
hssh2_bin
10
3.7k
Multimodal LLMs and foundation models in robotics
keio_smilab
PRO
2
690
AWS でのクラウド時代のログ活用
itotsum
1
140
MySQL 8.4 LTS が あらわれた
yoku0825
PRO
1
150
ネットワーク初心者でも使いやすい!VPC Latticeをご紹介します
kimurayuta
0
170
Featured
See All Featured
Producing Creativity
orderedlist
PRO
338
39k
Fireside Chat
paigeccino
22
2.7k
Robots, Beer and Maslow
schacon
PRO
155
8k
How STYLIGHT went responsive
nonsquared
92
4.9k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
9
1.4k
What’s in a name? Adding method to the madness
productmarketing
PRO
17
2.7k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
23
1.7k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
18
7k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
22
1.5k
Building Adaptive Systems
keathley
32
1.9k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
4
200
Code Reviewing Like a Champion
maltzj
516
39k
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ָ͍͠ʂ ΈΜͳ৮ͬͯར༻࣮ྫ૿͑ͯཉ͍͠ʂ