10
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

mrubyとCRubyの非互換とその対応方法

(メモ。詳しくはあとで追記するかも。)

"foo" "bar" の文字列連結ができない

"foo" + "bar" を使う。

defined?(Foo)がエラーになる

const_defined?(:Foo)を使う。

mrubyにdefined?(Foo)が実装されていない理由は、Fooが未定義でもエラーにさせないために特殊な実行が行われており、それを嫌ったためだったはず。

:"foo#{a}bar#{b}"形式のSymbol定義がエラーになる

"foo#{a}bar#{b}".to_symを使う。

$:等の変数がない

$LOAD_PATH等はあったりするのでこちらを使う。

RUBY_PATCHLEVEL等の定数がない

適当に定義して回避する?

なお、2016年現在のmrubyにはパッチレベルの概念がない。github:mruby/mrubyのmasterとmruby forumのリリース版のみ。

RbConfigがない

同上。

なお、mrubyはクロス開発もごく自然に行われるため、ビルド時のOSの情報とかは役に立たないことがあるのに注意。

IOがない

github:iij/mruby-ioを使う。

Dirがない

github:iij/mruby-dirを使う。

Dir.glob は github:gromnitsky/mruby-dir-glob を使う。

tmpdirがない

github:iij/mruby-tempfileを使う。

requireがない

github:iij/mruby-requireを使う。

ENVがない

github:iij/mruby-envを使う。

Regexpがない

github:iij/mruby-regexp-pcreやgithub:mattn/mruby-onig-regexpを使う。

Iconvがない

github:mattn/mruby-iconvを使う。

fileutils.rb、pp.rb等がない

fileutilsに関してはgithub:gromnitsky/mruby-fileutils-simple があったりする(実装は力技ですごい)のでこの辺を使ったりする。

pp.rbの代わりは書いた -> https://github.com/takahashim/mruby-pp

Kernel#execがない

Kernel#systemならgithub:iij/mruby-processにあったりするのでこちらでもよければこれを使う。

あと、github:haconiwa/mruby-execがある(動作未確認)。

at_exitがない

github:ksss/mruby-at_exit を使う。

mruby本家にat_exitがない理由については http://ksss9.hatenablog.com/entry/2016/08/19/224631 を参照。そもそもインタプリタの実行終了とプロセスの終了が一致するCRubyと、インタプリタが終了してもプロセスが終了するとは限らないmrubyでat_exitをどう揃えるべきか、という問題がある。なお、ISO Rubyではat_exitは定義されていない。

File.executable?がない

github:iij/mruby-io にあるかと思ったらなかった。自力でなんとかすべきか。

executable?はOSに依存する概念なのでいろいろめんどくさい、という難点がある。

その他いろいろ動かないものがある

(自力で直せそうなら修正してpull requestをする→一部した)

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
10
Help us understand the problem. What are the problem?