Сценарий кофе: использование "сконструированной" строки для вызова метода
Я пытаюсь вызвать метод для экземпляра класса в сценарии 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)
Не выбрасывайте структуру, которая у вас уже есть, сохраняйте эту структуру и пользуйтесь ею, чтобы вам не пришлось тратить кучу времени и усилий на решение задач анализа, которые уже были решены.
Я так счастлив сегодня! Я узнал, как создавать строки, которые вызывают методы в экземпляре класса. Это кажется таким простым (после того, как мистер МУ СЛИШКОМ КОРОТКО показал мне):
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 сказал, что поверхность [метод] обращается к объекту по ключу.
Еще раз, спасибо.