通过循环coffeescript中的对象来动态地字符串函数调用
这与一个不同的图像编辑库(而不是Pixastic)有着松散的联系,代码也进行了一些重构 我正在尝试编写一个函数通过循环coffeescript中的对象来动态地字符串函数调用,coffeescript,Coffeescript,这与一个不同的图像编辑库(而不是Pixastic)有着松散的联系,代码也进行了一些重构 我正在尝试编写一个函数changify,将HTML5图像画布恢复到其原始状态,然后对其运行一些预设更改。此代码从名为camanCache的列表中加载右画布元素imageClipName,其工作原理如下: changify = (imageClipName) -> camanCache[imageClipName].revert -> camanCache[imageClip
changify
,将HTML5图像画布恢复到其原始状态,然后对其运行一些预设更改。此代码从名为camanCache
的列表中加载右画布元素imageClipName
,其工作原理如下:
changify = (imageClipName) ->
camanCache[imageClipName].revert ->
camanCache[imageClipName]
.brightness(10)
.contrast(10)
.noise(10)
.render()
console.log(camanCache[imageClipName])
但我想从另一个名为imageValues
的列表中找到保存的预设更改,并从该列表的键值对中动态创建图像函数更改字符串。以下是我试图做的,但失败了:
imageClipName = "image_1"
imageValues = {image_1:{brightness: 10, contrast: 10, noise: 10}, image_2:{...}...}
changify = (imageClipName) ->
camanCache[imageClipName].revert ->
camanCache[imageClipName]
for o in imageValues when o.id == imageClipName
for key, val of o
.#{key}(val)
.render()
这给了我一个
changify
函数第三行的coffeescript语法错误(意外的'INDENT'
),但我怀疑{key}(val)
在将多个函数附加到camanCache[imageClipName]
时不起作用。如何在coffeescript中动态字符串化函数调用?我认为您正在尝试这样做:
changify = (imageClipName) ->
camanCache[imageClipName].revert ->
clip = camanCache[imageClipName]
for id, methods of imageValues when id == imageClipName
for name, arg of methods
clip = clip[name](arg)
clip.render()
注意切换到<代码>以。。。在外部循环中的,因为您正在对对象进行迭代,用于。。。in
用于CoffeeScript中的数组
鉴于此:
{brightness: 10, contrast: 10, noise: 10}
在方法中
,此循环:
clip = camanCache[imageClipName]
for name, arg of methods
clip = clip[name](arg)
clip.render()
将产生与以下相同的效果:
camanCache[imageClipName].brightness(10).contrast(10).noise(10).render()
在对象o
上迭代时,键、val
对的顺序没有定义,因此不能保证亮度
、对比度
和噪声
调用的顺序。如果您需要按特定顺序使用它们,则必须为方法使用数组:
imageValues = {image_1: [['brightness', 10], ['contrast', 10], ['noise', 10]], ... }
changify = (imageClipName) ->
camanCache[imageClipName].revert ->
clip = camanCache[imageClipName]
for id, methods of imageValues when id == imageClipName
for method in methods
clip = clip[method[0]](method[1])
clip.render()
或者更好一点:
imageValues = {image_1: [ {name: 'brightness', arg: 10}, {name: 'contrast', arg: 10}, {name: 'noise', arg: 10}], ... }
changify = (imageClipName) ->
camanCache[imageClipName].revert ->
clip = camanCache[imageClipName]
for id, methods of imageValues when id == imageClipName
for method in methods
clip = clip[method.name](method.arg)
clip.render()
哇,关于未定义的迭代顺序的非常有用的信息。迭代的顺序是javascript遗留下来的,还是coffeescript所独有的?@Michael:这是直接的javascript,这里有一些指向规范相关部分的链接。键/值存储很少有定义的顺序,Ruby 1.9的哈希是我遇到的唯一顺序键/值对象。再次感谢。显然,我对Ruby有点着迷:)