Ejecuci贸n de scripts de Ruby desde Go Lang

Para usar Ruby como lenguaje de scripting, es decir, como lenguaje de incrustaci贸n como lua, existe una implementaci贸n ligera de Ruby llamada MRuby .





Solo se ha encontrado una biblioteca estable enlazada a mruby para ir . De forma predeterminada, puede compilar la versi贸n 1.2.0 de mruby (lanzamiento de 2015) y puede intentar compilar hasta la versi贸n 1.4.1 (lanzamiento de 2018). Pero la versi贸n actual de mruby ahora tiene la versi贸n 2.1.2 (2020). Hay una bifurcaci贸n con soporte para mruby 2.1.0 . Usaremos esta bifurcaci贸n para obtener la versi贸n 2.1.2 despu茅s de algunos cambios menores.





En versiones anteriores a 2.1.0, introdujeron al menos las siguientes incompatibilidades a las que debe prestar atenci贸n.





Versi贸n 2.1.1 :





  • Elimine la opci贸n de configuraci贸n MRB_INT16.





Versi贸n 2.1.2





  • IO#readchar returns a UTF-8 character fragment instead of EOFError if EOF is reached in the middle of UTF-8 characters. (86271572) This behavior is different from CRuby, but it is a mruby specification that supports either ASCII or UTF-8 exclusively.





  • Remove mrb_run() from C APIs.





go-mruby mrb_run. "Breaking Changes" . go-mruby:





  • https://github.com/mrbgems/go-mruby/tree/mruby-2 mruby-2.





  • go.mod go.sum go-mruby. , go . , go , go . go-mruby vendor .





  • mruby.go Run(), RunWithContext().





  • Makefile MRUBY_COMMIT 2.1.2 - mruby.





  • make. mruby vendor libmruby.a.





. mruby-error (https://github.com/mitchellh/go-mruby/pull/75). mruby require . . http://mruby.org/libraries/, mruby/build_config.rb . mruby/examples/mrbgems , mruby/mrbgems . , mruby-metaprog.





Intentemos habilitar el soporte json. Para hacer esto, necesita registrar la biblioteca en go-mruby / build_config.rb:





gem :github => 'iij/mruby-iijson'
      
      



Un ejemplo del uso de JSON.parse, mientras que, como puede ver, la opci贸n symbolize_names aparentemente no es compatible con esta biblioteca.





func main() {
	mrb := mruby.NewMrb()
	defer mrb.Close()

	class := mrb.DefineClass("Example", nil)
	class.DefineClassMethod("json_value", func(m *mruby.Mrb, self *mruby.MrbValue) (mruby.Value, mruby.Value) {
		return mruby.String(`{"int":1, "array":["s1", "s2", {"nil": null}]}`), nil
	}, mruby.ArgsReq(1))

	result, err := mrb.LoadString(`JSON.parse(Example.json_value, {"symbolize_names" => true})`)
	if err != nil {
		panic(err.Error())
	}

	// Result: {"int"=>1, "array"=>["s1", "s2", {"nil"=>nil}]}
	fmt.Printf("Result: %s\n", result.String())
}
      
      






All Articles