質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

Q&A

0回答

649閲覧

Scala mutableなメソッド

mightyMask

総合スコア143

Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

0グッド

1クリップ

投稿2020/03/31 13:34

編集2020/04/02 20:20

Scalaを学び始めて3日ほどです。

scala

1object Main extends App { 2 val a = new A(0) 3 a.inc 4} 5 6class A(var value :Int) { 7 def inc = this.value = this.value + 1 8}

このようなコードでコンパイルが通ってしまうのが嫌です。
変数avalで宣言しているのに値を変更できてしまうからです。

mutableなメソッドを使うのではなく、immutableで自身のクラスのインスタンスを返すメソッドを用いて毎度再代入する事が推奨らしいですが、ボトルネックの原因になりそうで怖いです。

def inc = ... のところに修飾子?アノテーション?をつけてコンパイラに伝えるのが理想です。
varで宣言された変数でしか利用できないようなメソッドにしたいです。

また、このようなmutableなメソッドに対して統一した記法や命名規則が欲しいのですが、なんか慣習てきなものはあるのでしょうか?

標準ライブラリでは、Listの末尾に追加するメソッドはimmutableで:+、mutableで:+=みたいな感じで語尾に=をつけて統一しているようですが、識別子で定義したメソッドでの例は見つけられませんでした。

理想としては、メソッドの名前は同じにして、普段はメソッドをつなげる時.を使いますが、mutableなメソッドに対しては代わりに:とかを使う感じの記法とか良いと思うのですが。
メタプログラミングでグチャグチャやれば出来ない事も無さそうですかね。

#追記
valで宣言された変数はimmutable、varで宣言された変数はmutableだと勘違いしてこの質問をしたのですが、どうやらvalは参照の変更を制限するだけのようです。
前者のような仕様になっている他の言語も利用しているもので、同じ感覚でやりたかったので。

valの利点は、宣言したところから値が変わらない事が保証される事だと思っているのですが、Scalaのこの仕様だとこの恩恵を受けるためにはimmutableなクラス、つまりmutableなメソッドが一つもないようなクラスのインスタンスをvalで宣言する必要があるため、mutableなクラスとimmutableなクラスの2つ用意する必要があるわけですよね。
ArrayArrayBufferがあるのはそういった理由だと思っているのですが。

自作のクラスで2つ用意するのはめんどくさいというか、なんかおかしい気がします。
mutableなメソッドだという意味の修飾子だかアノテーションだかがあって、varで宣言されていないと使えないという機能があればわざわざクラスを2つ用意する必要もないわけです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2020/04/01 23:11

何にどのような嫌さを感じているのか一切伝わってないから回答がつかないのかと思いますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問