Kotlin 2

■ このスレッドは過去ログ倉庫に格納されています
2017/11/01(水) 00:07:43.82ID:jxmKQQAl
JetBrainsが開発した期待の新言語Kotlinについて語りましょう
https://kotlinlang.org

前スレ
Kotlin
http://mevius.5ch.net/test/read.cgi/tech/1456505161/
2018/02/16(金) 23:21:19.28ID:JKZCusui
>>593
中身が空っぽなだけで、プライマリコンストラクタは常にあるよ
https://ideone.com/tSGMPY
2018/02/16(金) 23:59:52.15ID:JKZCusui
基本は省略表記なだけ
https://ideone.com/3Uc2dJ
2018/02/17(土) 00:19:37.32ID:1ji1uAN3
>>594
でも、空のプライマリコンストラクタを明示的に宣言するのと省略するのでは厳密には同一ではないですよね??

だから、言葉の定義の問題にもなっちゃうけど、initブロックはinitブロックであってプライマリコンストラクタと同一視
しない方がいいとか。プライマリコンストラクタはあくまでclass Test(val p1: String)のval p1: String部分だけで、
プライマリコンストラクタはボディは持てない。
初期化はinitブロックで行うとか?
2018/02/17(土) 00:24:21.47ID:1ji1uAN3
https://kotlinlang.org/docs/reference/classes.html
正式な言語仕様書とかないんでしったけ??
JavaとかC#はしっかりした言語仕様書みたいのあって言葉もしっかり定義されてると
思いますが、kotlinはそういうのないとか・・
2018/02/17(土) 00:37:46.91ID:1ji1uAN3
Note that code in initializer blocks effectively becomes part of the primary constructor.
Delegation to the primary constructor happens as the first statement of a secondary constructor, so the code in all initializer blocks is executed before the secondary constructor body
まぁ、ここにはプライマリコンストラクタの一部になるって書いてあるね。
2018/02/17(土) 00:43:30.54ID:vJDAw5Ja
>>596
そうね暗黙の場合と違いあるから省略という表現は不正確だったごめん

セカンダリコンストラクタが無い場合、暗黙のプライマリコンストラクタはpublicになる
セカンダリコンストラクタが有る場合、暗黙のプライマリコンストラクタは未初期化メンバを残せる
2018/02/17(土) 01:07:01.46ID:vJDAw5Ja
>>597
明らかにまだ未完成だけどこれだと思う
http://jetbrains.github.io/kotlin-spec/
2018/02/17(土) 09:11:07.08ID:cSouIKOJ
Kotlin使いがJava使いにマウント取ってる様を見てまたこの繰り返しかと思いそっ閉じ
602デフォルトの名無しさん
垢版 |
2018/02/17(土) 11:37:12.55ID:EWYfJ6l0
マウント取ってるように見える?そりゃなんていうか、劣等感強すぎでは?
てか一々そんなこと考えてないで自分でも使えばいいじゃん。禁止されているわけでもなし。
Java が使える状態になったことのある人が Kotlin 使えるようになれないわけがないと思うが。
2018/02/17(土) 19:20:37.06ID:MOg6+5DY
ていうかkotlin使いって99%Java使いも兼ねてるだろうからマウントとるも何もないのでは
2018/02/17(土) 22:06:51.34ID:QsKtGr9g
今使ってる人はそもそもJavaできるからな
より使いやすくても、対立構造にはならないよな
605デフォルトの名無しさん
垢版 |
2018/02/18(日) 01:22:27.54ID:5P/pcqvC
>>557
モバイル開発は違うかもだが、業務系は極端に言っちまうとjava要員集めるっつたら使い捨て兵隊集めだよ。
2018/02/18(日) 11:33:46.48ID:LPhOEvze
そんな自分の知ってる世界だけの狭い話をされても
2018/02/18(日) 13:07:28.97ID:hkjnjusX
Kotlin, RxJava, MVVMは基本的な必須スキルだからな
未だに実務経験ないやつは失業確定ざまああwwwwwww
2018/02/18(日) 13:07:47.53ID:1pIRFdOf
>>605
兵隊だなんてでたらめ書くなよ
兵隊じゃなくて奴隷だぞ
2018/02/18(日) 13:24:23.64ID:R7wrwf8X
Android系の技術スレは失業だの兵隊だの低いところでマウント争ってるんだな。稼いでるやついなそう。
2018/02/18(日) 13:56:19.84ID:D295fkqM
そういやKotlinはまだ求人数は少ないけど給与は良いって調査結果があったな
中途半端だと仕事にありつけないかもしれないな
611デフォルトの名無しさん
垢版 |
2018/02/18(日) 14:56:03.30ID:oDDrqbus
しかしKotlinってKotlinらしくない従来のJavaっぽい書き方をしても動いてしまうからな。金を多く払う意味があまりないかも知れないぞ。
2018/02/18(日) 16:12:24.98ID:nyTLTr1m
Kotlinで単価が高いのは、チームが今後Kotlinでやってけるように導入の面倒見れる人だよ
>>611が言ってるレベルの奴なんてそもそも高い単価で雇われないから
2018/02/18(日) 16:20:57.25ID:JlUJeRgg
面倒みなきゃならんほどのものじゃないでしょ
プログラム初心者じゃあるまいし
2018/02/18(日) 16:37:41.33ID:nyTLTr1m
>>613
お前の周辺状況について述べてるわけじゃないことぐらい理解して
2018/02/18(日) 16:51:37.36ID:oDDrqbus
>>612
雇う側がそれを見抜ければ良いんだろうけどね。
2018/02/18(日) 17:24:17.84ID:JlUJeRgg
>>614
確認だけど職業としてプログラマやってる人たちの話って前提だよね?
小学校のプログラムの授業とかじゃなくて
2018/02/18(日) 19:36:30.68ID:nyTLTr1m
>>616
もういいよめんどくさい
じゃあKotlinできればそのレベルに関わらず誰でも単価高いってことでええわ
2018/02/18(日) 22:46:31.63ID:mRumiIcD
ラムダ式から式の外側のthisを参照するにはどうすればいいでしょうか?現状、
val this_ = this
async {
 this_
}
とかしてますけど、これ以外方法ない?
2018/02/19(月) 00:54:19.29ID:bFR3uyhH
>>618
無いことはないけど俺もそうしてるよ
class A {
  fun f(){
    async {
      this@A
    }
  }
}
https://kotlinlang.org/docs/reference/this-expressions.html
2018/02/19(月) 07:19:51.84ID:YvDQTksi
>>618
結局それが1番手っ取り早いと思うけど、this_っていう変数名は気持ち悪いから嫌
2018/02/19(月) 11:29:23.81ID:IoDkpp2Z
言っとくけどselfもダサいよ
2018/02/19(月) 11:44:10.96ID:yCg2MRRi
そうじゃねえだろ
それを言うなら、self_ もダサい
2018/02/19(月) 12:18:18.12ID:uDWMisC4
やっぱ thiz だよね
624デフォルトの名無しさん
垢版 |
2018/02/19(月) 12:46:45.80ID:8HhXX1j3
どう書いても最適化されて同じコードになったりして・・・
2018/02/19(月) 16:13:32.25ID:qb2IEpmC
俺なら一目で何だか分かる名前にする
2018/02/19(月) 17:29:10.39ID:yTArt2lJ
例えば?
2018/02/19(月) 17:33:59.71ID:tDxwJ5H8
>>619
ありがとうござます。this@hogeを使う事にしました
2018/02/19(月) 17:36:07.64ID:UjHZ69on
>>626
val unko = this
2018/02/19(月) 17:37:58.45ID:jylwc8fn
ore,kore,sore
2018/02/19(月) 17:39:35.65ID:UjHZ69on
val 式の外側のthis = this

async {
式の外側のthis.method()
}

これが1番わかりやすいな
2018/02/19(月) 18:45:31.43ID:J+iGZU0/
class名.instanceはコトリンではつかえないのん?
2018/02/19(月) 22:24:58.24ID:9U/kf45x
>>631
objectで宣言したクラス(シングルトン)のclass名.INSTANCEのことでしょうか?
2018/02/19(月) 23:31:48.80ID:4xWfaW8A
エンクロージングインスタンスの話。
クラス名.thisの間違いだった。
2018/02/19(月) 23:50:04.20ID:bFR3uyhH
ラムダに束縛したいのはthisだけとは限らないしネストも有り得るので
クラス外の関数として分離した場合の引数名のイメージで変数名付けてる

val view = this
val cal = activeCalculator
async {
  cal.recalc()
  transaction {
    val tran = this
    check(cal, tran)
  }
  view.notifyUpdate()
}
2018/02/20(火) 06:41:06.84ID:qL04aTa6
>>634
真面目にいえば俺もこれ。
this_とかは仮に何かしらでもう一段ネストした時に詰む。
2018/02/20(火) 09:07:54.40ID:qXeXVbGF
ネストする時は、
this__
this___
this____
this_____

と、_を増やしてけば
2018/02/20(火) 10:02:20.87ID:I+nWo9FQ
よみづらい
638デフォルトの名無しさん
垢版 |
2018/02/20(火) 10:02:36.87ID:pltRTpB+
>>636
フォントが違うと見え方が変わりそう
2018/02/20(火) 12:03:00.62ID:5NVGlXhy
>>636
天才かよ
640デフォルトの名無しさん
垢版 |
2018/02/20(火) 12:57:02.91ID:DWBDu+Jk
ま、しかし、あまりにもネストが深くなるようならロジック考え直した方が良いかも
641デフォルトの名無しさん
垢版 |
2018/02/20(火) 20:10:18.67ID:xSX01qXm
メソッド参照とか別クラスとか。
642デフォルトの名無しさん
垢版 |
2018/02/20(火) 20:29:10.81ID:qXSQ9QV9
ネストは三段ぐらいまでにしといた方がいいだろうな。
その辺が迷宮の入り口だ。

Cのポインタとかも同じ。3段以上先には魔物が住んでいる。
2018/02/20(火) 20:35:32.22ID:qL04aTa6
せめて他のメソッドに切り出すくらいは最低でもやるべきだわな
2018/02/20(火) 22:17:03.69ID:/iBGk+pN
androidでデータバインディングしようとして
class Foo {
 @Bindable
 val bar get() = hoge.bar
}
とかできないの??・・・
2018/02/20(火) 22:18:25.44ID:/iBGk+pN
エラー内容はThis annotation is not applicable to target 'member property without
backingField or delegate'です。
どうしたらいいでしょかね
2018/02/20(火) 22:30:04.18ID:/iBGk+pN
Javaでは
class Foo {
 @Bindable
 String getBar() { hoge.getBar() }
}
で、hogeはFooのフィールド変数です。
2018/02/20(火) 23:05:50.58ID:/iBGk+pN
ごめんさい。解決しました。@get:Bindable
2018/02/21(水) 00:01:54.65ID:CION/kfn
また、アノテーションだけど。遅延初期化ではアノテーションつけれんの?しょぼーん。
@field:Transient
val lazyVal by lazy {}
だめか・・
649デフォルトの名無しさん
垢版 |
2018/02/21(水) 14:48:51.57ID:aopUu534
いま触れてないけどkotlin-Nativeってどんな感じ?
ほとんどなんでもコンパイルかけれる?
見たところLLVM通すから行けそうだけど
2018/02/21(水) 15:35:13.89ID:HWbyxxJS
実用で使うのはまだ怖いけど、遊びで触る分にはちゃんと動くよ。
javaの標準パッケージが全く使えないから、jvmで動かす前提で作ってあるクラスだのライブラリだのが動かないという辛さはある。
2018/02/21(水) 16:03:44.92ID:wwQ+gY6z
javaのパッケージ使えないんならわざわざJVM言語使う価値なんかないわwさよなら〜
2018/02/21(水) 16:13:56.98ID:4d1xezjM
うん。はっきり言って現状ではこれを使うメリットが何一つ思い浮かばないよ俺も。
2018/02/21(水) 17:59:59.69ID:ftdNQJg9
地味にアップデートされてるからJBが飽きなければそのうち実用レベルになるかもねえ
654デフォルトの名無しさん
垢版 |
2018/02/21(水) 18:05:11.04ID:2C7myRiq
それなりの標準ライブラリはあるんでしょ?まだないの?(ないわけないか。なければ Hello world も出せないもんな)
655デフォルトの名無しさん
垢版 |
2018/02/21(水) 18:28:14.61ID:aopUu534
ありがとう。
なるほどまだ様子見しとくわ
Javaの標準パッケージ動かないの辛いね
2018/02/21(水) 18:37:05.98ID:KLOfXDKN
>>652
はいキチガイ
2018/02/21(水) 18:56:30.68ID:sG9Uh+s7
>>656がメリットを説明してくれる模様w
2018/02/21(水) 19:15:48.38ID:CION/kfn
この言語意味不明になってきた。
class Test {
 var str: String
  get() = field
  set(value) { }
 constructor() {
  str = "あいう"
 }
}
val t = Test()
普通にstrがnullになる
2018/02/21(水) 19:17:58.58ID:CION/kfn
セカンダリコンストラクタでstrのbakcingFieldにアクセスできないの??
 constructor() {
  str = "あいう" // これはsetter経由のプロパティアクセス
 }
2018/02/21(水) 19:21:36.71ID:ftdNQJg9
>>656
現状でこれ使ってハッピーなことがあるなら教えてくれw
2018/02/21(水) 19:23:37.72ID:ftdNQJg9
>>658-659
そのコードの意図がよく分からないんだけど、何がしたいの?ゆ
2018/02/21(水) 19:30:46.29ID:CION/kfn
>>661
意図はないけど、null安全とかいっておきながらkotlin側だけでnull入るコード書けるのまずいような気がする。
いや、プロパティの初期化方法がうざくて色々調べてたら気づいただけ。
2018/02/21(水) 19:35:19.91ID:CION/kfn
プロパティ宣言すると初期値与えろってうるさいんだけど、うるさいのはいいんだけど初期値の与え方が
val str: String = プロパティイニシャライザ
プロパティイニシャライザ以外、bakcingFieldに直接与える方法ないの??
>>659だって、初期値与えろってコンパイルエラーでるから、セカンダリコンストラクタに
str = "あいう" // これはsetter経由のプロパティアクセス
書いたんだけど、setter経由のプロパティアクセスだとsetterが>>658のようになってるって初期値実際与えられてないし・・
2018/02/21(水) 19:38:04.92ID:CION/kfn
>書いたんだけど、setter経由のプロパティアクセスだとsetterが>>658のようになってるって初期値実際与えられてないし・・

>書いたんだけど、setter経由のプロパティアクセスだとsetterが>>658のようになってるいじわるコードだと初期値実際与えられてないし・・
に修正
2018/02/21(水) 19:44:04.71ID:ftdNQJg9
そういうことね
確かにこれならsetterの部分でコンパイルエラー出て欲しい気がするな
帰ったらドキュメント舐め回してみるか
2018/02/21(水) 22:17:43.95ID:mU+xwBkv
>>658
lateinintつけないでコンパイル通ってしまうなら、Kotlinコンパイラのバグの可能性も...
2018/02/21(水) 22:24:25.01ID:mU+xwBkv
>>666は勘違いでした。申し訳ない。
>>658
多分あまりにも悪意に満ちた常人なら間違え内容のない契約プログラミング違反だから、
そこまでは面倒を見られないということかも。
2018/02/21(水) 22:33:20.79ID:A2iqRMA5
悪意の無い初心者がめちゃくちゃ書いてもちゃんと面倒見てくれるべきだと思う
2018/02/21(水) 23:05:16.86ID:CION/kfn
null安全の導入とともに変数は宣言時に初期値を与えなきゃいけなくなって、
ローカル変数は宣言時に与えなきゃいけないけど、インスタンス変数は宣言時または
コンストラクタ内で与えればOKなんだけど、
backingFieldを持つプロパティと相性悪かった?ってことかな。

backingFieldを持つプロパティはプロパティイニシャライザを与えるか、
コンストラクタ内でbackingFieldに直接初期化するという条件を付けくわえないとだめ?

field:str = "あいう" // コンストラクタ内でのみ使えるbakckingFieldにアクセスする専用構文の導入が必要 か
str = "あいう” // コンストラクタ内でのプロパティへの代入はsetterは経由しないとかの条件が必要
2018/02/22(木) 00:40:47.03ID:P3OwyHQx
バグ相当だと思う

初期化(setter呼び出し)の有無は判定出来ているのだから
コンパイルエラーにするのが難しいなら
その直後にそのプロパティのBacking Fieldがnullだったら
KotlinNullPointerExceptionを投げる処理を暗黙的に追加すべき
2018/02/22(木) 00:42:25.58ID:P3OwyHQx
コンパイラor言語仕様のバグって意味ね
2018/02/22(木) 01:34:10.26ID:2g+h2XZc
null安全の導入->非nullableのクラス型のデフォルト値なんてないから、変数は必ず初期化する
必要がある->(この再、nullable、非nullable関係なく全変数初期化するように)

未初期化の変数がコンパイラエラーにならないんて、これが言語仕様なら
仕様がクソだったってことだな(さすが、適当に作った言語ってことに)。
コンパイラのバグであることを祈ろう。
673666
垢版 |
2018/02/22(木) 06:49:37.65ID:W5l1Fr+S
>>658は、Test()でconstructor()が呼ばれないことについて
エラーも警告も出ないことも問題かもしれない。
>>672
Javaで1回しか代入できないフィールドを作るのにsetterに渡された値を捨ててしまうことは
手法としては考えれられなくはないから、バグではなく仕様かも。
逆にチェックを厳しくし過ぎると出来そうなことができなくなる罠も出てくるから
完璧は無理かと。
Kotlin自体「実用的な」範囲でバランスをとったというコンセプトだし。
674666
垢版 |
2018/02/22(木) 06:57:22.88ID:W5l1Fr+S
>>673
の一つ目は勘違いでした。
Kotlinは便利だけど、いくつかの規則は言語仕様でなく契約に基づいていて
契約違反のコードは勘違いを起こさざるを得ないと言い訳する...orz
2018/02/22(木) 07:31:42.26ID:tIZ7FSiP
C#でいいじゃん
2018/02/22(木) 07:39:36.87ID:HpXxCMc4
>>674
いや、この件は普通にコンパイラの仕様バグだと思うからissue上げて来なよ
2018/02/22(木) 07:44:53.50ID:HpXxCMc4
一回しか代入したくないならセッターの中にそういう処理を書けばいいだけだし、
非NullableなのにNullが入る状態でコンパイルできるのはどう考えてもバグでしょ
2018/02/22(木) 07:45:17.47ID:P3OwyHQx
>>673
そういう手法のときは内部フィールド側はNullableになっているべきじゃないかな
通常ケースの一つとしてnullがあるパターンなわけだから

private var strF: String? = null
var str: String get(){return strF ?: ""} set(value) { }
2018/02/22(木) 09:29:54.25ID:tZO46ghF
setterを空にしたらバッキングフィールドへの代入は永遠にされないのでは?
外部からバッキングフィールドへの代入ってできないよね?
(getterで値を変更するカウンターみたいなやつは別として)。
2018/02/22(木) 21:30:53.59ID:MQzOZIuj
Nullableでないプロパティのsetterがnullの状態で呼ばれることがあるって考えるとなんか気持ち悪いな
俺の感覚だとsetterが呼ばれた時点でフィールドは初期化されていて欲しいしフィールドの初期化にsetterは使って欲しくない
2018/02/22(木) 22:55:00.07ID:4ek3nBtk
JRubyよりはええんか?
2018/02/23(金) 00:50:16.39ID:U4AoY/IO
>>658の var str : String の部分を var str = "aaa" みたいに書くと var なのに str に何を代入しても
中身が"abc"のまま変化しないプロパティが完成w
2018/02/23(金) 00:50:44.77ID:U4AoY/IO
間違えた。"abc"じゃない"aaa"な。
2018/02/23(金) 07:49:04.02ID:bsuGQjVb
>>682
ワロタ
嫌な会社を辞めるときにテロとしてそういうコード残しておくイタズラとかできそう
それはそうとnullableじゃないのにnullになりうるセッターがコンパイル通るのはやっぱおかしいよな
そんなんする奴がいるのかって話ではあるが
2018/02/23(金) 08:31:33.24ID:nqFe2RWJ
githubにあるkotlinのプロジェクトはissuesのリンクがないや
どこに報告すればいいんだ
2018/02/23(金) 08:54:38.23ID:MOvRrowf
>>685
なぜREADMEを読まない…
687デフォルトの名無しさん
垢版 |
2018/02/23(金) 14:54:59.97ID:0k9d4/AB
まとめ
https://paiza.io/projects/E8Wb5DZH7qOC-b5hcPSk3Q
2018/02/23(金) 18:54:32.34ID:fUBBLv0N
こりゃダメだ
C#使おっと
2018/02/23(金) 19:22:20.80ID:tkkK8G2q
>>687
えぇ…これ仕様通りなん?だとしたら糞じゃね?
690デフォルトの名無しさん
垢版 |
2018/02/23(金) 20:44:31.66ID:Py5a3myD
>>688
C#はこういうこと起きないの?
てか、そもそも同じような形式のプログラム作れるの?
2018/02/23(金) 21:13:42.52ID:8lqriKW0
C#はそもそもnull安全じゃないから出てくること自体おかしい
2018/02/23(金) 21:26:34.63ID:i7MOfoRF
8.0ではoptinでnull安全にできるようになるんじゃなかったけ。まあ、でもmicrosoftはこんなポカしないと思うけど。
2018/02/23(金) 22:05:57.26ID:R3lraTlN
オプティン…
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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