Метод с угловыми скобками (<>)
Возможно ли иметь угловые скобки в именах методов, например.
class Foo(ind1:Int,ind2:Int){...}
var v = new Foo(1,2)
v(1) = 3 //updates ind1
v<1> = 4 //updates ind2
Реальная ситуация, очевидно, сложнее, чем эта!! Я пытаюсь обеспечить удобный пользовательский интерфейс.
Ответы
Ответ 1
Этот ответ не означает слишком серьезного и является просто доказательством того, что это может быть достигнуто с помощью некоторых хаков.
class Vector(values: Int*) {
val data = values.toArray
def < (i:Int) = new {
def `>_=`(x: Int) {
data(i) = x
}
def > {
println("value at "+ i +" is "+ data(i))
}
}
override def toString = data.mkString("<", ", ", ">")
}
val v = new Vector(1, 2, 3)
println(v) // prints <1, 2, 3>
v<1> = 10
println(v) // prints <1, 10, 3>
v<1> // prints: value at 1 is 10
Используя этот класс, мы можем иметь вектор, который использует <>
вместо ()
для "чтения" и доступа к записи.
Компилятор (2.9.0.1) сработает, если >
возвращает значение. Это может быть ошибка или результат неправильного использования >
.
Ответ 2
Изменить: Я ошибся; Ответ kassens показывает, как это сделать, как вы хотите.
Невозможно реализовать метод, который вызывается при написании v<1> = 4
(кроме, может быть, если вы пишете плагин компилятора?). Однако возможно что-то подобное:
class Foo {
def at(i: Int) = new Assigner(i)
class Assigner(i: Int) {
def :=(v: Int) = println("assigning " + v + " at index " + i)
}
}
Тогда:
val f = new Foo
f at 4 := 6
Ответ 3
С небольшим обманом вы действительно можете приблизиться к тому, что хотите.
object Foo {
val a:Array[Int] = new Array(100)
def <(i:Int) = new Updater(a, i)
}
class Updater(a:Array[Int], i:Int) {
def update(x:Int) {
a(i) = x
}
def >() = this
}
Foo<1>() = 123
Я не уверен, почему Scala требует ()
. И да, это немного взломать...