X



Kotlin 2
■ このスレッドは過去ログ倉庫に格納されています
0293デフォルトの名無しさん
垢版 |
2017/12/11(月) 23:58:47.24ID:jDa4LF1V
>>291
自分はスタートブックを推す。
Javaを知っていることを前提としない入門書の存在を自分は知らない。
0294デフォルトの名無しさん
垢版 |
2017/12/12(火) 00:03:08.61ID:UCmbxn8n
>>292
慌てて修正したらlazy落としていたorz orz
var value by lazy { initValue() }
連投申し訳ない。これで違っていたら目も当てられんが、それもすみません。と誤っておきます。
0296デフォルトの名無しさん
垢版 |
2017/12/12(火) 00:45:23.57ID:GdvZGdbs
>>291
Kotlinスタートブック -新しいAndroidプログラミング、長澤 太郎、2016

一番良いもクソも無い。
この1冊しか出ていないだろ
0299デフォルトの名無しさん
垢版 |
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で書けるので好まれることが多いみたいだね
0300デフォルトの名無しさん
垢版 |
2017/12/12(火) 06:12:22.97ID:GdvZGdbs
長澤太郎の本に書いてあるけど、

lateinit は、DI(Dipendency Injection)か、ユニットテスト時か、

フレームワークが自動的に初期化すると、不都合な場合に使う
0309デフォルトの名無しさん
垢版 |
2017/12/14(木) 07:40:22.43ID:v/ZRkoO2
>>308
デフォルト値はコンパイラが定義参照してるだけで、
型にもインスタンスにも持って無いから変数に入れた時点で使えないよ

fun f1(n: Int=1) { print(n) }
val f2 = ::f1
f1() //OK
f2() //コンパイルエラー
0312デフォルトの名無しさん
垢版 |
2017/12/14(木) 09:49:51.95ID:DkrsR4qN
Cでググってもノイズが拾われてくる率が高い
他のCと間違われてるんじゃないのか
0313デフォルトの名無しさん
垢版 |
2017/12/14(木) 10:12:12.59ID:rSG8ExGM
Cの半分はC++という時代があったからな
Cの半分はC#とC++ということでも不思議はない
C sharpならC#確定なのだが
0314デフォルトの名無しさん
垢版 |
2017/12/14(木) 10:35:46.55ID:LuQDs4YA
C++はcocos2dやUnrealでのゲーム開発とかあるけどCはなんだろうな
廃れることはあり得ないけど
0315デフォルトの名無しさん
垢版 |
2017/12/14(木) 11:38:25.42ID:DkrsR4qN
機械学習とかロボティクスとか自動運転とかがメディアで取り上げられるようになって学生にプログラミングへの関心がいっそう高まって教育現場での採用が増えてるのかもしれないな
就職にも有利なスキルだろうし
もともと人気の高い言語だし本格的なプログラミングの登竜門的な立ち位置の言語でもあるし
0317デフォルトの名無しさん
垢版 |
2017/12/14(木) 21:38:11.42ID:5ZTCzvqn
(IoT)

こうすると顔文字になるよね
0318デフォルトの名無しさん
垢版 |
2017/12/14(木) 22:23:38.53ID:55Q0ymnI
検索エンジンで+"C programming" で検索した結果参照してるだけだからな
単にデータとしてうんこオブうんこだ
githubやstackoverflow読んでるIEEEのランキングのほうがなんぼかマシ
0319デフォルトの名無しさん
垢版 |
2017/12/19(火) 10:24:09.99ID:f5KBk+Xr
Javaの無名スコープを表す構文が無いことから調べていってみたけど
色々と良く設計されてると感心した

構文が無い代わりにrun関数がある
ラムダ生成コストやブロック内でのreturnが気になったけど
inline関数に渡すラムダはそれごとインライン化されるため
コストも無くreturnはちゃんと呼び出し元関数から抜ける

そうするとinlineでない関数にラムダを渡す場合のreturnとで
区別出来なくて危険かと思ったけど
inlineでないラムダではラベル無しreturnが禁止されていた

returnにラベル必須だと面倒ではと思ったけど
最後のステートメントが戻り値になる仕様だからむしろ楽だった
0320デフォルトの名無しさん
垢版 |
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 //ここには来ない
 }
0321デフォルトの名無しさん
垢版 |
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キーワード無し
  }
}
0322デフォルトの名無しさん
垢版 |
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){/*処理*/}

なんか、どれもしっくりこない。どうするのが正解なの....
誰か教えて!お願いします!
0323デフォルトの名無しさん
垢版 |
2017/12/20(水) 03:07:01.09ID:vJEKLhBA
if (map.getOrDefault("hoge", false)) { ... } とか。
うーん。なんか変だね。mapOf では nullable かどうか判定しているのに get 時には nullable かどうかの情報が抜け落ちているような。
0325デフォルトの名無しさん
垢版 |
2017/12/20(水) 03:15:09.91ID:O14cUYGW
知らんが、kotlinみたいな言語だとキーが無いときの処理を適当にごまかすわかにはいかんだろ
0326デフォルトの名無しさん
垢版 |
2017/12/20(水) 03:31:33.35ID:nn3v7K50
>強制的に!!でNotnullにする。でもなんか気持ち悪い。
>if (map["hoge"]!!){/*処理*/}

そもそも、map は、そのキーが存在しない場合もあるのが、当たり前だろ。
そのキーが存在するかどうかを、チェックするメソッドもある

君が仕様・設計を考えるんだ。
1. そのキーが存在した場合の処理と、
2. 存在しなかった場合の処理

初心者は、強制変換の使い方をわかっていないのだから、!! を使うな
0327デフォルトの名無しさん
垢版 |
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()
}
0328デフォルトの名無しさん
垢版 |
2017/12/20(水) 04:24:12.03ID:MahKH8pr
寝起きで書いたら!=がくっついた
if (mapValue != null && mapValue) { doSomething() }
まだ頭寝てるので動作チェックしてないから細かいとこは適当に直したりしてくれ

>>326
安易に nullableValue?.let{ ... } を使って欲しくないのも似たような感じ
今回で言うと現在のmapに"hoge"が登録されていることの保証はどうするんだろうと思う
ぬるぽ出ると追うのもしんどいわけでさ
1行で済むし動作にも影響らしい影響はないんだから脳死状態で checkNotNull(...){ "やべえhoge登録されてねえ" } とか書いとくのおすすめしたいわ
0329デフォルトの名無しさん
垢版 |
2017/12/20(水) 07:46:04.79ID:nn3v7K50
map, hash は、集合の概念だから、
集合A に属するか属さないか、のどちらかの状態をとる

1. そのキーが集合A にあれば、値が取得できる
2. そのキーが集合A になければ、値が取得できない

1, 2 で、君がどういう処理をするか、仕様・設計を決めるのは君!
0331デフォルトの名無しさん
垢版 |
2017/12/20(水) 12:00:57.83ID:f5FKKl5l
Bがバカっぽいと感じるのは
真偽値 == 真偽値 だと勘違いしているから

実際には2つのNullableTypeの等値比較
0332デフォルトの名無しさん
垢版 |
2017/12/20(水) 13:02:21.99ID:G3r13eVw
if(map.getValue("hoge")){/* 処理 */}
これで基本的にキーが存在しないと例外に行くしシンプルだね
0333デフォルトの名無しさん
垢版 |
2017/12/20(水) 13:25:19.85ID:g9yiCifS
直感的にはおかしく感じるな。(最初結果見た時は驚いたw)
https://paiza.io/projects/zLCe3AYlPO9luQp7z2NaIw
しかしクラスの参照同士の比較なのでこれで良い。
0334デフォルトの名無しさん
垢版 |
2017/12/20(水) 13:51:27.51ID:cc5ffQEu
322です。
こんな速くレスいっぱい貰えるとは....皆ありがとう!
基本的にNullチェックは必須なんだね

>>331
そういうことか!あくまで等値比較なのかー

>>327
>感が方がJavaっぽい
これやったんだけど、あんまりキレイな感じしないし、何よりJavaっぽくて....

>>332
そのメソッド知らなかった。使ってみます。
0337デフォルトの名無しさん
垢版 |
2017/12/20(水) 15:20:49.03ID:g9yiCifS
>>335
not false が true でない?
じゃあなに?
0339デフォルトの名無しさん
垢版 |
2017/12/20(水) 16:17:54.73ID:f5FKKl5l
>>337
>>333>>335のコードが示すように
Nullable(null)もStringも真偽値ではないため
falseとtrueどちらにも等値でない

falseでない真偽値はtrueだが
falseでない値はtrueとは限らない

「True, null」だから違和感が有って
「not false, null」なら無かったのでは
0340デフォルトの名無しさん
垢版 |
2017/12/20(水) 16:28:57.34ID:f5FKKl5l
>>333
リンク先のコード消えてるよ

同じ接続元・同じURLで開くと変更モードになるようだから
「新規コード」を押してから扱わないといけない
0346デフォルトの名無しさん
垢版 |
2017/12/25(月) 09:22:20.35ID:pKfklu/G
    \   ∩─ー、    ====
      \/ ● 、_ `ヽ   ======
      / \( ●  ● |つ
      |   X_入__ノ   ミ   そんな餌で俺様が釣られクマ――
       、 (_/   ノ /⌒l
       /\___ノ゙_/  /  =====
       〈         __ノ  ====
       \ \_    \
        \___)     \   ======   (´⌒
           \   ___ \__  (´⌒;;(´⌒;;
             \___)___)(´;;⌒  (´⌒;;  ズザザザ
0348デフォルトの名無しさん
垢版 |
2017/12/28(木) 18:16:09.77ID:xKYb+xvk
>>278の本は何故か新品よりも高い中古がもう出ているw
(値段のタイプミスか?)
0349デフォルトの名無しさん
垢版 |
2017/12/28(木) 20:08:10.60ID:g7xH4Ri4
購入者の確認不足や品切れ時にたまたま買われることを狙った有名な詐欺だよ
0350デフォルトの名無しさん
垢版 |
2017/12/29(金) 01:04:43.78ID:05sEmydS
>>347
確かに可愛いがムネ大き過ぎ。
D,EかせめてFカップなら信者になってた。
0352デフォルトの名無しさん
垢版 |
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
0353デフォルトの名無しさん
垢版 |
2018/01/10(水) 07:32:55.52ID:IyW1fpec
もちろんSuperClassはopen指定してあります。
>>352 に答えられる人にそんな野暮なこと言う方はいないと思いますが念のため。

In Actionには「インターフェースを実装しいているなら〜」とさらっと書いていて
クラスでdelegateできない理由は触れられていませんでした。
0355デフォルトの名無しさん
垢版 |
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
0356デフォルトの名無しさん
垢版 |
2018/01/11(木) 06:56:39.64ID:irxu1jkK
>>355 ありがとうございます。
interface Interface1 { ... } が
open class Interface1 { ... } であったとしても、
class SubClass extends Interface1 implements Interface2
になるので、支障ないと思うのですが、どこか勘違いしていますでしょうか。
0357デフォルトの名無しさん
垢版 |
2018/01/11(木) 07:43:33.12ID:rggai+wG
>>356
ごめん多重継承は関係無かったね
問題になるのはコンストラクタかな
class SubClass extends SuperClass というJavaコードに相当するものに変換されるからには
SuperClass のコンストラクタを呼ぶ必要があるけど、
でも SuperClass by instance によってインスタンスが別に渡されたらSuperClassの実体が二つになってしまう
0358デフォルトの名無しさん
垢版 |
2018/01/11(木) 10:00:24.62ID:J2rrbjux
>>352
インターフェースでないと移譲が保証出来ないからでは

インターフェースと違ってクラスの場合はそれが持つオーバーライド可能なメンバ全て移譲しても移譲になるとは限らない
例えば、あるライブラリがInterface, SuperClass, それらを引数に取る関数を提供しているとする
Interfaceを受け取るならInterfaceとして扱うべき
(内部の実装クラスへダウンキャスト出来ること等を前提とすべきでない)で、
SuperClassを受け取る場合も同様だが
こちらはprivateメンバへのアクセスなども含まれていてそれは移譲出来ない
0359デフォルトの名無しさん
垢版 |
2018/01/12(金) 02:36:59.71ID:EycqiUrc
>>352
abstractやclassじゃextendsになっちゃうじゃん
したいのはimplementsじゃん
だからOnly interfaces can be delegated toって言われちゃうんだよ
0360デフォルトの名無しさん
垢版 |
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)メンバへのアクセスがなくても、
実装可能でないかと思います。

ご指摘で理解できていない点があればご指摘いただければ幸いです。

皆様ありがとうございました。
0361デフォルトの名無しさん
垢版 |
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
こういうのじゃだめなの?
0362デフォルトの名無しさん
垢版 |
2018/01/12(金) 22:32:24.26ID:to65cpCS
>>361
自分が作ったクラスの場合ならそうできることは考えましたが、
他人がinterfaceを定義せずに作ったクラスでやりたい場合どうすればいいんだろうという疑問でした。
0363デフォルトの名無しさん
垢版 |
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・委譲の方が、柔軟性があって好まれる
0367デフォルトの名無しさん
垢版 |
2018/01/13(土) 11:09:24.85ID:rLmRRKlD
>>364
実装はサブクラス側でやるんだからどうもなんねーだろ
0368デフォルトの名無しさん
垢版 |
2018/01/13(土) 12:17:34.58ID:7idPsqBM
delegataion 使った >>355 みたいなので Interface1 と Interface2 に同じメソッドが定義されている場合にはエラーになるけど、
SubClass で override しろって IDE が言ってくるので、それすればエラーは消える
delegatation 使わないのなら >>367 が言うようにサブクラスで実装するんだから関係無いね
0370デフォルトの名無しさん
垢版 |
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.とかついてるのですが、これはなんなんでしょうか??
0372デフォルトの名無しさん
垢版 |
2018/01/18(木) 22:42:32.43ID:uaAP/nEg
>>371
ありがとうございます。

うーん。ややこしい。何のためにこんなのが必要なんだ・・
呼び出される関数の方でもインスタンス(val a = A("aa"))を作って
関数を呼び出さないといけないってことですよね。
0374デフォルトの名無しさん
垢版 |
2018/01/22(月) 22:47:52.97ID:FT3BkIDm
delegateってパフォーマンス悪かったりします?
>>361のような方法を試したら、目に見えて遅くなりました。
もっとも他にも色々いじった後だから、他が原因の可能性もありますが....。
0376デフォルトの名無しさん
垢版 |
2018/01/23(火) 19:46:07.93ID:leMx6cGU
エルビス式のエルビスって何ですか?プレスリーしか出てこないんですけど
0378デフォルトの名無しさん
垢版 |
2018/01/23(火) 23:26:39.49ID:9+CEbA1m
>>375
調べてみたら、delegateよりも前に速度低下はあったようでした。ありがとうございました。
0379デフォルトの名無しさん
垢版 |
2018/01/24(水) 07:00:29.98ID:YOaqJu3C
?: これのどこがプレスリーなんだよ?と思った時の脳内に浮かんでいたのはサタデーナイトフィーバーの人だったのは俺だけだろうな
0380デフォルトの名無しさん
垢版 |
2018/01/24(水) 09:46:01.11ID:yQK5cwW2
?:)
0383デフォルトの名無しさん
垢版 |
2018/01/31(水) 16:05:14.51ID:4N9XMFe/
後はkotlinを使ってみて自分的にうらやましのは
・Null safety
・1ファイルに複数のクラス書ける
・コルーチン
ぐらいかな・・
0384デフォルトの名無しさん
垢版 |
2018/01/31(水) 18:17:51.93ID:hwMh3j1W
俺は
・val
・最後の引数のラムダを括弧の外に書けること
・「==」でnull考慮込みのequals()呼び出しにしてくれること
0385デフォルトの名無しさん
垢版 |
2018/01/31(水) 18:53:28.83ID:F5No3k5g
とにかくJavaと同じことをするのに記述量が圧倒的に少なくて済むのが良いわ。

一つ一つはそれこそ数行程度の違いになるけど、チリが積もって最終的にかなり短くなって可読性が段違い
■ このスレッドは過去ログ倉庫に格納されています