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}
このようなコードでコンパイルが通ってしまうのが嫌です。
変数a
をval
で宣言しているのに値を変更できてしまうからです。
mutableなメソッドを使うのではなく、immutableで自身のクラスのインスタンスを返すメソッドを用いて毎度再代入する事が推奨らしいですが、ボトルネックの原因になりそうで怖いです。
def inc = ...
のところに修飾子?アノテーション?をつけてコンパイラに伝えるのが理想です。
var
で宣言された変数でしか利用できないようなメソッドにしたいです。
また、このようなmutableなメソッドに対して統一した記法や命名規則が欲しいのですが、なんか慣習てきなものはあるのでしょうか?
標準ライブラリでは、Listの末尾に追加するメソッドはimmutableで:+
、mutableで:+=
みたいな感じで語尾に=
をつけて統一しているようですが、識別子で定義したメソッドでの例は見つけられませんでした。
理想としては、メソッドの名前は同じにして、普段はメソッドをつなげる時.
を使いますが、mutableなメソッドに対しては代わりに:
とかを使う感じの記法とか良いと思うのですが。
メタプログラミングでグチャグチャやれば出来ない事も無さそうですかね。
#追記
val
で宣言された変数はimmutable、var
で宣言された変数はmutableだと勘違いしてこの質問をしたのですが、どうやらval
は参照の変更を制限するだけのようです。
前者のような仕様になっている他の言語も利用しているもので、同じ感覚でやりたかったので。
val
の利点は、宣言したところから値が変わらない事が保証される事だと思っているのですが、Scalaのこの仕様だとこの恩恵を受けるためにはimmutableなクラス、つまりmutableなメソッドが一つもないようなクラスのインスタンスをval
で宣言する必要があるため、mutableなクラスとimmutableなクラスの2つ用意する必要があるわけですよね。
Array
とArrayBuffer
があるのはそういった理由だと思っているのですが。
自作のクラスで2つ用意するのはめんどくさいというか、なんかおかしい気がします。
mutableなメソッドだという意味の修飾子だかアノテーションだかがあって、var
で宣言されていないと使えないという機能があればわざわざクラスを2つ用意する必要もないわけです。
あなたの回答
tips
プレビュー