Сценарий кофе: использование "сконструированной" строки для вызова метода

Я пытаюсь вызвать метод для экземпляра класса в сценарии 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.

Спасибо за ваше время.

3 ответа

Решение

Итак, у вас есть такая строка:

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

и ты хочешь назвать это createRect как метод на 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)

Не выбрасывайте структуру, которая у вас уже есть, сохраняйте эту структуру и пользуйтесь ею, чтобы вам не пришлось тратить кучу времени и усилий на решение задач анализа, которые уже были решены.

Пытаться

surface[formula].setStroke("red") 

Я так счастлив сегодня! Я узнал, как создавать строки, которые вызывают методы в экземпляре класса. Это кажется таким простым (после того, как мистер МУ СЛИШКОМ КОРОТКО показал мне):

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 сказал, что поверхность [метод] обращается к объекту по ключу.

Еще раз, спасибо.

Другие вопросы по тегам