kotlinでobjectのlistを引数で他ファイルの関数に渡して、加工したものを戻すコードを作りました。
すると戻ってきたものは当然加工されたものでしたが、引数に渡した変数自体も変わっていました。
var a
var b=application().fun(a)
bにaが加工されて戻ってきたものが入るのはわかるのですが、aも変わってしまいます。これはなぜですか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
具体的な処理内容が書かれてないのでスーパー回答っぽいものをコメントします。
質問者さんは次の(1)のような雰囲気のことをしてしまったのかも知れません。
kotlin
1fun main(args: Array<String>) { 2 run { 3 // (1) Listの要素の破壊的な変更 4 val a = listOf(Label("a"), Label("b")) 5 val b = addX1(a) 6 println("a=$a, b=$b") // ==> a=[Label(ax), Label(bx)], b=[Label(ax), Label(bx)] 7 } 8 run { 9 // (2) Listの要素の非破壊的な加工 10 val a = listOf(Label("a"), Label("b")) 11 val b = addX2(a) 12 println("a=$a, b=$b") // ==> a=[Label(a), Label(b)], b=[Label(ax), Label(bx)] 13 } 14} 15 16class Label(var value: String) { 17 override fun toString(): String = "Label($value)" 18} 19 20// (1) Listの要素の破壊的な変更 21fun addX1(list: List<Label>): List<Label> { 22 for (label in list) { 23 label.value += "x" 24 } 25 return list 26} 27 28// (2) Listの要素の非破壊的な加工 29fun addX2(list: List<Label>): List<Label> { 30 return list.map { Label(it.value + "x") } 31}
引数に渡したオブジェクトを変更せずに、加工した結果を得たい場合は(1)のような「破壊的な変更」ではなく(2)のように「加工した結果を新たに生成する」という考え方に変える必要があります。
閑話休題:
この回答で質問者さんが納得できるかどうかは自分には自信ないです。質問者さんが「どこまでわかっていてどこがわからないか」をもうちょっと詳しく記述したり「具体的なコード」があればもっと要点をついたコメントができたかも知れません。
初心者の方にとって「何がわかっていて何がわかっていないのか」自体が自分自身ではっきりしてないことも多いでしょう。しかしながらあえて指摘すると「どうして元の値が変わってしまったのだろう?」と思ったときに「充分知識がない状態で日本語で質問するようなこと」をせずに
- 簡単な例を書いてみて、どういう結果になるか多少なりとも試してみる
- 試したコード、期待する結果、実際の結果を明記した具体的な質問をする
としていればもっとずっと早く回答が得られたと思います。そういう努力をした方が結局は質問者さんのためにもなります。なんとなくですが質問者さんの学び方にちょっと中途半端さを感じます。もうちょっと
- 教科書や解説やリファレンスなどの書き物をよく読む
- それを自分自身で咀嚼する
- 自分の理解を補強するためにコードを色々書いて試してみる
といった「手と頭を動かす」基礎固めをするとよいのではないでしょうか?
ところで、過去の質問でクローズされていないものが多い印象です。回答がついてないものについては「質問する前にすべきこと」「質問文の書き方」を見直してみたほうがよいのではないでしょうか?また質問コメントや回答がついているものについて「何も反応していない」ものもありますが、よくないと思います。ご自分の過去の質問を見直しコメントすべきはし、閉じるものは閉じるなど整理してみては?
投稿2019/01/25 04:57
総合スコア18394
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/25 12:58
2019/01/25 13:03
2019/01/25 13:32
2019/01/26 04:14
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。