В Dart какое сгенерированное имя для метода установки?

Если у меня есть класс с определенным установщиком, как я могу ссылаться на сгенерированный метод как на функцию из экземпляра этого класса. Спецификация предполагает, что это будет идентификатор переменной + '=" (кажется глупым), но это не анализируется.

Так, например:

class Bar {

  set foo(int value) {
  //whatever
  }
}

typedef F(int value);

void main() {
  F f = new Bar().foo=; //Fails, but what should this be??
  f(5);
}

person Richard    schedule 21.09.2012    source источник


Ответы (1)


Сеттер называется foo=, но это не то, на что вы можете ссылаться так, как хотите. Даже глядя на dart:mirrors, MethodMirror (зеркало для методов объекта, включая сеттеры) не может его вызвать. Вы можете легко переписать это как:

class Bar {

  set foo(int value) {
  //whatever
  }
}

typedef F(int value);

void main() {
  Bar b = new Bar();
  F f = (int value) => b.foo = value;
  f(5);
}
person Cutch    schedule 22.09.2012
comment
Вы можете вызвать сеттер с зеркалами с помощью MethodMirror.invoke(). Я думаю, что вам нужно использовать префикс set: все еще, чтобы получить зеркало. - person Justin Fagnani; 22.09.2012
comment
Привет, Джастин, просматриваю: code.google.com/p/dart/source/browse/branches/bleeding_edge/ Я не вижу метода вызова в MethodMirror. В ObjectMirror есть один, но он имеет совсем другую сигнатуру, чем F(значение int), и поэтому не может быть назначен F. - person Cutch; 22.09.2012
comment
Упс, ты прав. Он есть в ObjectMirror, и похоже, что теперь есть setField(). У него не будет сигнатуры f(int v), потому что он должен обрабатывать любой вызов метода, поэтому он работает больше как noSuchMethod(). Кроме того, вы не можете закрывать методы через систему зеркал. Хотя это было бы здорово. Возможно, если InstanceMirror.hasReflectee имеет значение true, это позволит вам захватывать участников. - person Justin Fagnani; 22.09.2012
comment
Хм! Разочаровывает тот факт, что геттеры и сеттеры — это не просто синтаксический сахар для методов, которые можно использовать таким образом. Но я думаю, я вижу проблему - эти методы должны быть сгенерированы и для переменных экземпляра, так как вызывающая сторона не должна знать, был ли доступ к переменной поддержан сеттерами/геттерами. В любом случае, спасибо за помощь. - person Richard; 23.09.2012