Menjalankan Ruby Scripts dari Go Lang

Untuk menggunakan Ruby sebagai bahasa scripting, yaitu sebagai bahasa embedding seperti lua, ada implementasi Ruby ringan yang disebut MRuby .





Hanya satu pustaka terikat mruby stabil yang ditemukan untuk digunakan . Secara default, ini dapat membangun mruby versi 1.2.0 (rilis 2015), dan Anda dapat mencoba membangun hingga versi 1.4.1 (rilis 2018). Tetapi versi mruby yang sekarang sekarang memiliki versi 2.1.2 (2020). Ada garpu dengan dukungan untuk mruby 2.1.0 . Kami akan menggunakan garpu ini untuk mendapatkan versi 2.1.2 setelah beberapa perubahan kecil.





Dalam versi yang lebih lama dari 2.1.0, mereka memperkenalkan setidaknya inkompatibilitas berikut yang harus Anda perhatikan.





Versi 2.1.1 :





  • Hapus opsi konfigurasi MRB_INT16.





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





Mari coba aktifkan dukungan json. Untuk melakukan ini, Anda perlu mendaftarkan pustaka di go-mruby / build_config.rb:





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



Contoh penggunaan JSON.parse, sementara, seperti yang Anda lihat, opsi symbolize_names tampaknya tidak didukung oleh pustaka ini.





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