Kotlin 6
■ このスレッドは過去ログ倉庫に格納されています
JetBrainsが開発した期待の新言語、Androidの公式開発言語にしてサーバーサイドもなんでもいけるKotlinについて語りましょう
※前スレ
Kotlin 5
https://mevius.5ch.net/test/read.cgi/tech/1544268581/ 今日もnull安全だから…プロパティに代入して欲しいの 近所の本屋ではkotlinの棚にflutterが侵食してきている
kotlin本は必要だー!出せー! //
/ ./
/ ./ パカ
/ ∩彡⌒ ミ 髪のはなし終わった?
/ .|(´・ω・`)_
// | ヽ/
" ̄ ̄ ̄ ̄"∪ 通話中でもバックグランドで処理するアプリとか、スマートウォッチ向けアプリ作ってみたい >>639
どうぞ。遠慮なく。思う存分作ってよいぞ。どんどん作ってくれたまへ。 大丈夫。お前ならできる。俺は信じてるぞ。
とりあえずネットで検索しろ。 完成したらその事を本に書いて出せ。
Amazonの電子書籍なら簡単な審査だけで出せる。 スマートキャストで、これは問題なくできる。
val x: Any = 0.3
if (x is Double) println(x + 0.2)
しかしこれはできなかった。
val x2: List<Any> = listOf(0.3)
if (x2[0] is Double) println(x2[0] + 0.2)
足し算する前に as Double でキャストすると問題なし。
if (x2[0] is Double) println(x2[0] as Double + 0.2)
なんで? val で List だから内容が変更されることはない筈で、スマートキャストできそうに見えるんだけど。
Listの中身まで推論してられっかボケってこと? Listに色々なクラスのインスタンス入れて返すメソッドを思い付いたのだがKotlinはスマートキャスト使えるから楽に書けるかなと思ったんだよね。
で、試してみてわかったんだけど、これだとJavaと大差ないね。 >>650
[0]は.get(0)のシンタックスシュガー
でgetが要素を変更しない保証がない covariantの問題だから、将来的にもそこは変わないと思う。 .get()がthisを変更しないことを
関数定義時に保証する文法を追加すれば解決可能では?
val y = x[i]で一旦受ければいいから
JBの言語改善にかける意欲の低さを考えれば超期待薄 > Listに色々なクラスのインスタンス入れて返すメソッド
これのメリットがよく分からんけど List<Any> に対して get(i) + cast する拡張関数作ればいいんじゃね リストにいろいろと聞くとつい、生Listを構造体代わりにする昔ながらのクソコードを思い出す
あのアンチパターンに名前はないのだろうか
静的ならDestructuring Declarationsを使い動的ならSequenceを返してitをスマートキャストすればいいのでは >>650 >>654
メソッドを2回呼んで同じ値を返す保証は結構難しい
言語レベルでのメモ化や参照透過性、所有権システムなどが必要になる
フロー解析で出来たところでコンパイル可否がlistOfの実装に依存して
柔軟性もコンパイル速度も悪化するから
Kotlinディスカッションに投げても多分改悪判定される
valやletで十分だと思うけどな >>651
型チェック+処理を頻繁に書きたいのなら
こういうの用意しておくといいんじゃね
inline fun <reified T> Any?.letif(b:(T)->Unit){ if(this is T) this.let(b) }
fun main() {
val x2: List<Any> = listOf(0.3)
x2[0].letif<Double>{ println(it + 0.2) }
} >>650
val x2: List<Any> = listOf(0.3)
val x3 = x2[0]
if (x3 is Double) println(x3 + 0.2)
これはスマートキャストいけた。
雑に考察すると、x2の右辺には別スレッドで
val x4: MutableList<Any> = mutableListOf(0.3)
と定義したx4を書くことも出来て、
ifの条件式が評価されてprintlnが実行されるまでに、
元のスレッドでx4[0] = "string"が実行されている可能性が微粒子レベルで存在するのかなと。 data classなんかの読み取り専用プロパティへの参照なら同じ書き方でスマートキャストできる
そのプロパティを参照するだけのメソッドやカスタムgetterを経由したら不可
コンパイラ設計上、メソッドの副作用がないことを無制限に推論することは時間的制約の面で不可能で、どこかで線引きするしかない
リフレクションで変数を書き換えてるかもしれない
その合理的な線引きの範囲がval値への参照なんだと思う >>659
あ、そーか。その可能性あるな。
Listの皮を被ったMutableListね。 kotlinはc++みたいな玄人向けのクソ言語になろうとしてるのか?複雑すぎやろ。コルーチンでどうやってエラー伝えればいいんだ
https://qrunch.net/@kyoutoday/entries/64IYC8Ye81WyzA5L >>662
>coroutinesなどで実行している非同期なコードの例外をキャッチすることができません。
どういうこと?出来るだろ?
suspend fun f(): String { throw RuntimeException() }
fun main() {
try { runBlocking { f() } }
catch(e:RuntimeException){ println("catch") }
val d = GlobalScope.async { f() }
try { runBlocking { d.await() } }
catch(e:RuntimeException){ println("catch") }
} runBlockingって、名前の通りスレッドブロックするん?だったらさすがに実際そんな使わないだろ。launch,asyncなどのコルーチンビルダーで例外キャッチできないと >>665
基礎無しで応用を全部使おうとして混乱してるように見える
Kotlinに関しては道筋のドキュメント不足が原因かもしれない
> launch,asyncなどのコルーチンビルダーで例外キャッチできないと
C#のasyncやJavaScriptのPromiseでも変わらんよ
言語に限らず非同期処理の基礎知識として
コールバック、待機/通知、イベントループをまず学ぶべき エラー処理については
まず、正常値/エラー値/多値/例外 はどれも
結果(処理への入力に対する出力)の一形態に過ぎないというところからスタート >C#のasyncやJavaScriptのPromiseでも変わらんよ
他の言語とkotlinの違いはkotlinの場合は、suspend関数を呼ぶにはどっかにcoroutineが必要で、
coroutineの境界(lanuchなどで)例外は外側に伝わらないじゃん。
try {
GlobalScope.launch { 例外発生}
} catch (ex: Exception) { キャッチできない }
で、どうすりゃいいの?ってことで悩んでて、ググったら上記の記事が出てきて、kotlinは他の方法でやるの??
って思ったけど今回とあんま関係なかったのかも。
とりあえず、JobにinvokeOnCompletionで完了ハンドラ登録できるから、
coroutineの外側ではJobを受けわたせばいいのかな・・ suspend fun fun2() {
throw Exception("hoge")
}
suspend fun fun1() {
fun2()
}
// コルーチンスコープが定義されてるところはJobで返す
fun test(): Job {
return launch {
fun1()
}
}
// 大元
fun main() {
val job = test()
job.invokeOnComplete(t: Throwable?) { }
}
とまぁこんな感じになっちまうけどいいか・・
他の言語なら普通に例外を伝搬させられるが・・? と、coroutine境界の内外でどうエラーの例外を伝えればいいか悩んでた次第です・・ >>669
>>664をC#で書くとこうなる → https://ideone.com/QwtGY4
try{ GlobalScope.launch {例外発生} } ...
これはスレッドで言えば
try{ Thread {例外発生}.start() } ...
と同じこと
>>668で書いたように戻り値も例外も同じで
待機やコールバックにより「受け取る」ことが必要
Kotlinでは runBlocking{}
C#では .Resultまたは.Wait() (どちらもスレッドをブロックする)
JavaScript(Promise)ではonRejectedコールバック >>670
> 他の言語なら普通に例外を伝搬させられる
まずここに勘違いがある
Kotlinに限らず同期メソッドと非同期メソッド間で
待機やコールバック無しに伝搬することは無い
main自体を非同期メソッドにしているか
ブロックする呼び出しをしていることに気付いていないだけ >>673
うん。だから、他の言語でmainメソッドを非同期メソッドにして、普通にtry-catchで
例外捕まえれるけど、kotlinだと無理だから他の方法あるのかな??って
話をしてたんですけど・・・ >>674
mainを非同期メソッドにして普通にtry-catch出来るけど
suspend fun fun2() { throw Exception("hoge") }
suspend fun fun1() { fun2() }
suspend fun main() {
try { fun1() }
catch(e:Exception){ println("catch") }
} 躓きの原因になってそうな点を書いてみる
・Kotlinのsuspendメソッド間は暗黙で同期して明示で非同期するが
他言語のasyncメソッド間は暗黙で非同期して明示で同期する
・GlobalScope.launchには地雷がある(joinで例外が受け取れない)
※同スコープの launch は受け取れる
GlobalScope.async/await に置き換えるのが良いと思う
・同スコープで非同期起動(async{})した場合の連鎖キャンセルで混乱している
スコープがよく分からなければ GlobalScope.async を使っておけばいい
GlobalScope.launchの件は使わないから気付かなかった
基本的には GlobalScope.async/await, runBlocking を使えば良い KaMP Kitの紹介 (Kotlin Multiplatform用のツール)
https://blog.jetbrains.com/kotlin/2020/02/accelerate-your-kotlin-multiplatform-evaluation-with-kamp-kit/
試してないけど、マルチプラットフォームでアプリを作る際の
注意点やどのように書くかのガイドを目的としたツールのようだ
ツール自体ではないけど、ツールを作った会社の人によるKotlin/Nativeでの並行性についての話
https://www.youtube.com/watch?v=oxQ6e1VeH4M >>680
ビッグデータはJavaが強い分野で、オワScalaの代替としてKotlinを推すのはわりと自然な戦略
まあJupyterを全面に押し出すのはちょっと的外れだが >>682
バグかな。1.4リリースまでには抹殺されることを祈る。
valの値がミュータブルオブジェクトだったりするのはありえることだから、常に警戒はしている。 >>682
open valじゃん
それが変化しないと考える奴はただの初心者だろ・・・
Kotlinでは@JvmFieldを付けない限り
privateでないアクセサがメソッド(getter/setter)になるのは基礎の範疇
public class Read {
public String getValue(){return "hello";}
}
でgetValueがオーバーライドされて固定値じゃなくなることに騒いでるのと同じ kotlinのvalは「valで定義されたものに=を使われていたら、コンパイル時にエラー出して止める」というご利益しかないよ
動作的にイミュータブルにする機能はないよ valの前にわざわざopenを書いてる以上、こういう拡張への意図があったということだよ
慌てなくても怖いならopenをむやみに書かなければそれでいい
継承がカプセル化を破壊するというのは昔Effective Javaで習ったろ
これはその端的な例で、だからこそKotlinはopenを明示しないと継承できない道を選んでる interface の val も実装を var にできるしな 関数の引数をラムダ式にして、それをnullableにしたいんですがどう書いたらいいですか
fun fuck(abc: () -> Unit) {
}
みたいにして、呼び出す方は
fuck({
})
でも
fuck()
でも良いようにしたいんですが fun fuck((abc: () -> Unit)? = null) {
}
でできましたありがとうございました!
呼び出す方は
abc?.invoke()
としたら良いようですね それなら、nullable外してデフォルト値{}がよくない? 尼で検索したら Kotlin の新しい本が出てきた。
尼はURLがNGワードになってて書けないので以下にタイトルだけ並べておく。一番上の本だけが紙の本とKindle版両方ある。それ以外はKindle版のみ。
みんなのKotlin 現場で役立つ最新ノウハウ!
プログラマーにおくるKotlin流し読み入門: Androidアプリ開発の新言語をスピードマスター
解決!Androidアプリ開発のアレコレ >>691
去年に出たのを見ると、超初心者向けのが若干少ない気がするね Kotlin始めました。導入しましたって話聞く機会が減ってきた悲しい。 結局残るのは考えがしっかりした言語だ
小粋なのははやりすたりが激しい
MSはおかしい まあC#から拝借した機能の多さを考えるとMSが作ったと言えなくもない kotlinで関数型を受け付けるメソッドに、特定のクラスのメソッドを渡したいのですがどうすればいいでしょうか??
fun registerHandler(handler: (Int, Int) -> Unit)
にhanlderと同じシグニチャを持つメソッド(例えばhoge)を持つクラス(例えばFoo)を作って
val a = Foo()
registerHandler(a.hoge)
みたいなことをやりたいのですがどうすればいいでしょうか?
要するにコードを再利用したいのです Kotlin 1.3.70 Released
品質改善がメイン >>703
効いたと思うが、他スレッドから変更される可能性があるならダメなのでは? 普通に書いていれば別スレッドから書き換えられるvarにsmartcastはできない 変数にもローカル変数やらいろいろあるし
ローカルは効きそう、インスタンス変数は無理だろう IntellijでKotlinでJavaコード呼び出した時
どんなchecked Exception投げるか簡単に知る方法教えてください。 Kotlinって単純にJavaの上位互換と考えていいんですかね?
それとも特定の用途ならJavaの方が優れてることもある? >>712
・とにかく即動ける開発者を大人数集めないといけない場合
・約1MBのアプリサイズ増加が許容出来ない場合
ならJavaかな 特別な俺に酔いしれる、アートなプログラミングをするスレ民にふさわしいな 異端だな。
Androidアプリ作ってる場合はまあ普通だが。 アンドロイドアプリ作る案件でしか触ったことないけどアンドロイドアプリ以外でもこの言語使うことってどれくらいあるんだ?
フリーでいろんな会社のいろんな案件に携わってきたけどアンドロイドアプリ以外でこの言語選択してるシステムに出会ったことがない アプリ制作専用言語という認識で差し支えないってことね 2年前くらいの頃はサーバーサイドJavaも食いそうな勢いだったんだけど、見る影もないね
もうAndroidアプリ制作専用言語以上は何も期待できない 何度も言われてるがベターJavaで、近代Java案件の置き換えが可能なのだが、
新規Java案件が今はもうAndroid非ゲームアプリくらいしかないため、結局Android非ゲームアプリくらいしか用途がない
もちろんかつてのJavaのように何を作っても構わないしなんでもだいたい作れるが、そもそもわざわざJavaで作る理由がもうないので… javaの上位互換だからjava出来るならKotlinも直ぐ出来るって勘違いしてる人結構いるけど、
細かいところで書き方とか違うからそれなりに慣れるまで時間かかるよね Javaはお固い分野でも新規に使われてるのに
縁がない人は頓珍漢な分析するよね Java<kotlinだけどそもそも新規でのJava需要が下がってきてるから流行らないって事か? >>726
「新規に使われてる」の解釈が違う
文字通りの意味じゃない ■ このスレッドは過去ログ倉庫に格納されています