0

是否有可能以某种方式实现在 Hash 中分配的方法/lambda 以编译为本机对象中的本机函数?例如让

x = {foo: "foo", bar: ->{"bar"}}

我需要x像这样的原生对象一样编译它:

x.to_n 
=>
Object {foo: 'bar', bar: function(){return "bar";}}

好的,几乎可以按预期工作

有没有办法将方法转换为本机函数,例如

def foo
 'bar'
end

应用类似的东西

(??:foo??).to_n
=>
function(){return "bar";};

?

4

1 回答 1

2

我猜你想将ruby​​ 方法作为回调传递给javascript 函数,你可以尝试这样的事情:

   x = { bar: method(:foo).to_proc }
   x.to_n

但请记住,这可能无法按类方法的预期工作(上下文可能会在javascript上发生变化)

另一种选择是将该方法调用包装在 lambda 上

   x = { bar: ->{ foo } }
   x.to_n

根据我的经验,这似乎是一种更安全的方法


编辑:

我的第一个答案刚刚引用method(:foo),但是当您调用它时,您会得到一个Method对象,该对象 opal 无法正确桥接到匿名函数,因此需要您在 javascript 上像这样使用它:

  console.log(#{x.to_n}.bar.$call())

要让它像你一样工作,function你需要它是一个过程,所以需要调用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
于 2015-06-17T11:35:42.420 回答