Kotlin 5

■ このスレッドは過去ログ倉庫に格納されています
2018/12/08(土) 20:29:41.41ID:oXOQORcd
JetBrainsが開発した期待の新言語、Androidの公式開発言語にしてサーバーサイドもなんでもいけるKotlinについて語りましょう

※前スレ
https://mevius.5ch.net/test/read.cgi/tech/1531818027/
554デフォルトの名無しさん
垢版 |
2019/04/23(火) 15:54:20.98ID:3Q52IgbA
>>552
怖いなぁ。そのコード。
俺、さっき、setNameってメソッドを作ったら、clashしてるって怒られた。
clash = conflict って意味らしい。
java.lang.StringのsetNameメソッドとコンフリクトしてるから、コンパイルしないんだって。
2019/04/23(火) 16:06:01.49ID:KnPjeA9Q
そういうことあるのか
でもIntがintじゃないのってintを変数名で使ってもいいよっていう意思を感じるんだよなあ

val hoge : Hoge

ってすることを考えると

val int : Int

も自然な気がする
2019/04/23(火) 16:09:50.49ID:KnPjeA9Q
ああでもjavaは予約語でintだめなのか
やっぱりやめておこう
2019/04/23(火) 16:25:21.03ID:xD8uuYM0
そもそも逆コンパイルしたソースじゃないんだから
意味のある変数名付けなよ
558デフォルトの名無しさん
垢版 |
2019/04/23(火) 16:31:00.98ID:3Q52IgbA
macOS10.14.3
AndroidStudio3.4
環境です。API Referenceを参照するには、どうすれば?
Command-Jで起動するかと思いきや?何も起こらないっす。

Webサイトへ行かないとダメなのかな?
559デフォルトの名無しさん
垢版 |
2019/04/23(火) 17:37:07.37ID:gv0SOq8d
>>553
ちょっと試す時とかによく使うよ
560デフォルトの名無しさん
垢版 |
2019/04/23(火) 17:41:27.91ID:3Q52IgbA
>>559
thx
そっすか。
561デフォルトの名無しさん
垢版 |
2019/04/23(火) 18:02:43.25ID:3Q52IgbA
>>558
see the hit result of Help>Search(Documentation).
You can retrieve the documents by ctrl-J@macOS as well.
2019/04/23(火) 19:19:13.65ID:IWDMUBZh
>>555
とりあえず変な癖をつける前に『リーダブルコード』を読んでくれ、頼むから
2019/04/23(火) 19:47:01.75ID:hcUTeQ5O
リーダブルコード読みやすいしわかりやすいし為になるし
書いたやつ神
564デフォルトの名無しさん
垢版 |
2019/04/23(火) 19:49:26.39ID:3Q52IgbA
>>562
>リーダブルコード
この本そんなに良い本なのか?

ペラペラ見たことあるけど、すでに知ってること、というか、実践していることしか書いてなかった。
2019/04/23(火) 19:52:05.70ID:Ky48Nwl1
>>564
嘘だ
566デフォルトの名無しさん
垢版 |
2019/04/23(火) 20:08:14.43ID:gv0SOq8d
>>564
じゃあその本に書いてないことが書かれた本を出してくれ。Kindle版だけでもいいから。
2019/04/23(火) 20:16:21.90ID:IWDMUBZh
>>565
知っていることを再認識させてくれる良書ではある
2019/04/23(火) 20:18:24.37ID:IWDMUBZh
何でIDが同じになるんだよ
同じプロバイダーなのか
569デフォルトの名無しさん
垢版 |
2019/04/23(火) 20:22:11.04ID:gv0SOq8d
たまーに同じID出ることあるな。ものすごく希だが。
きっと今日は良いことあるよ。あと3時間40分ぐらいで終わるけど。
570デフォルトの名無しさん
垢版 |
2019/04/23(火) 20:22:12.06ID:3Q52IgbA
>>565
嘘じゃない。
ああぁ。俺は間違ってないんだな。という感じ。
まあ、詳細に読んだわけでは無いし、プログラマが知るべき97のこと、って本にも似たような事が書いてある。

Matzも「名前重要」なんて事を、97本に寄稿している。
プログラミング作法、なんかの方がよっぽど良かったな。俺には。
571デフォルトの名無しさん
垢版 |
2019/04/23(火) 20:24:15.75ID:3Q52IgbA
>>569
って事はHash algorithmがpoorってこった。
2019/04/23(火) 20:25:36.05ID:B8eC+d1i
コードコンプリート
573デフォルトの名無しさん
垢版 |
2019/04/23(火) 20:27:52.73ID:3Q52IgbA
>>570
>Matzも「名前重要」

私の設計上の座右の銘は「名前重要」です。あらゆる機能をデザインする時に、私はその名前にもっともこだわります。

courtesy of Matz
2019/04/23(火) 20:29:32.04ID:IWDMUBZh
プログラミング作法
プログラム書法
ソフトウェア作法

全てブライアン・カーニハン御年77歳の名著
575デフォルトの名無しさん
垢版 |
2019/04/23(火) 20:31:32.66ID:gv0SOq8d
>>571
まあそういうことだな。
こんな掲示板でrichにしてどうするって感じはするが。
576デフォルトの名無しさん
垢版 |
2019/04/23(火) 20:32:56.33ID:3Q52IgbA
>>566
じゃぁ、一つ俺の考え方を!

狭いスコープの中を生きる変数は、名前が短くても良い。
e.g. str1 = “OK”

広いスコープの中を生きる変数の名前は、長い名前が必要。
e.g. numberOfBooks = 100

何時いかなる時も、意味ある変数名をつけるのは、俺は反対だ。
変数名を考える事に、時間が惜しい時もある。
2019/04/23(火) 20:33:50.86ID:PyZ6tY2R
拡張プロパティに値セットする方法ある?
578デフォルトの名無しさん
垢版 |
2019/04/23(火) 20:36:26.55ID:gv0SOq8d
やはりプログラミングも茶道とか華道とかと同様にプログラミング道を作ってわびさびが必要な時代が来たのかも知れないな。
2019/04/23(火) 20:36:27.27ID:IWDMUBZh
>>576
そ、ループ変数なんて i, j, k, ....nで良いやん
2019/04/23(火) 20:38:43.46ID:PyZ6tY2R
でもkotlinでforとか使わなくね?
581デフォルトの名無しさん
垢版 |
2019/04/23(火) 20:42:02.64ID:gv0SOq8d
>>576
変数名を日本語にすれば良い。
ソース丸ごと世界に公開する予定がないならその方が分かりやすくて良い。
日本語知らないやつには難読化して軽くプロテクトが掛かった状態にもなる。
582デフォルトの名無しさん
垢版 |
2019/04/23(火) 20:54:10.92ID:3Q52IgbA
>>581
昔、英語が出来なかった時には、
kabuPrice
とか
kabuka
なんて恥ずかしい名前使ってたけど、
今では、
sharePrice
でないと、code reading時にストレス感じるわぁ。
583デフォルトの名無しさん
垢版 |
2019/04/23(火) 20:57:09.18ID:gv0SOq8d
漢字使え漢字
584デフォルトの名無しさん
垢版 |
2019/04/23(火) 21:02:15.89ID:3Q52IgbA
val 感じ = "感じ"
print(感じ)
なんと、warningは出るが、実行可能。
585デフォルトの名無しさん
垢版 |
2019/04/23(火) 21:05:59.98ID:3Q52IgbA
Qiita見ながらKotlin修行中だけど、
Jump Command便利そう。
return@forEach
continue@loop
return@loop
とか言うやつ。

これSwiftに欲しい。
586デフォルトの名無しさん
垢版 |
2019/04/23(火) 21:15:06.63ID:3Q52IgbA
そんなことより、API referenceってかDocumentをofflineで見る手段、どうしてる?
Zeal, Velocity, Dashなんかを使ってるの?
Android StudioでAppCompatActivetyを引くと

android.support.v7.app.AppCompatActivity public AppCompatActivity()

Gradle: com.android.support:appcompat-v7:28.0.0@aar

たったコレだけしか表示されないっす。
2019/04/23(火) 21:32:38.61ID:bGCgvaJg
>>517
俺も謝っておく
触ったすまん
2019/04/23(火) 21:53:05.69ID:strBUBex
>>585
便利な反面1歩間違えると悲惨なコードになりそうだな
2019/04/23(火) 22:46:19.69ID:B8eC+d1i
尻でも触ったのか
2019/04/23(火) 23:21:01.87ID:IWDMUBZh
>>585
Kotlinにあるでしょそれ
https://kotlinlang.org/docs/reference/returns.html
2019/04/23(火) 23:23:43.15ID:IWDMUBZh
ごめん間違えた、SwiftにあるからKotlinに欲しいって読み違えた
Xamarinのライセンス買ってくる
2019/04/24(水) 05:30:04.16ID:BhgQi2cO
悲惨なコードとは?
2019/04/24(水) 05:38:27.15ID:MHxaAVIF
goto文みたいに次にどこに行くのか読みにくいって意味じゃないかな
そんなことはないけどね
2019/04/24(水) 05:51:11.02ID:kB2a7+Os
変数名漢字って結構有りだと思う
平均からすれば英語かなり必死に勉強したほうだと思うけど、ネイティブからすれば変な英語使ってるって自覚あるし
ネイティブ的な感覚がないから、命名には常に苦労する
もちろん特定用途でしか使えない手法だけど、やっぱり母国語ってわかりやすいよね
英語圏のやつらにスーパハカーが多いのはそういう理由もあるよな、母国語でプログラムできるのうらやましいわ
595デフォルトの名無しさん
垢版 |
2019/04/24(水) 07:33:38.62ID:ZqBzQREh
>>594
英語人口20億、英語母語5億
くらいじゃない?

チェコ、ロシア、ルクセンブルグにHacker多い印象が俺にはある。
596デフォルトの名無しさん
垢版 |
2019/04/24(水) 11:18:15.23ID:ZqBzQREh
Constructorの書き方がムズイ。
primery, secondary constructorとか、Swiftには無いし。

Kotlinスタートブック、はしばらく様子見。今の所買わない方向で…
だって、2016年の本って、情報が古そうだし。
597デフォルトの名無しさん
垢版 |
2019/04/24(水) 12:11:30.51ID:f6AiwYyw
そのうち在日ユダヤが「日本人にベーグル盗まれた」なんて狂言やりそう
2019/04/24(水) 12:20:40.85ID:ymPUK1bE
>>594
日本語固有のややこしい漢字の名称を無理やり英語にするよりはそのまま使った方が可読性もはるかにいいわな
何か不都合が起きたらIDEでリネームすりゃいいだけの話だから、全然ありだと思う
俺はテストケース名は日本語がんがん使う
2019/04/24(水) 12:48:24.16ID:CTi91KC0
>>596
Swiftの designated initializer ≒ Kotlinの primary constructor
Swiftの convenience initializer ≒ Kotlinの secondary constructor
2019/04/24(水) 13:08:03.94ID:CTi91KC0
>>599の具体例

Swift
https://ideone.com/48Boj1

Kotlin 比較用
https://ideone.com/ovwjrs

Kotlin 短縮
https://ideone.com/IcR8Wo
2019/04/24(水) 13:28:15.20ID:CQvKnKTI
>>577だけどこれ無理っぽいな
2019/04/24(水) 14:01:42.54ID:CTi91KC0
>>577
勧めるものじゃないけど、一応疑似的にならば
https://ideone.com/7lTdsi

class A {}

private val xname = WeakHashMap<Any,String?>()
var A.name: String?
get() = xname[this]
set(v:String?) { xname[this] = v }
603デフォルトの名無しさん
垢版 |
2019/04/24(水) 14:14:45.53ID:ZqBzQREh
>>599
thx
604デフォルトの名無しさん
垢版 |
2019/04/24(水) 14:19:09.62ID:ZqBzQREh
>>602
Kotlin day3の俺には、なぜAのインスタンスがnameプロパティを持つのか?
良く解らん。
Rubyみたいに、Aを再オープンしてるのか?
605デフォルトの名無しさん
垢版 |
2019/04/24(水) 14:22:08.49ID:ZqBzQREh
>>604
fun mainの外でthisは何を指してるのだ?
606デフォルトの名無しさん
垢版 |
2019/04/24(水) 14:28:29.52ID:ZqBzQREh
>>605
>fun mainの外でthis
ってのはMainKtのインスタンスってことか?
うぅーん。後で確認。

fun main(args: Array<String>) {}

in a file called Main.kt will compile to something like:

public class MainKt {
public static void main(String[] args) {}
}
2019/04/24(水) 14:55:22.29ID:CTi91KC0
>>604
602は拡張プロパティとシングルトンのWeakHashMapを利用している
詳細はgoogleで

拡張プロパティ:
見た目はプロパティだが実際のところ
staticメソッドのシンタックスシュガー

fun A_name_get(thisObj: A): String? {
  return xname.get(thisObj)
}

println( a.name )
 ↓
println( A_name_get(a) )


WeakHashMap:
キーがGC対象となるのを阻害しないMap
aとnameの関連付けはここに入っている
aがへの参照が無くなったら、nameへの関連付けもCG対象になって消える
608デフォルトの名無しさん
垢版 |
2019/04/24(水) 15:34:34.20ID:ZqBzQREh
>>607
>拡張プロパティ

気になる!

Rubyの特異メソッドみたいなもんか?
特異メソッド:クラスに住んでるメソッドとは異なり、オブジェクトに住んでるソレ!
609デフォルトの名無しさん
垢版 |
2019/04/24(水) 15:49:00.84ID:ZqBzQREh
>>608
特異メソッドとは違うみたい。

Rubyのクラスの再オープン、オープンクラス、monkey patching
とか言う邪悪なテクみたい。

Dateクラスに本来備わってないyesterday, tomorrowとかいうpropertyを追加したりできる。
610デフォルトの名無しさん
垢版 |
2019/04/24(水) 15:52:13.17ID:ZqBzQREh
うぅーん。
top level でthisが何を指しているのか?
よく解らん。
2019/04/24(水) 15:52:31.03ID:CTi91KC0
連投せずググりなさい
612デフォルトの名無しさん
垢版 |
2019/04/24(水) 15:56:37.35ID:ZqBzQREh
>>610
きっとthisは、nameプロパティーが呼ばれるまで定まらなくて、nameプロパティーのレシーバー(a1, a2)の事なんだ。

と言う事にしておこう。

拡張関数、拡張プロパティー、が必要になった時のメモ

Kotlinの拡張関数と拡張プロパティについて
https://qiita.com/RyotaMurohoshi/items/4b958af1d23da6d91a61
2019/04/24(水) 17:00:48.57ID:HA70GdMc
>ID:ZqBzQREh
日記は自分のブログでやってくれ
2019/04/24(水) 17:06:36.37ID:ymPUK1bE
散々言われてるみたいだけどまずとりあえずググる習慣をつけなさい
君はしなくていい回り道が多すぎる
2019/04/24(水) 20:05:15.35ID:CQvKnKTI
>>602
なるほど外のmapに入れられたのか、盲点だった
それとweakhashmapなんてあったのか初めて見たわ
616デフォルトの名無しさん
垢版 |
2019/04/24(水) 20:26:09.12ID:ZqBzQREh
>>547
30分で…の記事、2日かけてようやくinfix記法のところまで読めた。
多分費やした時間は6hr以上。

全然30分じゃない。
2019/04/24(水) 20:28:11.81ID:Hf91oH+Q
>>614
君も謝る羽目になるよ
618デフォルトの名無しさん
垢版 |
2019/04/24(水) 20:45:23.71ID:ZqBzQREh
なんと、キーワードになっている識別子もエスケープ可能!

例:isと言う名前のメソッドも呼び出せる。
foo.`is`(bar)

こんな感じ!
619デフォルトの名無しさん
垢版 |
2019/04/24(水) 20:49:33.98ID:ZqBzQREh
Qiitaの30分で…の記事、走り読みした。約8hr位要した。
Vim内でチョコチョコ試運転しながら、走り読み。

お疲れ様でした。▶俺
620デフォルトの名無しさん
垢版 |
2019/04/24(水) 20:52:35.15ID:ZqBzQREh
レシーバー付き関数リテラル、がよく解らんかった。

クラス移譲、プロパティー移譲
byとか使う奴。こんなのSwiftには無かったなぁ。
2019/04/24(水) 21:03:15.80ID:kFXKi6KY
>>596
Kotlinスタートブック -新しいAndroidプログラミング、長澤 太郎、2016

太郎本を買っていない香具師は、モグリ!
2019/04/24(水) 21:13:18.43ID:kFXKi6KY
Kotlin は、swift とは似ていない

Kotlin は、Groovy を静的にしたもの。
つまり、Ruby, JavaScript の系統

オブジェクト指向・関数型のミックス
2019/04/24(水) 22:03:35.37ID:JvprRVGM
Swift程の糞はない
624デフォルトの名無しさん
垢版 |
2019/04/25(木) 06:51:51.77ID:BgXoud3L
>>621
赤ベコ本の事ね。
2019/04/25(木) 09:50:10.40ID:P7ID4Nfd
リーダブルコード要約
https://gist.github.com/AKB428/b8970cea987577ec93c2

初心に戻る良著
最近省略して書いてたから反省してる
2019/04/25(木) 11:34:43.93ID:ap5qFTOn
> 読みやすい
> if (length > 10 )
>
> 読みにくい
> if (10 < length)

その主観は慣れによる、俺にとっては前者の方が読みにくい

うちでは「物差しの向きに一貫性を持たせる」という指針でやっている
その上で統一のため原則として「小さい方を左に書く」
よって >, >= を使わない

if (10 <= length && length < 100)


まぁRangeやRectでメソッドでの判定をすることも多く
そういう場合は左がどうこうというのは無いが
2019/04/25(木) 11:52:49.98ID:8pGnANx9
>>626
>if (10 <= length && length < 100)

if (length >= 10 && length < 100)
たまに、こう書くヤツが居るが殺意を覚える

一般的には可変値が左だと思う
628デフォルトの名無しさん
垢版 |
2019/04/25(木) 12:18:15.49ID:NAVagSqc
俺も可変値が左だと思うけど、統一された指針が既にあるならそれを貫いたほうがいい
一貫性はとても大事
2019/04/25(木) 12:32:09.35ID:wpotMNKo
小さい方を左に書く。
頭の中では、大小は、左右で考えているから

横書きと同じ感覚。
左上がスタート地点

洋画ではそう。左上に赤色を配置する。
そこが目線のスタート地点。
そこから時計回りに目線が、渦の中心へと向かっていく
2019/04/25(木) 12:41:16.64ID:NQvr5Lbg
>>626
普通、言葉で考えると「lengthは10以上100未満?」て聞くじゃん。
「10は〜100は〜?」みたいな聞き方しないよね。
主語と動詞を逆にしちゃいけないと思う。

CやC++の頃は
if (length == 10) としたかったところをコーディングミスで
if (length = 10) にしてバグるのを防ぐ為に逆向きにしてた人を見受けたけど、いまどきはIDEがエラー出してくれるからねえ。
631デフォルトの名無しさん
垢版 |
2019/04/25(木) 12:49:03.99ID:M77Bu+mz
IDEなくてもコンパイル時になんか出る。
2019/04/25(木) 12:54:48.89ID:P7ID4Nfd
>630
なるほど、確かにバグ防止で逆向きにも一理ある
面白いこと考えるね
2019/04/25(木) 13:03:38.24ID:myBoG5tn
>>632
ヨーダ記法って言うやつ
2019/04/25(木) 13:14:11.32ID:wpotMNKo
C言語では、左に代入できないものを書いていた

比較演算子と間違えて、代入演算子を使うと、コンパイルエラー
2019/04/25(木) 13:15:44.93ID:D7t01tqT
ヨーダ記法が可読性低いってのは散々言われてる
結局流行ってないしやらなくていい
2019/04/25(木) 13:44:40.50ID:nzEkPIBs
老害ってことや
2019/04/25(木) 14:11:29.90ID:MiLFxbr9
老害にだけは成りたく無いと思ってました
2019/04/25(木) 14:21:07.30ID:ap5qFTOn
>>630
> 言葉で考えると「lengthは10以上100未満?」て聞くじゃん

なるほど、改めて思い起こすと言葉以上に図や式で考えているな
そういう資料を読み書きすることが多いからかもしれないが

 10 length     100
--|----^----------|--

10 ≦ length < 100

他所のだけどイメージ
https://i.imgur.com/d5iRSb2.jpg
639デフォルトの名無しさん
垢版 |
2019/04/25(木) 21:25:32.13ID:BgXoud3L
kotlin day4

kotlinc, kotlinコマンドの-classpathオプションの使い方でハマった。

>kotlin -cp jsoup-1.11.3.jar JsoupKt
error: could not find or load main class JsoupKt

こちらが正解
kotlin -cp .:jsoup-1.11.3.jar JsoupKt

なんか、変な仕様。そろそろbuild.gradleファイルの作り方を学ぶべきか?
640デフォルトの名無しさん
垢版 |
2019/04/25(木) 21:29:50.40ID:BgXoud3L
あのぉー、Kotlinでスクレイピングしたいんですけど、
Jsoupがbest practice?
https://github.com/jhy/jsoup

実は、Javaも初心者なので、Kotlinへのmigrationでヘトヘト!
2019/04/25(木) 22:45:02.30ID:k8swiVaB
>>640
どんなサイトをスクレイピングしたいのかによるけど、javascriptをガンガン使ってるようなサイトならSeleniumが鉄板だと思うよ。
Jsoupでもjsを実行させられるらいしけど、とても辛いと聞いたことがある。基本的には静的なhtmlを扱うためのライブラリ。
642デフォルトの名無しさん
垢版 |
2019/04/26(金) 09:47:20.98ID:MEdB7GvY
>>641
thx

Kotlin day5
コマンドラインで、jsoupでスクレーピングするソースを作成できた。
昔を思い出して、実行にはMakefile作成して行った。

Makefile内で文字列操作(大文字小文字変換とか、文字列連結)とかできるかな?

Makefileはこんな感じ!
CC := kotlin
CFLAGS1 := -cp jsoup-1.11.3.jar -include-runtime
CFLAGS2 := -cp .:jsoup-1.11.3.jar
SRC := jsoup

all: go
go:
$(CC)c $(SRC).kt $(CFLAGS1)
$(CC) $(CFLAGS2) JsoupKt
~
2019/04/26(金) 09:49:24.06ID:an8vMEsm
>>642
makeが何かをわかっていたらそんな質問はしない
2019/04/26(金) 10:03:32.40ID:3DaeQ571
>>641
Seleniumってテストツールだと思ってたが、そんな使い方があるのか。
目からうろこが1000枚くらい落ちた。
2019/04/26(金) 10:43:09.29ID:v018QqLA
>>644
Selenium自体はテストとは無関係だよ、ただ用途としてテストツールと組み合わされることが多いだけ。
最近のサイトはReactとかで動的にガンガン組み立てられるからスクレイピングもSelenium使っておいた方が無難。
2019/04/26(金) 13:23:49.21ID:A/WNBxWE
Ruby, Nokogiri, Selenium WebDriver を使えば?

CSS Selector, XPath で、要素を指定する

driver.execute_script で、JavaScript のソースコードも実行できる
2019/04/26(金) 14:28:56.17ID:5b9msznW
Kotlin勉強してるって言ってるんだから別にRubyじゃなくていいだろ
2019/04/26(金) 14:34:22.95ID:an8vMEsm
NokogiriでXPathとCSSセレクタ使うならべつにこっちでも同じだと思うよ
649デフォルトの名無しさん
垢版 |
2019/04/26(金) 17:19:57.29ID:MEdB7GvY
JsoupはNokogiriと違ってXPathを使ってDOMの操作ができない。
けど、使い方はNokogiriとよく似てる。

Androidアプリにスクレイピング機能を実装したいので、Ruby使えば?は却下!
650デフォルトの名無しさん
垢版 |
2019/04/26(金) 17:21:05.67ID:MEdB7GvY
ところでJsoupの名前の由来って何?
Java soup = Javaのスープ
変な名前。
2019/04/26(金) 17:57:42.91ID:TC/HkfSU
いちいち聞かずに勉強しろと延々言われているのに守らないからそういうちぐはぐな恥を晒して支持を減らすことになる(君はすでに識別されている)
どうせPythonのBeautifulSoupのことも知らないしタグスープという言葉も知らんのだろう
…あ、後者は別に知らんでいいわ、知らない人が多いし正式な用語というわけでもないから
652デフォルトの名無しさん
垢版 |
2019/04/26(金) 18:12:21.37ID:tgodpZ2Y
ごった煮
2019/04/26(金) 20:00:10.59ID:ErNxnYz2
>>651
まあまあまぁまァ、落ち着けよ
このスレのレベルはピンキリさ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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