2016-10-19 12 views
1

私は問題に遭遇しました。誰もがどこかでそれに遭遇したはずだが、どこでも解決策を見つけることができなかったように思えます。 REPLからコピーintとintを追加しますか? in Kotlin

var a : Int = 1 
var c : Int? = 3 

a + if (c != null) {c} else {0} 
ERROR: None of the following functions can be called with supplied argument (followed by the various implementations of kotlin.int.plus()) 

それでは、私がやろうとしていることはINTとのIntを一緒に追加しているのですか?結果はIntであることが欲しいです。非常に簡単です。私はもちろん!!オペレータを認識していますが、変更が安全ではないため、可能な限り、これを使用しないでください。

a + if (c != null) {c!!} else {0} 
4 

私は、ヌル・安全性を処理し、!!演算子の使用を避け、次の解決策の認識しています。

a + (c ?: 0) 
4 

私の質問は以下の通りです:!!オペレータの使用を必要としない場合は、他のブロックの使用および/またはブロックとの追加を行う方法があります。 Elvisオペレータではなく、if-elseの使用を好む私の理由は、Elvisオペレータのない言語の人々にとっては明快です。だから私は可能な限りa + if (c != null) {c} else {0}に近づきたいと思っています。

私の問題やモチベーションが不明確な場合、またはKotlinの設計や意図に反する場合は、お知らせください。

†私は、追加された時点でいくつかの変数が安全であると主張することができるかもしれませんが、このアサーションはその周りのコードが変更されてもそこに残るため、安全でない。

答えて

2

問題は、変数が操作間で値を変更する方法がない場合、kotlinはnullチェック後に変数がnullにならないと仮定できるということです。

私はREPLがどのように実装されているか正確には分かりませんが、変数はメンバーとしてコンテキストクラスに挿入されていると思います。つまり、別のスレッドが操作間で値を変更する可能性があるため、コンパイラは変更が発生しないと想定できません。

この機能はREPLでは動作しないようですが、elvis演算子はきれいな代替品です。

+1

うわー、私は実際にこれがREPL固有の問題であるとは思わなかった。ヌルチェックは、関数内で使用されると実際の作業を行います。したがって、 'var d = a + if(c!= null){c} else {0};は関数内で動作します。私は物事をテストし、Kotlinの様々な癖を見つけるためにREPLを使用してきました。私は正しいプログラムでそれを行うべきだと思います。ありがとうございました。 –

+0

^^ REPL固有のバグや問題があるのは、REPLが典型的な制作ワークフローに関与していないからです – voddan

関連する問題