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

私はすべての同様の質問を見てきましたが、CoffeeScriptでそれを実装するための答えを見つけることができません。

お時間をいただきありがとうございます。

4

3 に答える 3

2

したがって、次のような文字列があります。

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

createRectそれをメソッドとして呼び出したいですsurfaceよね?あなたはそれをすべて一つのひもにまとめることによって、あなたの人生を必要以上に難しくそして醜くしています。代わりに、2つの別々の変数を作成する必要があります。メソッド名を保持する文字列と引数を保持する配列です。

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

試す

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

今日はとても幸せです!クラスインスタンスのメソッドを呼び出す文字列を作成する方法を学びました。それはとても単純なようです(MUさんが私に見せてくれた後):

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 に答える