0

我试图通过使用由可变数量的用户输入字段组成的字符串来调用 Coffee 脚本中类实例的方法。假设我们有一个“表面”实例,我们应该在其上调用一个绘制特定图形的方法。这是 CoffeeScript 中的代码:

  dojo.ready ->    
    dojoConfig = gfxRenderer: "svg,silverlight,vml"
    surface = dojox.gfx.createSurface("dojocan", 500, 400)
    /  The user's input values are stored in an array
    /  and then concatenated to create a string of this pattern:
    /  formula = "createRect({pointX,pointY,height,width})"
    /  Now I should apply the string "formula" as a method call to "surface" instance

    surface."#{formula}".setStroke("red") 

    / ?? as it would be in Ruby , but .... it fails

我见过所有类似的问题,但我找不到在 Coffee Script 中实现它的答案。

感谢您的时间 。

4

3 回答 3

2

所以你有一个这样的字符串:

"createRect(pointX,pointY,height,width)"

并且您想将其createRect称为 on 的方法surface,对吗?通过将所有内容集中到一根弦上,您正在使您的生活变得更加艰难和丑陋;相反,您应该创建两个单独的变量:一个保存方法名称的字符串和一个保存参数的数组:

method = 'createRect'
args   = [ 0, 11, 23, 42 ] # the values for pointX, pointY, height, width

然后你可以使用Function.apply

surface[method].apply(surface, args)

如果您需要将方法名称和参数存储在数据库中的某个位置(或通过网络传输它们),则使用它JSON.stringify来生成结构化字符串:

serialized = JSON.stringify(
    method: 'createRect'
    args:   [0, 11, 23, 42]
)
# serialized = '{"method":"createRect","args":[0,11,23,42]}'

然后JSON.parse解压字符串:

m = JSON.parse(serialized)
surface[m.method].apply(surface, m.args)

不要丢弃你已经拥有的结构,保持该结构并利用它,这样你就不必浪费大量的时间和精力来解决已经解决的解析任务。

于 2012-05-12T16:41:16.330 回答
1

我今天真高兴!我已经学会了如何构造调用类实例上的方法的字符串。看起来很简单(在 MU IS TOO SHORT 给我看之后):

method = "stringMethodToCall"  # selected by user's input  
arguments = [arrayOfValues] # must be array or array-like object
surface = dojox.gfx.createSurface("dojocan", 500, 400) 

现在 :

surface[method].apply(surface,arguments)

就像先生一样。CODEMONKEY 说,surface[method] 是按键访问对象。

再一次感谢你 。

于 2012-05-14T06:56:19.227 回答
1

尝试

surface[formula].setStroke("red") 
于 2012-05-12T14:13:37.290 回答