Dart:从字符串创建方法

3
我一直在尝试使用Dart从字符串动态创建方法,但一直没有成功。例如字符串:“(String str)=> return str.length;”。这个想法是允许用户创建自己的函数来应用于给定的字符串。我唯一找到的是NoSuchMethod,但它似乎不适用于我的情况。我尝试在JavaScript中使用new Function,但当将函数传递给Dart并执行时,我会收到以下错误:Uncaught TypeError:J.$index$asx(...).call$0不是一个函数
代码示例:
Dart:
context["UpdateNames"] =

(JsObject pTag)
{
    print(pTag["function"]("text"));
};

JS:

function execute ()
{
    var func = {"function": new Function("str", "return str.length;")};
    UpdateNames(func);
}

编辑:

解决方案:在 JavaScript 中创建如下对象:

this.fun = function (name)
  {
    var text = "var funs = " + document.getElementById("personalFun").value;
    eval(text);
    return funs(name);
  };

然后在Dart中创建对象:

caller = new JsObject(context['Point'], []);

最后调用方法动态创建函数:
caller.callMethod('fun', [text]);
2个回答

7

我不确定您想要达到什么目的,因此我将尝试提供最佳答案。

您希望使用特定字符串标识符动态添加方法到类中

在这种情况下,完全可以实现,但您需要使用一些镜像,因此如果您想将其用于Web,请小心

以下是一个样例实现:

import "dart:mirrors";

class Test {
  Map<String, dynamic> _methods = {};

  void addMethod(String name, var cb) {
    _methods[name] = cb;
  }

  void noSuchMethod(Invocation inv) {
    if (inv.isMethod) {
      Function.apply(_methods[MirrorSystem.getName(inv.memberName)],     inv.positionalArguments);
    }
  }
}

void testFunction() {
  for (int i = 0; i < 5; i++) {
    print('hello ${i + 1}');
  }
}

void testFunctionWithParam(var n) {
  for (int i = 0; i < 5; i++) {
    print('hello ${i + n}');
  }
}

void main() {
  var t = new Test();

  t.addMethod("printHello", testFunction);
  t.addMethod("printHelloPlusN", testFunctionWithParam);
  t.printHello();
  t.printHelloPlusN(42);
}

您想在字符串中“执行”代码

很抱歉,这是不可能的。虽然这是一个很大的需求,但Dart团队并没有计划实现它,因为这将涉及太多的变化和权衡。

也许可以通过创建Dart文件并使用隔离器来运行它来达到欺骗的效果。


谢谢你的回答。我想做的正是第二点。我通过调用JavaScript方法使其工作,这让我感到难过,因为我希望能够在Dart中完成它。 - Satrofu

1
解决方案:在JavaScript中创建一个如下的对象:
var FunctionObject = function() {
  this.fun = function (name)
  {
    var text = "var funs = " + document.getElementById("personalFun").value;
    eval(text);
    return funs(name);
  };
};

然后在Dart中创建对象:

caller = new JsObject(context['FunctionObject'], []);

最后调用该方法以动态创建函数:
caller.callMethod('fun', [text]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接