Ausführen von Ruby-Skripten von Go Lang

Um Ruby als Skriptsprache zu verwenden, dh als Einbettungssprache wie lua, gibt es eine leichtgewichtige Ruby-Implementierung namens MRuby .





Es wurde nur eine stabile mruby-gebundene Bibliothek für unterwegs gefunden . Standardmäßig kann mruby Version 1.2.0 (Version 2015) erstellt werden, und Sie können versuchen, Version 1.4.1 (Version 2018) zu erstellen. Die aktuelle Version von mruby hat jetzt Version 2.1.2 (2020). Es gibt eine Gabel mit Unterstützung für mruby 2.1.0 . Wir werden diese Gabelung verwenden, um Version 2.1.2 nach einigen geringfügigen Änderungen zu erhalten.





In Versionen älter als 2.1.0 wurden mindestens die folgenden Inkompatibilitäten eingeführt, auf die Sie achten sollten.





Version 2.1.1 :





  • Entfernen Sie die Konfigurationsoption MRB_INT16.





Version 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.





Versuchen wir, die JSON-Unterstützung zu aktivieren. Dazu müssen Sie die Bibliothek in go-mruby / build_config.rb registrieren:





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



Ein Beispiel für die Verwendung von JSON.parse. Wie Sie sehen, wird die Option symbolize_names von dieser Bibliothek anscheinend nicht unterstützt.





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