Kotlin 4

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2018/07/17(火) 18:00:27.88ID:PDZGrLP2
JetBrainsが開発した期待の新言語、Androidの公式開発言語にしてサーバーサイドもなんでもいけるKotlinについて語りましょう
https://kotlinlang.org


※前スレ
http://mevius.5ch.net/test/read.cgi/tech/1521401186/
67デフォルトの名無しさん
垢版 |
2018/07/23(月) 12:16:53.60ID:dqTrBb4W
それ最後に書いてあるよ。

暑さには要注意だ。脳が暖まり過ぎると段々おかしくなる。
2018/07/23(月) 22:50:39.12ID:+BbazrC1
>>66
キモナイ
2018/07/23(月) 23:41:47.31ID:TlqhU3AK
入れたときの型そのままで取り出せる汎用的なmap的なもんって実装できないかな
2018/07/24(火) 00:08:17.47ID:yMVTYfnp
Keyの型にValueの型を持たせればできそう
2018/07/24(火) 00:25:53.51ID:jxAZ77iY
>>69
Anyとスマートキャスト利用するしかないだろうなあ
2018/07/24(火) 02:12:36.15ID:kG3RWdPq
>>66
TypescriptってC#scriptみたいな物か
何気に一番Javaに近そうねw
2018/07/24(火) 06:13:07.75ID:43FBDpPt
>>72
確かにJavaに似てるけど、あれは普通のJSの拡張みたいなもんだから使いやすい、というか既にめっちゃ使われてる
2018/07/24(火) 06:36:17.05ID:Nja0DAi0
>>73
KotlinよりTypescriptの方が流行る?
2018/07/24(火) 06:45:51.05ID:lb/L6e2D
用途が違いすぎるから比較できない。
2018/07/24(火) 07:40:56.91ID:rJ60Fij8
TSからJS呼ぶときに戻り値の型意識しなきゃいけないことにイラつく感覚がKotlinからJava呼ぶときにnull意識しなきゃいけないときにイラつく感覚と似ている
2018/07/24(火) 07:44:57.16ID:m3eQtKeT
めっちゃ分かる
2018/07/24(火) 09:54:20.04ID:iluy9i/G
てか、CとTypescriptとその他を比較する意味あんのか?
分野が違いすぎんだろ
2018/07/24(火) 10:58:03.97ID:HALI/+e7
null安全特有のバグが入ったり
null安全のためにコードが長くなったりで
あんまメリットない気がしてきた
2018/07/24(火) 11:05:46.42ID:fNoqjXR2
Javaが有償化するけど、Kotlinにも影響ある?
2018/07/24(火) 11:08:31.26ID:lb/L6e2D
なんで影響がないと思ったのか
2018/07/24(火) 11:47:22.80ID:fNoqjXR2
いやひょっとしたら、JetBrainsがいい感じでやってくれるかと...
2018/07/24(火) 11:56:29.41ID:dd1bPMMo
>>69だけどkotlinだと無理っぽいな
arrow-ktでlistっぽいのならあったけど
scalaだとshapelessってライブラリで実現してるらしい
2018/07/24(火) 12:01:17.61ID:GyqBpo0D
>>80
Oracle版JDKの有償化な
そのためにOracle自身もOpenJDKに力入れてきたんだから特に問題ない(KotlinもJavaも)
2018/07/24(火) 12:13:14.69ID:rzcjvCjX
>>83
最近ちょこちょこ聞くようになった依存型がこれに使えるのね
2018/07/24(火) 12:15:58.38ID:rzcjvCjX
>>79
null安全が好きでないなら、動的型付言語を使ったほうが幸せになれるんじゃない?
2018/07/24(火) 12:37:31.12ID:GyqBpo0D
>>69 >>83
どういうの使用イメージを望んでるのかよく分からないので
コンパイル不可で構わないから使う側の疑似コードを書いてみてほしい
2018/07/24(火) 12:37:44.64ID:lb/L6e2D
JetBrainsJDKは理想だけど、さすがにそんなことやるほど体力のある会社じゃないだろ
2018/07/24(火) 12:38:02.51ID:loJnpDBw
>>79
煽るわけじゃなく、純粋に知りたいのだけど、null安全特有のバグって、どんなのがあるの?
2018/07/24(火) 12:47:46.02ID:lb/L6e2D
null安全のために記述が長くなるってのもよく分からんな
kotlinはそうならないようにかなり配慮されてると思うのだけど、もしかしていちいち全部ifでnullチェックでもしてるんじゃないの
91デフォルトの名無しさん
垢版 |
2018/07/24(火) 13:09:50.01ID:DcwsX7CJ
>>88
そうするとGoogleのAndroidのような面倒な問題を抱える可能性があるのでは?
素直に OpenJDK 使っといた方が良いと思うのだが。
2018/07/24(火) 13:19:48.44ID:lb/L6e2D
LTSしてくれるならね
2018/07/24(火) 18:26:44.44ID:43FBDpPt
RedHatがOpenJDK11を独自にLTSするらしいから、RedHat系のディストリビューション使ってるなら大丈夫だろ
ubuntuは知らん
2018/07/24(火) 18:37:37.15ID:06VgvsWU
null安全のせいでコードが長くなるのは

・nullを返しうるメソッドだけど今回に限っては絶対にnullじゃない

ってケースで !! の2文字が増えるぐらいでは
95デフォルトの名無しさん
垢版 |
2018/07/24(火) 18:40:45.65ID:uYKauRtK
>>93
つまりWindowsは死亡と。
2018/07/24(火) 18:47:44.94ID:43FBDpPt
>>95
これを機にWndowsServerなんてカスは滅ぼそう
2018/07/24(火) 18:51:34.06ID:fUz7lDXQ
AdoptOpenJDKが無償のLTS提供するよ
2018/07/24(火) 19:06:30.65ID:/05DIiMI
>>97
GitHub見てこいよ
アレをプロダクトで安定して使えるようになるまでまだまだ先は長そうだぞ
2018/07/24(火) 19:30:50.32ID:dd1bPMMo
>>87
val map = HashMap<String, 抽象的な何か>()
map["hoge"] = "文字列"
map["fuga"] = 100

val str = map["hoge"] // :String
val num = map["fuga"] // :Int

みたいな感じで
とにかく型チェックやらキャストやらが面倒くさい
実際には自作クラスとかも突っ込みたい
2018/07/24(火) 19:54:27.68ID:K9O8BSac
試してないんで適当言うけど
Class.forName(className).kotlin.cast(value)
とかでなんとかならんの
101デフォルトの名無しさん
垢版 |
2018/07/24(火) 20:39:35.62ID:3bmjSXS4
>>99
型チェックなしだと取り出した変数が何型になっているかわからなくて結局扱えないのでは?
2018/07/24(火) 20:48:13.92ID:7FTYhXzS
その後処理分ける時点で型は見ることになりそう
2018/07/24(火) 21:04:13.34ID:2ywwbIJ/
すまん伝わりやすいかと思って抽象的な何かって書いたけど語弊があるわ
まず抽象クラスやらスーパークラスやらこの時点で指定してたらダメだしな
ちなみにarrow-ktのHListはタプルみたいな感じになってた
2018/07/24(火) 21:09:27.91ID:VXjn8z1z
マップに値を突っ込む人は中身の詳細を知らなくて、値を取り出す人はどのキーに何が格納されているか知っているようなシチュエーション、例えば設定ファイルのローダーみたいな奴への適用ならわからんでもない。
2018/07/24(火) 21:17:20.64ID:2ywwbIJ/
何に使う気かっていうとJSFでFlushっていう画面間で値渡すためのMapがあるんだけど、型チェック面倒くさいしチェックしないのも嫌だしでいっそ別に用意できないかと思った
入れるときも取り出すときも型は分かってる状況だな
2018/07/24(火) 21:30:43.77ID:pjRgCp/n
XMLなりで文字列化しといて使うときにデシリアライズすれば?
2018/07/24(火) 21:57:49.15ID:43FBDpPt
keyごとに型が決まってるならjson文字列にしておいてGson使って取り出すとか
2018/07/24(火) 22:34:12.22ID:GyqBpo0D
>>99
Mapに代入のみで型認識するのは難しいな

タプル的な感じでやるか
https://ideone.com/Aekjqn

事前定義でMapに関連付けるか
https://ideone.com/rCFcai

むしろ変数に型が無い言語使うか
https://ideone.com/BUHFe3
2018/07/24(火) 23:50:03.73ID:2ywwbIJ/
>>106-107のやり方が使うときにはスッキリできそうだなぁ
>>108
二つ目のやつって色々出来そうに見えて汎用的にならないのが惜しい
2018/07/24(火) 23:53:36.51ID:jFaMrYyE
動的型言語「呼んだ?」
2018/07/24(火) 23:59:34.61ID:0G/WUWgn
よく調べないで書くけどMapでしか渡せないならMapの値にクラス突っ込めないの
2018/07/25(水) 00:05:15.27ID:Mo9tZ0hU
普通に data class 書くかイヤなら動的型使え案件だな
2018/07/25(水) 00:32:44.86ID:X9aSb7/J
動的型付言語でもMapから取り出したインスタンスに何かするにはそのインスタンスの型のチェックは必要なんだから、
KotlinでもAnyの変数に取り出した後、何かするとき型チェックすればいいのでは?
2018/07/25(水) 00:41:37.28ID:7AbAukpx
>>109
汎用的ってどういうこと?
2018/07/25(水) 02:34:30.53ID:NuE3ewHE
一回シリアライズするとか正気かよ。

inline fun <reified T: Any> cast(any: Any): T = T::class.javaObjectType.cast(any)

val i = cast<Int>(map["hoge"])
2018/07/25(水) 02:52:17.20ID:X9aSb7/J
Mapのキーの文字列に対して格納されてる型が決まってるのか
エラーチェック無しで間違ったのが入ってたら例外で良いなら、そんな感じにキャストでいいかもね
2018/07/25(水) 06:23:31.29ID:tppUcJNh
全角読みにくい
2018/07/25(水) 07:17:57.17ID:mjDoqtlK
>>113
動的型付言語は人間が頭の中で実際の型を把握してればコード上では型チェック不要だよ

Ruby
map = {}
map["hoge] = "今は文字列"
map["hoge"] = 100 #今は整数
map["hoge"] = [1,2,3] #今は整数の配列

map["hoge"].each{|i| puts i.to_s} # 今入ってるのは整数の配列だと人間が把握してるので適正なコード
2018/07/25(水) 07:34:47.16ID:NuE3ewHE
>>117
半角のまま貼り付けたら弾かれたんだ。
2018/07/25(水) 07:40:45.40ID:nUGMun5h
>>115
明示的にキャスト、間違ってたら実行時例外でいいなら as でよくね

val map = HashMap<String, Any?>()
map["hoge"] = 10
map["hage"] = "zura,katsura"
map["hoge"] = map["hage"]

val list = (map["hage"] as String).split(',')
println(list) // [zura, katsura]
2018/07/25(水) 08:28:43.96ID:pc8pXKsN
Kotlinスレが珍しくKotlinの話してるのか
2018/07/25(水) 10:22:42.75ID:7AbAukpx
元の>>99についての話なら「キャストなし」が前提なのでは

とはいえシリアライズやGSONなら型定義が必須だろうから
キャストより手間増える気がする
2018/07/25(水) 10:56:38.61ID:QsHBqRMq
使うたびにキャストするのが面倒くさいって話なら一度定義しとけばあとはそのまま使えるgsonはアリじゃね
2018/07/25(水) 11:39:23.46ID:1gumeC8R
てか別にGsonなんて使わなくてもHashを渡して初期化したら中でいい感じにkeyごとにキャストしておいてくれるラッパークラス作れば良いのでは
2018/07/25(水) 12:12:16.20ID:RwqHQTi+
結局取り出すときに型がわかってるようにするには事前定義が必須と
2018/07/25(水) 12:55:48.93ID:1gumeC8R
せやな
2018/07/25(水) 14:31:05.88ID:alBChnpJ
当たり前の話
嫌なら静的型付けなんてやめちまえ
2018/07/25(水) 15:13:33.72ID:CbElzlsD
性的片付けならお手伝いします。
129デフォルトの名無しさん
垢版 |
2018/07/25(水) 15:46:24.96ID:rOB4O81b
Mapから特定のキーで取り出した値の型をプログラマが知っている場合だけでしか使えなくて、型がわからないなら型チェックが必要になり、そうするとスマートキャストが使えるので現状のままで問題ない事になる。
型チェックなしで使えるようにできたとしてもやはりバグの温床になりそうだというのもある。(しかも見つけにくいバグにならないか?)
2018/07/25(水) 15:49:44.09ID:dm3jJ5Gu
特にKotlinの場合はJavaのウンコ仕様のせいでジェネリクスの型引数を安全にダウンキャストできないからな
2018/07/25(水) 17:01:14.13ID:xG56qnJC
やっぱJetbrain VM作ってよ〜
2018/07/25(水) 18:05:14.18ID:7AbAukpx
>>131
何のメリットが?
2018/07/25(水) 18:13:55.24ID:60VZ2ETs
そもそもVM利用してるのってJavaの遺産利用する為だしな
134デフォルトの名無しさん
垢版 |
2018/07/25(水) 18:16:24.83ID:ekeRKo17
資産ではなく遺産
2018/07/25(水) 20:57:40.57ID:OXaxpOj9
>>99
https://ideone.com/Bxe3Vj
2018/07/26(木) 20:21:16.47ID:v8/TcxRM
>>135
map["hoge"] as String → map.get<String>("hoge")
map["fuga"] as Int → map.get<Int>("fuga")
無 → inline fun <reified T> HashMap<String, Any?>.get(key: String) = get(key) as T

ただのキャストよりコード量が増えて危険な操作であることがわかりにくくなっただけやんけ
137デフォルトの名無しさん
垢版 |
2018/07/27(金) 02:00:17.48ID:O4NPrPXG
全然関係ない話

これが出来る事を知らなかった。

val s = "abc"
println("${s + "xyz"}")

ダブルクォーテーションで括った中にダブルクォーテーションで括った文字列がある状態なのに問題なくコンパイルも実行もできる。
${ ... } はコンパイル時に特別扱いしてたんだな。
2018/07/27(金) 07:04:48.78ID:8+KT0NyM
>>137
マジか、知らなかった。
まあやることはあまりないだろうがw
2018/07/27(金) 07:05:22.41ID:UmDdNteT
{}の中はプラグラムのコードやからな。
それだけやで
2018/07/27(金) 08:06:17.19ID:BgbV5sVA
一番内側のデリミタが来るまでは外側のデリミタはマスクされて見えないという話
2018/07/27(金) 08:36:58.60ID:xnwtYCKh
むしろコンパイル時じゃなかったらビビる
evalがある言語じゃないんだから
2018/07/27(金) 08:45:57.59ID:xnwtYCKh
もちろんネストも出来る

Kotlin   https://ideone.com/9oQrPl
Groovy  https://ideone.com/PkZexd
Swift   https://ideone.com/vCuTyE
bash   https://ideone.com/9GW6lT
2018/07/27(金) 18:32:30.58ID:BbfW0v3N
>>141
そんな威張るなよ
2018/07/27(金) 18:38:45.51ID:eMZjpBCY
そんな僻むなよ
2018/07/28(土) 13:18:16.11ID:S6ztPmt9
unit testしたいんですが
junit って標準モジュールじゃないんですか?
2018/07/28(土) 21:07:10.68ID:yXUefUq2
じゃないです。
2018/07/28(土) 21:53:41.27ID:AhCis0X4
ようやくKotlin1.3の話が出てきた。
ttps://blog.jetbrains.com/kotlin/2018/07/see-whats-coming-in-kotlin-1-3-m1/
148デフォルトの名無しさん
垢版 |
2018/07/29(日) 08:07:58.83ID:7lOBGcOb
operator で何も返さない Unit のやつを作るとどうなるかを実験していて気づいたこと。
例えば plus() って + 記号が出てきただけで呼ばれるわけで、そうなると + 記号だけで中身を書き換える事も可能になるんだな。

https://paiza.io/projects/wtY0TgCLyLhRsls2-6wcuQ
2018/07/29(日) 08:59:34.65ID:4MUmFrCs
そりゃまあただのメソッド呼び出しを糖衣構文だし
150デフォルトの名無しさん
垢版 |
2018/07/29(日) 09:51:20.17ID:7lOBGcOb
>>149
これができるのなら Unit ではない演算子の結果を捨てるような式はエラーにして欲しかった。
2018/07/29(日) 10:47:26.84ID:DahY5MEG
DSLに使うからそれは困る
152デフォルトの名無しさん
垢版 |
2018/07/30(月) 18:02:59.40ID:xHVHgAPA
JetBrains のサイトに StringBuilder.set メソッドのドキュメントがない事に気づいた。
いやググると見つかるので正確にはあるのだが、どこからリンクされているかがわからない。
普通に考えるとこれは StringBuilder のページからなんだろうが、それはない。getならある。
2018/08/01(水) 15:30:30.04ID:wHCC+gZS
JavaFX+Kotlinでクロスプラットフォームのアプリ作ろうと思ったけど、
やっぱ今からだとElectronの方がいいのかな
SDKからも切り離されたし
2018/08/01(水) 16:27:09.30ID:BRE0Gb7p
TornadoFX使ってみてよ
2018/08/01(水) 17:14:08.32ID:o97vF+z4
竜巻外為良さそうだけど、そもそもJavaFXが流行ってない気が
2018/08/01(水) 17:17:06.60ID:BRE0Gb7p
現時点で流行ってないし、java自体がこの状況で今から人気が出てくるとも思えないよなあ
electronかみんな大好きXamarinでも使った方がいいだろう
2018/08/01(水) 22:35:46.35ID:SQGsQ61c
TornadoFX良かった。JavaFXが切り離されさえしなければ...
2018/08/01(水) 23:16:43.13ID:CtMSSjTe
トーナードは良いものだよ。
JavaFX自体が消滅しそうだけど
159デフォルトの名無しさん
垢版 |
2018/08/02(木) 00:14:03.14ID:vClc7nAi
tornado の発音はトーネイドに聞こえるが・・・
2018/08/02(木) 00:40:41.05ID:ZvszlWDN
なんでJavaFXって人気ないの?
Electronが人気すぎるだけ?
Electronコード隠蔽できないから嫌なんだけどな
2018/08/02(木) 01:22:59.89ID:PUemVwHx
>>160
なんでって、Javaだからだよ
有史以来、FXに限らずクライアントJavaに人気があったことなど無い
162デフォルトの名無しさん
垢版 |
2018/08/02(木) 02:34:55.79ID:vClc7nAi
Android で大人気だけどなw
2018/08/02(木) 02:35:51.35ID:M4JJW8Mq
javafxscript用の設計だったからね
script潰れてjava向けに再設計とか時間かけすぎなんだよ
164デフォルトの名無しさん
垢版 |
2018/08/02(木) 06:11:52.44ID:L4dxCzkb
アンドロイドせいでjava/kotlinを書かざるを得ない迷惑なはなし
2018/08/02(木) 06:43:03.26ID:t5505cjw
>>164
C++やJavaScriptでも書けるだろ
2018/08/02(木) 07:38:05.58ID:NvR76J0F
C#で書けるだろ、忘れるな
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況