JetBrainsが開発した期待の新言語Kotlinについて語りましょう
https://kotlinlang.org
前スレ
Kotlin
http://mevius.5ch.net/test/read.cgi/tech/1456505161/
探検
Kotlin 2
■ このスレッドは過去ログ倉庫に格納されています
2017/11/01(水) 00:07:43.82ID:jxmKQQAl
290デフォルトの名無しさん
2017/12/11(月) 23:53:52.52ID:jDa4LF1V291デフォルトの名無しさん
2017/12/11(月) 23:55:33.20ID:Q0kTyulb で、一番いい入門書は?
292デフォルトの名無しさん
2017/12/11(月) 23:55:50.41ID:jDa4LF1V293デフォルトの名無しさん
2017/12/11(月) 23:58:47.24ID:jDa4LF1V294デフォルトの名無しさん
2017/12/12(火) 00:03:08.61ID:UCmbxn8n >>292
慌てて修正したらlazy落としていたorz orz
var value by lazy { initValue() }
連投申し訳ない。これで違っていたら目も当てられんが、それもすみません。と誤っておきます。
慌てて修正したらlazy落としていたorz orz
var value by lazy { initValue() }
連投申し訳ない。これで違っていたら目も当てられんが、それもすみません。と誤っておきます。
295デフォルトの名無しさん
2017/12/12(火) 00:09:53.79ID:LMcO3gTk >>289
答えはこれです
答えはこれです
296デフォルトの名無しさん
2017/12/12(火) 00:45:23.57ID:GdvZGdbs297デフォルトの名無しさん
2017/12/12(火) 01:14:31.08ID:YJZ1oHv9298デフォルトの名無しさん
2017/12/12(火) 01:17:20.30ID:yvEMt4M/ ありがとうこの世界の片隅にうちを見つけてくれて
299デフォルトの名無しさん
2017/12/12(火) 04:02:58.46ID:0dOBEVV8 アスペは質疑応答解説に使えねーなーもう
>>288
なぜlateinitを使うかというと「初期値というものがうまく定義できなくてうまく初期化できないから」だ
※実際にはjavaでprimitive typeであるものはnull代入できないからという理屈なのだが知らなくていい
Intとかは0とか-1とかで初期化できるだろ、最初にvarで0や-1入れとけ
Nullableもnullで初期化できるからlateinit使わずにただのvarでnull入れとけ
で、どーしても遅延初期化を使いたいなら
var value: Int by Delegates.notNull<Int>()
とか書くと形式上遅延初期化になる。むろん二度手間だが、遅延初期化という目的は一応達成される
こんなごっついことせずに素直に0とか入れておいたほうがいいんじゃねーかなと思った感覚は正しい。0入れとけ0
あとはちらっと出てたけどby lazyで
val value: Int by lazy { initValue() }
と書くことでも一応達成される。こっちだとvalで書けるので好まれることが多いみたいだね
>>288
なぜlateinitを使うかというと「初期値というものがうまく定義できなくてうまく初期化できないから」だ
※実際にはjavaでprimitive typeであるものはnull代入できないからという理屈なのだが知らなくていい
Intとかは0とか-1とかで初期化できるだろ、最初にvarで0や-1入れとけ
Nullableもnullで初期化できるからlateinit使わずにただのvarでnull入れとけ
で、どーしても遅延初期化を使いたいなら
var value: Int by Delegates.notNull<Int>()
とか書くと形式上遅延初期化になる。むろん二度手間だが、遅延初期化という目的は一応達成される
こんなごっついことせずに素直に0とか入れておいたほうがいいんじゃねーかなと思った感覚は正しい。0入れとけ0
あとはちらっと出てたけどby lazyで
val value: Int by lazy { initValue() }
と書くことでも一応達成される。こっちだとvalで書けるので好まれることが多いみたいだね
300デフォルトの名無しさん
2017/12/12(火) 06:12:22.97ID:GdvZGdbs 長澤太郎の本に書いてあるけど、
lateinit は、DI(Dipendency Injection)か、ユニットテスト時か、
フレームワークが自動的に初期化すると、不都合な場合に使う
lateinit は、DI(Dipendency Injection)か、ユニットテスト時か、
フレームワークが自動的に初期化すると、不都合な場合に使う
301デフォルトの名無しさん
2017/12/13(水) 04:15:38.26ID:v+2UW/cD オワコトリン
302デフォルトの名無しさん
2017/12/13(水) 09:19:22.05ID:XdGkiBLZ 美少女仮面ポワトリン
303デフォルトの名無しさん
2017/12/13(水) 23:27:28.97ID:UM/lzC7r シュシュトリアン
304デフォルトの名無しさん
2017/12/13(水) 23:37:55.76ID:Cx01t7px 技術の話ができないアスペルガーがまた暴れてるのか
305デフォルトの名無しさん
2017/12/14(木) 03:21:54.60ID:fsO62Lbi 正直、ダジャレを理解できるのは都会人だけ。
306デフォルトの名無しさん
2017/12/14(木) 04:38:45.38ID:a/3Oigfw 2017年プログラミング言語アワード候補はCとKotlin
https://news.mynavi.jp/article/20171212-554317/
https://news.mynavi.jp/article/20171212-554317/
307デフォルトの名無しさん
2017/12/14(木) 06:24:48.79ID:Ba6lMueX >>306
でもCの方が有力って書いてあるね。Cは何で増えんたんだろう。
でもCの方が有力って書いてあるね。Cは何で増えんたんだろう。
308デフォルトの名無しさん
2017/12/14(木) 06:50:37.29ID:Zv9+113v309デフォルトの名無しさん
2017/12/14(木) 07:40:22.43ID:v/ZRkoO2 >>308
デフォルト値はコンパイラが定義参照してるだけで、
型にもインスタンスにも持って無いから変数に入れた時点で使えないよ
fun f1(n: Int=1) { print(n) }
val f2 = ::f1
f1() //OK
f2() //コンパイルエラー
デフォルト値はコンパイラが定義参照してるだけで、
型にもインスタンスにも持って無いから変数に入れた時点で使えないよ
fun f1(n: Int=1) { print(n) }
val f2 = ::f1
f1() //OK
f2() //コンパイルエラー
310デフォルトの名無しさん
2017/12/14(木) 07:51:51.32ID:Zv9+113v >>309
理解しました、ありがとう
理解しました、ありがとう
311デフォルトの名無しさん
2017/12/14(木) 08:06:24.80ID:oXimKAa7 Cが必要なレベルの仕事の割合自体は
減ってるはずなのに…謎だ
減ってるはずなのに…謎だ
312デフォルトの名無しさん
2017/12/14(木) 09:49:51.95ID:DkrsR4qN Cでググってもノイズが拾われてくる率が高い
他のCと間違われてるんじゃないのか
他のCと間違われてるんじゃないのか
313デフォルトの名無しさん
2017/12/14(木) 10:12:12.59ID:rSG8ExGM Cの半分はC++という時代があったからな
Cの半分はC#とC++ということでも不思議はない
C sharpならC#確定なのだが
Cの半分はC#とC++ということでも不思議はない
C sharpならC#確定なのだが
314デフォルトの名無しさん
2017/12/14(木) 10:35:46.55ID:LuQDs4YA C++はcocos2dやUnrealでのゲーム開発とかあるけどCはなんだろうな
廃れることはあり得ないけど
廃れることはあり得ないけど
315デフォルトの名無しさん
2017/12/14(木) 11:38:25.42ID:DkrsR4qN 機械学習とかロボティクスとか自動運転とかがメディアで取り上げられるようになって学生にプログラミングへの関心がいっそう高まって教育現場での採用が増えてるのかもしれないな
就職にも有利なスキルだろうし
もともと人気の高い言語だし本格的なプログラミングの登竜門的な立ち位置の言語でもあるし
就職にも有利なスキルだろうし
もともと人気の高い言語だし本格的なプログラミングの登竜門的な立ち位置の言語でもあるし
316デフォルトの名無しさん
2017/12/14(木) 12:12:41.91ID:oEBjPr7B IoTかな
317デフォルトの名無しさん
2017/12/14(木) 21:38:11.42ID:5ZTCzvqn (IoT)
↑
こうすると顔文字になるよね
↑
こうすると顔文字になるよね
318デフォルトの名無しさん
2017/12/14(木) 22:23:38.53ID:55Q0ymnI 検索エンジンで+"C programming" で検索した結果参照してるだけだからな
単にデータとしてうんこオブうんこだ
githubやstackoverflow読んでるIEEEのランキングのほうがなんぼかマシ
単にデータとしてうんこオブうんこだ
githubやstackoverflow読んでるIEEEのランキングのほうがなんぼかマシ
319デフォルトの名無しさん
2017/12/19(火) 10:24:09.99ID:f5KBk+Xr Javaの無名スコープを表す構文が無いことから調べていってみたけど
色々と良く設計されてると感心した
構文が無い代わりにrun関数がある
ラムダ生成コストやブロック内でのreturnが気になったけど
inline関数に渡すラムダはそれごとインライン化されるため
コストも無くreturnはちゃんと呼び出し元関数から抜ける
そうするとinlineでない関数にラムダを渡す場合のreturnとで
区別出来なくて危険かと思ったけど
inlineでないラムダではラベル無しreturnが禁止されていた
returnにラベル必須だと面倒ではと思ったけど
最後のステートメントが戻り値になる仕様だからむしろ楽だった
色々と良く設計されてると感心した
構文が無い代わりにrun関数がある
ラムダ生成コストやブロック内でのreturnが気になったけど
inline関数に渡すラムダはそれごとインライン化されるため
コストも無くreturnはちゃんと呼び出し元関数から抜ける
そうするとinlineでない関数にラムダを渡す場合のreturnとで
区別出来なくて危険かと思ったけど
inlineでないラムダではラベル無しreturnが禁止されていた
returnにラベル必須だと面倒ではと思ったけど
最後のステートメントが戻り値になる仕様だからむしろ楽だった
320デフォルトの名無しさん
2017/12/19(火) 10:25:19.69ID:f5KBk+Xr ■Java
int f(){
{
String a = "a";
if(a.length() < 10){return 1;} // fから抜ける
}
return 2; //ここには来ない
}
■Kotlin
fun f(): Int {
run {
val a = "a"
if(a.length < 10){ return 1 } // runでなくfから抜ける
}
return 2 //ここには来ない
}
int f(){
{
String a = "a";
if(a.length() < 10){return 1;} // fから抜ける
}
return 2; //ここには来ない
}
■Kotlin
fun f(): Int {
run {
val a = "a"
if(a.length < 10){ return 1 } // runでなくfから抜ける
}
return 2 //ここには来ない
}
321デフォルトの名無しさん
2017/12/19(火) 10:28:08.70ID:f5KBk+Xr fun fcall(f1: () -> Int): Int = f1()
fun f(){
val a = fcall {
val a = "a"
if(a.length < 10){ return@fcall 1 } //ラベル付き
else { 2 } //returnキーワード無し
}
}
fun f(){
val a = fcall {
val a = "a"
if(a.length < 10){ return@fcall 1 } //ラベル付き
else { 2 } //returnキーワード無し
}
}
322デフォルトの名無しさん
2017/12/20(水) 02:29:53.61ID:Y+OkZrNr マップの値を条件判定に使いたいんだけど、Nullableをどう扱って良いのかわからない...
val map = mapOf<String,Boolean>("hoge" to false,"fuge" to true,"piyo" to false)
// ↓こんな感じで書きたいが、Nullableなので怒られる
if (map["hoge"]){/*処理*/}
//---------- 解決策 ----------
// @強制的に!!でNotnullにする。でもなんか気持ち悪い。
if (map["hoge"]!!){/*処理*/}
// Aエルビス演算子を使う。しかし、IDEからBの書き方を提案される
if (map["hoge"] ?: false){/*処理*/}
// B凄いバカっぽい。ていうか、これOKで一番上ダメなんだ...
if (map["hoge"] == true){/*処理*/}
なんか、どれもしっくりこない。どうするのが正解なの....
誰か教えて!お願いします!
val map = mapOf<String,Boolean>("hoge" to false,"fuge" to true,"piyo" to false)
// ↓こんな感じで書きたいが、Nullableなので怒られる
if (map["hoge"]){/*処理*/}
//---------- 解決策 ----------
// @強制的に!!でNotnullにする。でもなんか気持ち悪い。
if (map["hoge"]!!){/*処理*/}
// Aエルビス演算子を使う。しかし、IDEからBの書き方を提案される
if (map["hoge"] ?: false){/*処理*/}
// B凄いバカっぽい。ていうか、これOKで一番上ダメなんだ...
if (map["hoge"] == true){/*処理*/}
なんか、どれもしっくりこない。どうするのが正解なの....
誰か教えて!お願いします!
323デフォルトの名無しさん
2017/12/20(水) 03:07:01.09ID:vJEKLhBA if (map.getOrDefault("hoge", false)) { ... } とか。
うーん。なんか変だね。mapOf では nullable かどうか判定しているのに get 時には nullable かどうかの情報が抜け落ちているような。
うーん。なんか変だね。mapOf では nullable かどうか判定しているのに get 時には nullable かどうかの情報が抜け落ちているような。
324デフォルトの名無しさん
2017/12/20(水) 03:12:58.65ID:O14cUYGW >>322
1はmap["hage"]とか存在しないキー指定すると落ちるだろ
2はエルビスで落ちないようになってて
3が落ちないのは、
ここ https://kotlinlang.org/docs/reference/equality.html
Structural equality あたりに書いてある仕組みのせいかな
どうmapを使えばいいのかは知らん
1はmap["hage"]とか存在しないキー指定すると落ちるだろ
2はエルビスで落ちないようになってて
3が落ちないのは、
ここ https://kotlinlang.org/docs/reference/equality.html
Structural equality あたりに書いてある仕組みのせいかな
どうmapを使えばいいのかは知らん
325デフォルトの名無しさん
2017/12/20(水) 03:15:09.91ID:O14cUYGW 知らんが、kotlinみたいな言語だとキーが無いときの処理を適当にごまかすわかにはいかんだろ
326デフォルトの名無しさん
2017/12/20(水) 03:31:33.35ID:nn3v7K50 >強制的に!!でNotnullにする。でもなんか気持ち悪い。
>if (map["hoge"]!!){/*処理*/}
そもそも、map は、そのキーが存在しない場合もあるのが、当たり前だろ。
そのキーが存在するかどうかを、チェックするメソッドもある
君が仕様・設計を考えるんだ。
1. そのキーが存在した場合の処理と、
2. 存在しなかった場合の処理
初心者は、強制変換の使い方をわかっていないのだから、!! を使うな
>if (map["hoge"]!!){/*処理*/}
そもそも、map は、そのキーが存在しない場合もあるのが、当たり前だろ。
そのキーが存在するかどうかを、チェックするメソッドもある
君が仕様・設計を考えるんだ。
1. そのキーが存在した場合の処理と、
2. 存在しなかった場合の処理
初心者は、強制変換の使い方をわかっていないのだから、!! を使うな
327デフォルトの名無しさん
2017/12/20(水) 03:56:24.26ID:MahKH8pr >>325
+1
「知らないキーでmapに問い合わせたときの結果はnullになることがある」問題をコード的になんとかする必要がどうしてもある
これは本当にどうしようもないので、どっかでKotlin(実際にはIDE)に知らせる面倒を許容するしかない
ポイントとしては面倒でも一旦変数にぶち込むこと。これですべてうまくいく
// checkNotNullの書き方だけ覚えればいいので最近全部これで書いてる
val mapValue: Boolean = checkNotNull(map["hoge"]){ "map does not have key:<hoge>" }
if (mapValue) { doSomething() }
// またletをそんな用途に使って
map["hoge"]?.let{ doSomething() }
// 考え方がJavaっぽい(偏見)変数に入れないとnullチェックした履歴保持できないよ
val mapValue = map["hoge"]
if (mapValue!= null && mapValue) { doSomething() }
// ほら、Kotlinの人はなんでもかんでもwhenで書きたがるから
when(map["hoge"]){
null -> println("ぬるぽ") // なくても動く
true -> doSomethingTrue()
false -> doSomethingFalse()
}
+1
「知らないキーでmapに問い合わせたときの結果はnullになることがある」問題をコード的になんとかする必要がどうしてもある
これは本当にどうしようもないので、どっかでKotlin(実際にはIDE)に知らせる面倒を許容するしかない
ポイントとしては面倒でも一旦変数にぶち込むこと。これですべてうまくいく
// checkNotNullの書き方だけ覚えればいいので最近全部これで書いてる
val mapValue: Boolean = checkNotNull(map["hoge"]){ "map does not have key:<hoge>" }
if (mapValue) { doSomething() }
// またletをそんな用途に使って
map["hoge"]?.let{ doSomething() }
// 考え方がJavaっぽい(偏見)変数に入れないとnullチェックした履歴保持できないよ
val mapValue = map["hoge"]
if (mapValue!= null && mapValue) { doSomething() }
// ほら、Kotlinの人はなんでもかんでもwhenで書きたがるから
when(map["hoge"]){
null -> println("ぬるぽ") // なくても動く
true -> doSomethingTrue()
false -> doSomethingFalse()
}
328デフォルトの名無しさん
2017/12/20(水) 04:24:12.03ID:MahKH8pr 寝起きで書いたら!=がくっついた
if (mapValue != null && mapValue) { doSomething() }
まだ頭寝てるので動作チェックしてないから細かいとこは適当に直したりしてくれ
>>326
安易に nullableValue?.let{ ... } を使って欲しくないのも似たような感じ
今回で言うと現在のmapに"hoge"が登録されていることの保証はどうするんだろうと思う
ぬるぽ出ると追うのもしんどいわけでさ
1行で済むし動作にも影響らしい影響はないんだから脳死状態で checkNotNull(...){ "やべえhoge登録されてねえ" } とか書いとくのおすすめしたいわ
if (mapValue != null && mapValue) { doSomething() }
まだ頭寝てるので動作チェックしてないから細かいとこは適当に直したりしてくれ
>>326
安易に nullableValue?.let{ ... } を使って欲しくないのも似たような感じ
今回で言うと現在のmapに"hoge"が登録されていることの保証はどうするんだろうと思う
ぬるぽ出ると追うのもしんどいわけでさ
1行で済むし動作にも影響らしい影響はないんだから脳死状態で checkNotNull(...){ "やべえhoge登録されてねえ" } とか書いとくのおすすめしたいわ
329デフォルトの名無しさん
2017/12/20(水) 07:46:04.79ID:nn3v7K50 map, hash は、集合の概念だから、
集合A に属するか属さないか、のどちらかの状態をとる
1. そのキーが集合A にあれば、値が取得できる
2. そのキーが集合A になければ、値が取得できない
1, 2 で、君がどういう処理をするか、仕様・設計を決めるのは君!
集合A に属するか属さないか、のどちらかの状態をとる
1. そのキーが集合A にあれば、値が取得できる
2. そのキーが集合A になければ、値が取得できない
1, 2 で、君がどういう処理をするか、仕様・設計を決めるのは君!
330デフォルトの名無しさん
2017/12/20(水) 07:49:29.92ID:f5FKKl5l331デフォルトの名無しさん
2017/12/20(水) 12:00:57.83ID:f5FKKl5l Bがバカっぽいと感じるのは
真偽値 == 真偽値 だと勘違いしているから
実際には2つのNullableTypeの等値比較
真偽値 == 真偽値 だと勘違いしているから
実際には2つのNullableTypeの等値比較
332デフォルトの名無しさん
2017/12/20(水) 13:02:21.99ID:G3r13eVw if(map.getValue("hoge")){/* 処理 */}
これで基本的にキーが存在しないと例外に行くしシンプルだね
これで基本的にキーが存在しないと例外に行くしシンプルだね
333デフォルトの名無しさん
2017/12/20(水) 13:25:19.85ID:g9yiCifS 直感的にはおかしく感じるな。(最初結果見た時は驚いたw)
https://paiza.io/projects/zLCe3AYlPO9luQp7z2NaIw
しかしクラスの参照同士の比較なのでこれで良い。
https://paiza.io/projects/zLCe3AYlPO9luQp7z2NaIw
しかしクラスの参照同士の比較なのでこれで良い。
334デフォルトの名無しさん
2017/12/20(水) 13:51:27.51ID:cc5ffQEu335デフォルトの名無しさん
2017/12/20(水) 13:54:26.10ID:f5FKKl5l >>333
おかしく感じたのはprintln("True")と書いたからじゃないの
not False と True は同義でないよ
https://paiza.io/projects/1WgctVAqXu8SWmlIYtx4YA
おかしく感じたのはprintln("True")と書いたからじゃないの
not False と True は同義でないよ
https://paiza.io/projects/1WgctVAqXu8SWmlIYtx4YA
336デフォルトの名無しさん
2017/12/20(水) 13:58:37.66ID:QHJO7UtC おまえがそう思うのならそうなのだろう。おまえの中ではな。
337デフォルトの名無しさん
2017/12/20(水) 15:20:49.03ID:g9yiCifS338デフォルトの名無しさん
2017/12/20(水) 16:11:14.74ID:skPFcOgX >>337
このコードだとFalse以外のAnyでは
このコードだとFalse以外のAnyでは
339デフォルトの名無しさん
2017/12/20(水) 16:17:54.73ID:f5FKKl5l340デフォルトの名無しさん
2017/12/20(水) 16:28:57.34ID:f5FKKl5l341デフォルトの名無しさん
2017/12/20(水) 18:13:04.50ID:oPcnMRgu342デフォルトの名無しさん
2017/12/20(水) 18:27:37.40ID:AIjICjtT 糞みてえな言語だな
343デフォルトの名無しさん
2017/12/20(水) 18:40:45.87ID:GLW9SuF+ Xamarin程の糞はない
344デフォルトの名無しさん
2017/12/20(水) 21:01:27.13ID:SZt84l7a 糞だからこそ良い
345デフォルトの名無しさん
2017/12/25(月) 05:24:40.47ID:CQjgWB2v やはりJavaを超えられなかったか。
346デフォルトの名無しさん
2017/12/25(月) 09:22:20.35ID:pKfklu/G \ ∩─ー、 ====
\/ ● 、_ `ヽ ======
/ \( ● ● |つ
| X_入__ノ ミ そんな餌で俺様が釣られクマ――
、 (_/ ノ /⌒l
/\___ノ゙_/ / =====
〈 __ノ ====
\ \_ \
\___) \ ====== (´⌒
\ ___ \__ (´⌒;;(´⌒;;
\___)___)(´;;⌒ (´⌒;; ズザザザ
\/ ● 、_ `ヽ ======
/ \( ● ● |つ
| X_入__ノ ミ そんな餌で俺様が釣られクマ――
、 (_/ ノ /⌒l
/\___ノ゙_/ / =====
〈 __ノ ====
\ \_ \
\___) \ ====== (´⌒
\ ___ \__ (´⌒;;(´⌒;;
\___)___)(´;;⌒ (´⌒;; ズザザザ
347デフォルトの名無しさん
2017/12/25(月) 14:41:12.11ID:eNXAkvu4 >>343
ちょまど神への信仰が不足しているか背教者ですね
ちょまど神への信仰が不足しているか背教者ですね
348デフォルトの名無しさん
2017/12/28(木) 18:16:09.77ID:xKYb+xvk >>278の本は何故か新品よりも高い中古がもう出ているw
(値段のタイプミスか?)
(値段のタイプミスか?)
349デフォルトの名無しさん
2017/12/28(木) 20:08:10.60ID:g7xH4Ri4 購入者の確認不足や品切れ時にたまたま買われることを狙った有名な詐欺だよ
350デフォルトの名無しさん
2017/12/29(金) 01:04:43.78ID:05sEmydS351デフォルトの名無しさん
2017/12/29(金) 10:11:40.46ID:RRbpiG2U >>350
盛ってるから問題ないで
盛ってるから問題ないで
352デフォルトの名無しさん
2018/01/10(水) 07:01:15.70ID:IyW1fpec classのdelegateってinterfaceしか出来ないみたいだけど、
classやabstractのインスタンスでdelegateできない理由をご存知の方いらっしゃいますでしょうか。
可: class SubClass(instance: Interface) : Interface by instance
不可: class SubClass(instance: SuperClass) : SuperClass by instance
classやabstractのインスタンスでdelegateできない理由をご存知の方いらっしゃいますでしょうか。
可: class SubClass(instance: Interface) : Interface by instance
不可: class SubClass(instance: SuperClass) : SuperClass by instance
353デフォルトの名無しさん
2018/01/10(水) 07:32:55.52ID:IyW1fpec もちろんSuperClassはopen指定してあります。
>>352 に答えられる人にそんな野暮なこと言う方はいないと思いますが念のため。
In Actionには「インターフェースを実装しいているなら〜」とさらっと書いていて
クラスでdelegateできない理由は触れられていませんでした。
>>352 に答えられる人にそんな野暮なこと言う方はいないと思いますが念のため。
In Actionには「インターフェースを実装しいているなら〜」とさらっと書いていて
クラスでdelegateできない理由は触れられていませんでした。
354デフォルトの名無しさん
2018/01/10(水) 21:04:38.05ID:CUBllmbw androidにdelegateなんて言葉はない
355デフォルトの名無しさん
2018/01/10(水) 22:52:38.58ID:68cAMYmT >>352-353
例えばこんな感じのKotlinコードをJavaへ変換してみればわかる
interface Interface1 { ... }
interface Interface2 { ... }
class SubClass (impl1:Interface1, impl2:Interface2) : Interface1 by impl1, Interface2 by impl2
例えばこんな感じのKotlinコードをJavaへ変換してみればわかる
interface Interface1 { ... }
interface Interface2 { ... }
class SubClass (impl1:Interface1, impl2:Interface2) : Interface1 by impl1, Interface2 by impl2
356デフォルトの名無しさん
2018/01/11(木) 06:56:39.64ID:irxu1jkK >>355 ありがとうございます。
interface Interface1 { ... } が
open class Interface1 { ... } であったとしても、
class SubClass extends Interface1 implements Interface2
になるので、支障ないと思うのですが、どこか勘違いしていますでしょうか。
interface Interface1 { ... } が
open class Interface1 { ... } であったとしても、
class SubClass extends Interface1 implements Interface2
になるので、支障ないと思うのですが、どこか勘違いしていますでしょうか。
357デフォルトの名無しさん
2018/01/11(木) 07:43:33.12ID:rggai+wG >>356
ごめん多重継承は関係無かったね
問題になるのはコンストラクタかな
class SubClass extends SuperClass というJavaコードに相当するものに変換されるからには
SuperClass のコンストラクタを呼ぶ必要があるけど、
でも SuperClass by instance によってインスタンスが別に渡されたらSuperClassの実体が二つになってしまう
ごめん多重継承は関係無かったね
問題になるのはコンストラクタかな
class SubClass extends SuperClass というJavaコードに相当するものに変換されるからには
SuperClass のコンストラクタを呼ぶ必要があるけど、
でも SuperClass by instance によってインスタンスが別に渡されたらSuperClassの実体が二つになってしまう
358デフォルトの名無しさん
2018/01/11(木) 10:00:24.62ID:J2rrbjux >>352
インターフェースでないと移譲が保証出来ないからでは
インターフェースと違ってクラスの場合はそれが持つオーバーライド可能なメンバ全て移譲しても移譲になるとは限らない
例えば、あるライブラリがInterface, SuperClass, それらを引数に取る関数を提供しているとする
Interfaceを受け取るならInterfaceとして扱うべき
(内部の実装クラスへダウンキャスト出来ること等を前提とすべきでない)で、
SuperClassを受け取る場合も同様だが
こちらはprivateメンバへのアクセスなども含まれていてそれは移譲出来ない
インターフェースでないと移譲が保証出来ないからでは
インターフェースと違ってクラスの場合はそれが持つオーバーライド可能なメンバ全て移譲しても移譲になるとは限らない
例えば、あるライブラリがInterface, SuperClass, それらを引数に取る関数を提供しているとする
Interfaceを受け取るならInterfaceとして扱うべき
(内部の実装クラスへダウンキャスト出来ること等を前提とすべきでない)で、
SuperClassを受け取る場合も同様だが
こちらはprivateメンバへのアクセスなども含まれていてそれは移譲出来ない
359デフォルトの名無しさん
2018/01/12(金) 02:36:59.71ID:EycqiUrc >>352
abstractやclassじゃextendsになっちゃうじゃん
したいのはimplementsじゃん
だからOnly interfaces can be delegated toって言われちゃうんだよ
abstractやclassじゃextendsになっちゃうじゃん
したいのはimplementsじゃん
だからOnly interfaces can be delegated toって言われちゃうんだよ
360デフォルトの名無しさん
2018/01/12(金) 17:51:43.69ID:to65cpCS >>357の言いたかったこととは違うかもしれませんが、以下のように理解しました。
KotlinのdelegateはIn ActionではCollectionを引き合いに出しているが、
実際には、実装したクラスのコンストラクタがprivateで、
ヘルパークラスのファクトリメソッドを通じてしかインスタンスを生成できない
ようなケースで力を発揮する。
コンストラクタがpublicでopenなclassやabstractの場合、素直に継承することを想定している。
In Actionの例も(共変とか反変とかを抜きにすれば)実はArrayListの継承で解決できる。
逆に、classでのdelegateを認めるとfinalなclassも継承できてしまい、
これを禁止するために規則を増やすことになる。
>>359
書き込んだ動機としては、多数のプロパティを持ったクラスを継承したい時に、
class SuperClass(val comp1: Comp1, val com2: Comp2, ...)
class SubClass(instance: SuperClass) : SuperClass(instance.comp1, instance.comp2,...)
とすると、かなり宣言が不格好になるので、
class SubClass(instance: SuperClass) : SuperClass by instance
としたかったのです。
>>358
SuperClass内のSuperClassを引数に取る関数は、
SubClassにおいても引数としてSuperClassを渡せば正しく動作するので、
private(あるいはprotected)メンバへのアクセスがなくても、
実装可能でないかと思います。
ご指摘で理解できていない点があればご指摘いただければ幸いです。
皆様ありがとうございました。
KotlinのdelegateはIn ActionではCollectionを引き合いに出しているが、
実際には、実装したクラスのコンストラクタがprivateで、
ヘルパークラスのファクトリメソッドを通じてしかインスタンスを生成できない
ようなケースで力を発揮する。
コンストラクタがpublicでopenなclassやabstractの場合、素直に継承することを想定している。
In Actionの例も(共変とか反変とかを抜きにすれば)実はArrayListの継承で解決できる。
逆に、classでのdelegateを認めるとfinalなclassも継承できてしまい、
これを禁止するために規則を増やすことになる。
>>359
書き込んだ動機としては、多数のプロパティを持ったクラスを継承したい時に、
class SuperClass(val comp1: Comp1, val com2: Comp2, ...)
class SubClass(instance: SuperClass) : SuperClass(instance.comp1, instance.comp2,...)
とすると、かなり宣言が不格好になるので、
class SubClass(instance: SuperClass) : SuperClass by instance
としたかったのです。
>>358
SuperClass内のSuperClassを引数に取る関数は、
SubClassにおいても引数としてSuperClassを渡せば正しく動作するので、
private(あるいはprotected)メンバへのアクセスがなくても、
実装可能でないかと思います。
ご指摘で理解できていない点があればご指摘いただければ幸いです。
皆様ありがとうございました。
361デフォルトの名無しさん
2018/01/12(金) 19:14:43.07ID:EycqiUrc interface InterfaceClazz{
val comp1:Any
var comp2:Any
fun method1()
}
class SuperClazz(override val comp1: Any, override var comp2: Any) :InterfaceClazz {
override fun method1() {
println("SuperClazz.method1 comp1:$comp1 comp2:$comp2")
}
}
class SubClazz(instance:SuperClazz):InterfaceClazz by instance
こういうのじゃだめなの?
val comp1:Any
var comp2:Any
fun method1()
}
class SuperClazz(override val comp1: Any, override var comp2: Any) :InterfaceClazz {
override fun method1() {
println("SuperClazz.method1 comp1:$comp1 comp2:$comp2")
}
}
class SubClazz(instance:SuperClazz):InterfaceClazz by instance
こういうのじゃだめなの?
362デフォルトの名無しさん
2018/01/12(金) 22:32:24.26ID:to65cpCS363デフォルトの名無しさん
2018/01/13(土) 08:10:52.44ID:9rLeDqe4 Java, C# が、interface を作った理由は、
C++ のclass の、ひし形の形になる、ダイヤモンド継承を嫌ったから
ほとんどの言語は、単一継承 + interface。
継承チェーンに、同じクラスが現れると困る
親クラス ← 子クラス1・2 ← 孫クラス
孫クラスが、子クラス1・2を多重継承すると、
両方の子クラス部分に、親クラスのメンバ変数を含んでしまう
孫クラスからすると、どちらの子クラス経由で、
親クラスのメンバ変数にアクセスすべきか、ややこしい
だから多重継承用に、メンバ変数を持たず、メソッドだけを持つ、interface が作られた
is-a・class・継承よりも、has-a・interface・委譲の方が、柔軟性があって好まれる
C++ のclass の、ひし形の形になる、ダイヤモンド継承を嫌ったから
ほとんどの言語は、単一継承 + interface。
継承チェーンに、同じクラスが現れると困る
親クラス ← 子クラス1・2 ← 孫クラス
孫クラスが、子クラス1・2を多重継承すると、
両方の子クラス部分に、親クラスのメンバ変数を含んでしまう
孫クラスからすると、どちらの子クラス経由で、
親クラスのメンバ変数にアクセスすべきか、ややこしい
だから多重継承用に、メンバ変数を持たず、メソッドだけを持つ、interface が作られた
is-a・class・継承よりも、has-a・interface・委譲の方が、柔軟性があって好まれる
364デフォルトの名無しさん
2018/01/13(土) 10:05:52.35ID:RtHYbtnJ 複数のinterfaceでメソッド名が被ってたらどうするの?
365デフォルトの名無しさん
2018/01/13(土) 10:11:05.35ID:i594883x そんな事態見たことないけど確かにどうなるんだ?
366デフォルトの名無しさん
2018/01/13(土) 10:23:17.39ID:Rp7yFlms パッケージ名とinterface名で指定するんじゃね
367デフォルトの名無しさん
2018/01/13(土) 11:09:24.85ID:rLmRRKlD >>364
実装はサブクラス側でやるんだからどうもなんねーだろ
実装はサブクラス側でやるんだからどうもなんねーだろ
368デフォルトの名無しさん
2018/01/13(土) 12:17:34.58ID:7idPsqBM369デフォルトの名無しさん
2018/01/13(土) 12:18:29.46ID:7idPsqBM Delegataion ってなんだ・・・Delegation ね
370デフォルトの名無しさん
2018/01/18(木) 20:57:21.62ID:uaAP/nEg coroutine builderの例えばasyncの定義を見ると、
fun <T> async(
context: CoroutineContext = DefaultDispatcher,
start: CoroutineStart = CoroutineStart.DEFAULT,
parent: Job? = null,
block: suspend CoroutineScope.() -> T
): Deferred<T> (source)
ってなってんですが、blockパラメータの型が関数型になっているのですが、
型の前にCoroutieScope.とかついてるのですが、これはなんなんでしょうか??
fun <T> async(
context: CoroutineContext = DefaultDispatcher,
start: CoroutineStart = CoroutineStart.DEFAULT,
parent: Job? = null,
block: suspend CoroutineScope.() -> T
): Deferred<T> (source)
ってなってんですが、blockパラメータの型が関数型になっているのですが、
型の前にCoroutieScope.とかついてるのですが、これはなんなんでしょうか??
371デフォルトの名無しさん
2018/01/18(木) 22:13:56.56ID:h6w5lyYQ372デフォルトの名無しさん
2018/01/18(木) 22:42:32.43ID:uaAP/nEg >>371
ありがとうございます。
うーん。ややこしい。何のためにこんなのが必要なんだ・・
呼び出される関数の方でもインスタンス(val a = A("aa"))を作って
関数を呼び出さないといけないってことですよね。
ありがとうございます。
うーん。ややこしい。何のためにこんなのが必要なんだ・・
呼び出される関数の方でもインスタンス(val a = A("aa"))を作って
関数を呼び出さないといけないってことですよね。
373デフォルトの名無しさん
2018/01/18(木) 23:47:50.82ID:h6w5lyYQ374デフォルトの名無しさん
2018/01/22(月) 22:47:52.97ID:FT3BkIDm375デフォルトの名無しさん
2018/01/23(火) 18:27:08.00ID:himcush7 仕組み的に体感出来る程の劣化は起きないと思う
376デフォルトの名無しさん
2018/01/23(火) 19:46:07.93ID:leMx6cGU エルビス式のエルビスって何ですか?プレスリーしか出てこないんですけど
377デフォルトの名無しさん
2018/01/23(火) 19:47:46.14ID:leMx6cGU と思ってググったら本当にプレスリー由来だったのね、、
378デフォルトの名無しさん
2018/01/23(火) 23:26:39.49ID:9+CEbA1m >>375
調べてみたら、delegateよりも前に速度低下はあったようでした。ありがとうございました。
調べてみたら、delegateよりも前に速度低下はあったようでした。ありがとうございました。
379デフォルトの名無しさん
2018/01/24(水) 07:00:29.98ID:YOaqJu3C ?: これのどこがプレスリーなんだよ?と思った時の脳内に浮かんでいたのはサタデーナイトフィーバーの人だったのは俺だけだろうな
380デフォルトの名無しさん
2018/01/24(水) 09:46:01.11ID:yQK5cwW2 ?:)
381デフォルトの名無しさん
2018/01/24(水) 12:18:03.47ID:wZvPOi0Q ?が5
382デフォルトの名無しさん
2018/01/31(水) 15:59:06.95ID:4N9XMFe/ >>161だけど
Javaのリリースサイクルが6か月ごとになったので2018/3/20リリース予定
http://openjdk.java.net/projects/jdk/10/
ローカル変数の型推論きたー
後はGoogleさん早めにAndroidで使えるように。
Javaのリリースサイクルが6か月ごとになったので2018/3/20リリース予定
http://openjdk.java.net/projects/jdk/10/
ローカル変数の型推論きたー
後はGoogleさん早めにAndroidで使えるように。
383デフォルトの名無しさん
2018/01/31(水) 16:05:14.51ID:4N9XMFe/ 後はkotlinを使ってみて自分的にうらやましのは
・Null safety
・1ファイルに複数のクラス書ける
・コルーチン
ぐらいかな・・
・Null safety
・1ファイルに複数のクラス書ける
・コルーチン
ぐらいかな・・
384デフォルトの名無しさん
2018/01/31(水) 18:17:51.93ID:hwMh3j1W 俺は
・val
・最後の引数のラムダを括弧の外に書けること
・「==」でnull考慮込みのequals()呼び出しにしてくれること
・val
・最後の引数のラムダを括弧の外に書けること
・「==」でnull考慮込みのequals()呼び出しにしてくれること
385デフォルトの名無しさん
2018/01/31(水) 18:53:28.83ID:F5No3k5g とにかくJavaと同じことをするのに記述量が圧倒的に少なくて済むのが良いわ。
一つ一つはそれこそ数行程度の違いになるけど、チリが積もって最終的にかなり短くなって可読性が段違い
一つ一つはそれこそ数行程度の違いになるけど、チリが積もって最終的にかなり短くなって可読性が段違い
386デフォルトの名無しさん
2018/01/31(水) 20:20:09.40ID:CrWRl7VR Sから始まる某言語と違って何故か読みやすい
387デフォルトの名無しさん
2018/01/31(水) 20:58:06.42ID:UVbJv7LF Smalltalkの悪口はやめろ
388デフォルトの名無しさん
2018/01/31(水) 21:14:03.77ID:AX72W1bb 俺のS言語が・・・
389デフォルトの名無しさん
2018/01/31(水) 23:02:47.38ID:Mw3vWzBx SQL
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 空自機レーダー照射、音声データ公開 中国 [蚤の市★]
- 「中国側も日本機のレーダーを感知していた」 中国メディアが報道 [♪♪♪★]
- 日銀「歴史的」利上げ迫る 35年ぶりの年間上げ幅、0.5%の壁を突破 [蚤の市★]
- 堀江貴文、キャッシュレス非対応の店にモヤッ 『PayPay』立ち上げの人物にまさかの直談判「現金決済しかできないんだけど…」 [冬月記者★]
- 【おこめ券】鈴木農相 米価維持の意図「一切ない」★3 [ぐれ★]
- 【サッカー】上田綺世の活躍は「一過性」 15戦18発も…オランダ英雄は懐疑的な姿勢「確信に至っていない」 [ゴアマガラ★]
- 【悲惨】中国軍が自衛隊に「事前通告」し自衛隊も返答した音声が公開されてしまうwwwこれは高市チェックアウトゕ★2 [597533159]
- 【悲惨】中国軍が自衛隊に「事前通告」し自衛隊も返答した音声が公開されてしまうwwwこれは高市チェックアウトゕ [597533159]
- 現役JKのお茶会スレ( ¨̮ )︎︎𖠚ᐝ180
- 中国の日本向けレアアースの輸出止まる、高市のせいで日本終了のお知らせ [931948549]
- 韓国政府、高市早苗の「竹島領土」発言にブチギレwwwwwwwwwwwwwwww [834922174]
- 【悲報】JA「全然米が売れなくて倉庫を圧迫してる。助けて!」米卸売り業者「安売りしたら赤字になる…助けて!」 [802034645]
