0

ハッシュに割り当てられたメソッド/ラムダを何らかの方法で達成して、ネイティブオブジェクトのネイティブ関数にコンパイルすることは可能ですか? たとえば、みましょう

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

xそのようなネイティブオブジェクトのようにコンパイルする必要があります:
pseudo

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

OK ほぼ期待どおりに動作します

メソッドをネイティブ関数にトランスパイルする方法はありますか?

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で変更される可能性があります) 。

別のオプションは、ラムダでそのメソッド呼び出しをラップするだけです

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

これは私の経験上、より安全なアプローチのようです


編集:

私の最初の答えは を参照method(:foo)しましたが、これを呼び出すと、 opal が無名関数に適切にブリッジしないMethodオブジェクトを取得するため、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
于 2015-06-17T11:35:42.420 に答える