是否有可能以某种方式实现在Hash中分配的方法/ lambda以编译为本机对象中的本机函数? 例如,让
x = {foo: "foo", bar: ->{"bar"}}
我需要将x
编译成像这样的原生对象:
伪
x.to_n
=>
Object {foo: 'bar', bar: function(){return "bar";}}
好的,几乎可以预期
有没有办法将方法转换为本机函数 e.g。
def foo
'bar'
end
应用类似
的内容(??:foo??).to_n
=>
function(){return "bar";};
答案 0 :(得分:2)
我猜你想传递一个 ruby方法作为回调 javascript函数,你可以试试这样的事情:
x = { bar: method(:foo).to_proc }
x.to_n
但请记住,这可能不适用于类方法(上下文可能会在 javascript 上发生变化)
另一种选择是将该方法调用包装在lambda
上 x = { bar: ->{ foo } }
x.to_n
根据我的经验,这似乎是一种更安全的方法
编辑:
我的第一个回答刚刚引用method(:foo)
,但是当你调用它时,你得到一个方法对象,其中蛋白石没有正确桥接到匿名函数,所以它需要你使用它在javascript上是这样的:
console.log(#{x.to_n}.bar.$call())
要让它作为function
工作,你需要它作为一个proc,所以需要调用to_proc
,如果它是一个实例方法,这可能会再次破坏
class Test
def initialize
@var = "baz"
end
def foo
"bar #{@var}"
end
end
t = Test.new
x = { bar: t.method(:foo).to_proc }
`console.log(#{x.to_n}.bar())` # bar undefined
y = { bar: ->{ t.foo } }
`console.log(#{y.to_n}.bar())` # bar baz