Để có được tương đương với một C++ biến tĩnh địa phương trong Scala:
import scala.collection.parallel.mutable
import scala.reflect._
import scala.reflect.runtime.universe._
object StaticLocal {
private val classes = new mutable.ParHashSet[String]
private val variables = new mutable.ParHashMap[String, AnyVal]
}
import Numeric._
class StaticLocal[T <: AnyVal](value:T)(implicit tag: TypeTag[T], num: Numeric[T]){
val name = this.getClass + "." + tag.toString() ;
private var inited = false
if (!inited) {
inited = true
if (!StaticLocal.classes.contains(name)) {
StaticLocal.classes += name
StaticLocal.variables += name -> value.asInstanceOf[AnyVal]
}
}
def get():T = {StaticLocal.variables.get(name) match { case x:Some[Int] => (x.get).asInstanceOf[T] ; case None => throw new Exception("Not found:" + name) }}
def set(value:AnyVal) { StaticLocal.variables.put(name, value)}
def +(v:StaticLocal[T]):T = { num.plus(this.get, v.get) }
def +(v:T):T = { num.plus(this.get, v) }
def +=(v:T):Unit = { set(num.plus(this.get, v)) }
def +=(v:StaticLocal[T]):Unit = { set(num.plus(this.get, v.get)) }
override def toString() = { get.toString}
implicit def StaticLocalWrapper(s: StaticLocal[T]):T = s.get
}
Sau đó, trong phương pháp:
def foo():Unit
{
object x extends StaticLocal(5)
x += 1
println(x)
}
Điều này sẽ hoạt động giống như trong C++, bao gồm khi phương thức hoặc việc sở hữu cá thể lớp vượt quá phạm vi (mặc dù vậy là w ith một hình phạt hiệu suất). Không an toàn chỉ vì nó đứng.
Nguồn
2015-11-20 08:57:49
Bạn có thể mô tả lý do tại sao bạn tạo 'x' tĩnh? Nó có thể được truy cập từ bên ngoài 'foo' không? Là 'foo' có thể đệ quy? Tôi không phải rất quen thuộc với C++ và biết ý định của bạn sẽ làm cho nó dễ dàng hơn để đưa ra một đoạn mã Scala tương ứng. –
Lập trình chức năng thuần túy tránh loại biến có thể thay đổi này khiến nó dẫn đến một hàm không phải là "trong suốt". – Mik378
C++ side: điều này được gọi là static cục bộ, biến là * global * trong đó chỉ có một cá thể tồn tại trong suốt chương trình, tuy nhiên khả năng hiển thị (phạm vi từ vựng) bị hạn chế đối với phần thân của hàm. Thành ngữ này có thể được sử dụng để triển khai thực đơn, ví dụ. –