Kotlin 2
■ このスレッドは過去ログ倉庫に格納されています
これはこれで同じこと書いてる感がん〜って感じではある class MyData(name: String, age: Int){ val name = name val age = age } 引数にval書けちゃうことでの「見かけ一貫性の破れ」と「引数もチェックしなければならなくなったという手間」は肯定する というかあれはdataクラスを便利に書くためだけのギミックな気がするぞ しかし言われてみれば視線的にめっちゃ遠いのはその通りだな、家のやつは今度使わずに書いてみるか KotlinがNull安全といっても結局、Javaなどの使用するクラスライブラリがNull安全じゃないからな。 Kotlinだけで閉じてればいいけど、Kotlin最小限のライブラリしか用意してねぇし。どうすりゃいいんでしょうか?? 「!!」演算子積極的に使えばいいの? うん。自分のメソッドはNot Nullにしてるけど、その実装で結局、Javaのクラスが絡む事多いから、 その実装部分で「!!」連発してるんだけど、なんだかなぁ・・・・・ ぬるぽが出そうならトラップするという記法がKotlinにはいくつもあるだろそれ使え chackNotNull(nullable){ "ぬるぽだけは阻止しましたが例外で落ちますさようなら" } nullable?.aaa?.bbb ?: throw RuntimeException("エラーとぬるぽって死ぬ点で大差なくね?") when(){ nullable == null -> println("おかあさんに言いつける") isSomeState -> nullable.xxx.yyy // 文脈上nullが来得ないので ?. で書かなくていい } ああまた空whenに()つけてる 毎回間違って毎回IDEに文句言われるんだよなこれ >ぬるぽが出そうならトラップ ぬるぽが出そうというより、Javaのクラスから返される型は「型名!」ってAndroid Studioを 表示されてて、この型ってNullableの「型名?」と同じでNullチェックしないといけないと思ってて 「!!」連発してたんだが、これ違うな・・・ 「型名!」ってNullチェックしなくてもいいのか・・・ つか、言語仕様上どんな扱いになってんだこれ・・ >>60 で質問したときに、>>61 で答えてもらって ただのIDEの表示上の事なんだと思ってたが違うのか?? T? と T or T? は違うよ Nullableかどうかすらわからない後者の場合はnullチェックしなくてもコンパイルは通るよ 「だってそれはNullableではないから」 まあ、そしてぬるぽが出るんだけども Kotlin的にはnullチェックは不要だけどIDE的にはnullが入りうることがわかってるので気を付けてね! の ! だ >>155 ありがとうございます。 Platform Typesについてしっかり読んでませんでした。そこに色々書いてありましたね。 >T? と T or T? は違うよ T or T?がプラットフォーム型というやつですかね。で、プラットフォーム型ではNullチェックが緩和される って書いてありましたね。 T? と T or T? は同じと勘違いしてました。要はT or T?か分からないから、よりたくさん表現できるT?として扱えばいいし、 そうなってるのかと勘違いしてました。 つか、デバッグしてて思ったけど、C#のusing (resource)やlock文に相当する言語組み込みの 文がkotlinにないのがちょっとめんどくさいよね。ステップオバーで順にどんどん進めねぇじゃねぇか・・ inputStream.use { // いちいちここにブレークポイント設定しないと・・・ }とかだと、実態は関数呼び出しだから、ステップオーバーだと、内部のブロック飛び越えちゃう・・ ああ、ステップインで行けたね。ステップインすると、最初useなどの拡張関数の方にぶっとぶかと思ったけど、 自分のブロックの方に直接飛べるのか。 まぁ、オーバー・インを切り替えるのひと手間だけど、まぁそれぐらいなら。 正直、AndroidのJavaの代替としてKotlinを使うなら、Android Studio 3.0でJavaで全APIレベルでラムダ式が 使えるようになったらしいし、後、Javaにvarなどのローカル変数の型推論あたりがくれば、Javaでも いいかなと思うが(async/awaitもほしいけど)、Kotlin for JavaScriptの存在を知って、 ちょうど、JavaScriptとかスクリプト言語を本格的に使った事なく動的型付け言語使いたくない自分にぴったしだと 思ってKotlin覚えてみようかなと思ってきた。 Kotlin,JavaScriptでググってもあんま引っかからんけど、TypeScriptとかにとって代わったりしそうじゃねぇか?? >>161 > Javaにvarなどのローカル変数の型推論あたりがくれば それ実現されるまでまってられっかよ Haxe(ヘックス)はOSSで、JSに型チェックを付けたような言語で(altJS)、 JS(ES5), Flash, PHP, C++, Java, C#, Python, Lua に書き出せる。 Windows8.1対応。IDEは、FlashDevelop このサイトで、ブラウザでプログラミングして、実行できる Try Haxe ! try.haxe.org/ Kotlin = Java + Groovy Haxe, Kotlin, Ruby をやると、他の言語がクソに見える >>163 言語がどうのこうの言ってるうちは、まだまだだよ。 kotlinから始めたら挫折して、 結局Javaの勉強再開しました。 何個かアプリ作れるようになったけどまだまだ。 Java覚えたらkotlinまで追いつきたい。 Javaで動くアプリ作れてKotlin書けないってのもわりとレアケースだと思うのだが(完全に全くJava以外の経験がないとか?) まあ個人の進度に文句もないしKotlinはしばらく逃げないので焦らずお好きにやっていただきたい >>167 Javaの勉強途中でちょうどkotlinが盛り上がってて、 両方覚えられる!と欲張った結果、 なんか情報も少なく、混乱して挫折。 とりあえずJavaで慣れたらkotlinもやってみます。 Kotlinスタートブック -新しいAndroidプログラミング、長澤 太郎、2016 プログラミング言語初学に向かないのは多分間違いない C#のusingもJavaのtry-with-resourcesもkotlin.io.useも気に入らない GCだからC++やSwiftのようなデストラクタまでは無くてもいいけど せめて use val xx = ... のようにキーワード付き変数の場合に スコープアウトでcloseする構文を用意して欲しい 後処理の指定ごときでいちいちブロックスコープ増やすなと >>172 中括弧省略すればブロックスコープ増えないし、ほぼそれと同じ構文で書けるやん そーゆークラスを作ればいい 内部的にはそうしてても使う側が意識しなきゃそれでいい StackOverFlowで「○○するにはどうすればいいですか」に対して 自作の20行くらいの関数返して「こうすれば1行で書ける」とか言う回答者みたいだなw 例えばこれを openCamera(id).use { dev -> dev.video().use { vidIn -> File(dstPath).outputStream().use { output -> val vidOut = videoWriter(output) vidIn.eachFrame { frame -> filter.write(frame, vidOut) return checkContinue() } } } } このように use val dev = cameraOpen(id) use val vidIn = dev.video() use val output = File(dstPath).outputStream() val vidOut = videoWriter(output) vidIn.eachFrame { frame -> filter.write(frame, vidOut) return checkContinue() } 次点で、golangのdeferのように val dev = cameraOpen(id) defer{dev.close()} val vidIn = dev.video() defer{vidIn.close()} val output = File(dstPath).outputStream() defer{output.close()} val vidOut = videoWriter(output) vidIn.eachFrame { frame -> filter.write(frame, vidOut) return checkContinue() } としたい usingやuse関数での書き方が駄目とまでは言わないが俺は気に入らない そういやjetbrainのIDEってjavaで出来てるんだよな。 kotlinで書き直されたりしてんのかな。そのへんどうなの?中の人とか? >>176 >>177 純粋な興味で質問するんだけど その書き方で各段階のデバイスオープン不可だったとき対処できる言語ってあるの?try-catchで括っておくとかなのかな。 >>176 の下の書式は最初のデバイスがヌルが返ってきたときに雪崩式にハングしそう。 >>177 は最初にデバイスクローズして下に流れたらどうなってしまうのか。 try-with-resourcesみたいに「ここでリソース開いてるしエラーも起こりうるぞ!」って明示してくれるのが好き 文句の本質的には「ブロックネスト深すぎて見かけの空白多くてキモい」ってだけだよねコレ まあ見かけはかなり重要なのだが どこでcloseが起こるかわかるほうがいいとは思うけどな ブロック深いのとは別件な気がする >>180 3例とも同じ動作想定のサンプルコードだよ オープン不可はnullでなく例外、どこで例外が起きても開いた分はcloseされる >>182 そう、キモいってだけ 実行のタイミングと順序は厳密に決まるからどこでcloseが起こるかは分かる closeの仕掛けとブロック増加が不可分なのが気に入らないという話 kotlinはまず開発環境をもっと整えてほしいわ。 特にVisual Studio Codeで無料の拡張プラグインを。 JetBrainはIDEを打ってる会社なのかもしれんが・・ >>184 すまんそれがどう「ほぼそれと同じ構文」に繋がるのかイメージ出来ない >>176 の例だとどうなる? forを読めるが書けない これだけが毎回全く覚えられない(あの形式はレガシーであって何の意味もないと思う) イテレータでいいと思うのだが、Rangeはなにやら遅いとか言われてて憂鬱だ >>178 ,185 誤 : JetBrain 正 : JetBrains >>189 ifの中括弧省略と一緒と聞いて本当にわからないのであれば重症やな >>191 煽ってくる意味が分からない 具体例を示すだけだと思うんだが・・・ >>176 はそんなにopenとcloseをしないといけないのはクラス設計に問題があるのではないだろうか。 そこまでしないといけないことが頻繁にあるケースはまれだと思うので、拡張関数を定義して解決しては。 あと、個人が気に入らないと思うたびに構文を増やしたらC++みたいになるのは歴史が示すところかと。 >>173 Kotlinでは>>176 のケースはif式のように{}を省略することはできないような気がするのですが。 省略できても見かけのブロックがなくなるだけで、多重ネスト構造なのは変わらない気がする。 >>191 俺も分からないので是非書いて欲しい。 こちらはKotlin学習中なので重症ではない。単にわからないだけだ。 >>177 File.open(ファイル名) do |file| 処理 end Ruby では、File.open()に、クロージャの実装である、ブロックを渡すと、 close()する必要がなくなる。 自動的に内部的に、例外処理で囲んで、finally で、close してくれる たいていの言語で、そう JVM版とNative版など環境がいくつかあるけど、標準ライブラリは基本共通なの? こういう風に違うシグネチャの関数の参照はどうしたら良いのか? https://ideone.com/jXVu5V 未対応なので回避策とるくらいしか val fa = {n:Int -> f(n) } val fb = {n:Int, s:String -> f(n, s) } あ。未対応だったのか。どうりでいくら調べても見つからないと思った。 それならそんな風に書くしかないね。 >>200 おー。なるほど。ありがとう。 まあでも自分でシグネチャ指定して振り分ける感じに書く必要はあるということだね(Cでの関数へのポインタみたいなもんだからそうならざるを得ないか)。 あるメソッドの中の処理を切り出して作った1行系プライベートメソッドってあるよね 親メソッドの前に書いたほうがいい? 後に書いたほうがいい? 親メソッドに長いJavaDoc、または長めのコメントがある場合、前に書いちゃうとプライベートメソッドが離れちゃって見難い/醜いよね // subするメソッド private fun subMethod() = ... /* * メインなことをするメソッド * がんばってつくりました * 3行も説明書いたのでボーナスください */ fun mainMethod(arg: SomeObj){ ... } そういう意味ではメインのあとに書いたほうがいいんだけど、親メソッド読んでる最中に見たことないメソッドが出てきちゃって「ん??」ってなるよね fun mainMethod{ ... ....subMethod(...) ← えっコレ何? } private fun subMethod() = ←定義ここかよおせーよ Java書いたことないからこのへんの作法わかんないんだけど、なにか傾向とかあるのかな IDEの機能で定義に飛ぶから別に気にならない ソースファイルを上から順に眺めていくってあんまりないなあ どっちでもいいけど自分は後ろ。 定義なんてIDEでジャンプできるんだしどうでもいいでしょ。 >定義に飛ぶから >定義なんてIDEでジャンプできる なんだよ (いろいろ眺めつつ)IntelliJ IDEAではF4かな。とう。おお。…さっきのとこ戻るにはどうすればいいんだろう https://youtrack.jetbrains.com/issue/IDEA-119474 無理か。まあいいや いや、それにしても固めて書いておく時の一般的なやり方とか見てて迷わない書き方とかあるのかなーと思って >>206 subMethodのKDocをしっかり書いておけば、ジャンプしなくてもマウスオーバーで 何をするメソッドかわかるから後置でいいのではと思う。 戻るのはデフォルトだとたぶん Ctrl+Alt+左 定義に飛んでその後戻るのをキーボードで素早くできるようにしとかないと作業が捗らんから、 おれはどんな環境でもAlt+ピリオドとAlt+カンマにカスタマイズする たまにカスタマイズできない環境もあるが >>206 F4ではなくCTRL+マウスクリックじゃない? F4 は "Jump to Source" で、Ctrl+Button1 は "Decraration" だね 両方とも定義へ飛ぶけど、定義を選択して操作したときに "Decraration" のほうは使用箇所へ飛ぶメニューがでるね おれは間違えて押したときにメニューでるのが面倒なのでキーにカスタマイズして使ってるのは "Jump to Source" の方 使用箇所へ飛びたいときには Find usages を使うし あー F4でjump to sourceし CMD+F4 (Macの場合)でタブクローズすればいいんじゃない あと、quick definitionってのもある vimのプラグイン入れてるけどcommand+[ですぐ戻れる 基本はそれですね、開いたタブを同時に閉じたい場合はcloseかな Jump to SourceとDecrarationの違いを、もうひとつ見つけてしまった DecrarationはAndroid環境だとリソースIDからレイアウトXMLへ飛んだりもできるのね Jump to SourceだとリソースIDそのものの値を定義してるファイルに飛んじゃうので意味無い やっぱデフォルトはDecrarationにしよう・・・ haskellとか知ってると、まず宣言的コードがあって実装はあとからついてくるコードスタイルでも違和感はない。 トップダウンで見るかボトムアップで見るかの違い。 まあ、IDEさまさまなところはあるにはある IDEがなかったら全然違っていただろうなと思う事象は多い IDEってEclipse?AndroidStudioのベータ? JetBrains製以外のIDE使ってる人居るのかな Vimは居そう >>217 そら第一候補はIntelliJでしょ ≒ Android Studio Eclipseとか原始時代の道具をまだ使ってるやつがいるのか ん?でも Linux でも IntelliJ 使えるよ。 ああ。まあ。確かにviってかvim使う方が多いが、さほど困らんなあ。 リモートデスクトップ経由でLinuxのIntelliJ&Android Studio使ってうっひょーって言ってるよ Emacsのkotlin-modeがぜんぜんイマイチなのはIntelliJ IDEAのせいではないかと思っている >>226 IDEAがあるせいで他がしょぼいというより、Kotlinの歴史の浅さやまだゴミのようなシェアの割にはIDEAの出来が良いんだろ Kotlin自体がJetBrainsによってIDEAで使うために作った言語なんだから当然 Kotlinはidea以外の環境を最低一つサポートしろよな。自社でIDEを売ってるからやだとかはやめてくれ。 VisualStudio Codeかatomのどっちかの軽量環境は最低どちらかサポートしろよ。 言語提供側がすべきなのは処理系の提供であって IDE云々で文句を言うのは筋違い それは処理系に言う筋合いのものではないが。 最近のエコシステムに慣れすぎるとそう言いたくなるのはわからんでもないが。 使う側からしてみれば、言語提供側だろうが処理系だろうがどうでもいい。 ユーザーにとって使いやすくしたいとおもってて、他がやらないなら 最終的に言語提供側が提供すればいいだけだし。 もちろん、JetBrainsの開発リソースも限られてるが、そんなの使う側からしたら それもどうでもいい。使いやすければユーザーが増える可能性あるし、使いにくければないだろう。 ただそれだけ。 >>235 1行目からして意味が分からん 処理系が何か分かって書いているのか? >>237 ごめんごめんww 「処理系」に関してはそれは完全にとちくるってた >使う側からしてみれば、言語提供側だろうが処理系だろうがどうでもいい は >使う側からしてみれば、言語提供側だろうが言語提供側以外だろうがどうでもいい あたりでw 時代はジェットブレインなんだよ MicrosoftのVisualStudioとかいう原始時代の道具は時代遅れ Kotlinで文字列を返すenumを使うときは、 やっぱりJavaと同じようにnameとかtoStringを呼ばないといけませんか? 例えば↓のようなenumがあったときに enum class Name(name: String) { Foo("foo") } "foo"を使うときはこうすると思います val name = Name.Foo.name() しかし、name()が気に入りません。↓のようにはできませんでしょうか val name = Name.Foo ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる