The philosophy of mruby is to be a lightweight implementation of the Ruby ISO standard. These two objectives are partially contradicting. Ruby is an expressive language with complex implementation details which are difficult to implement in a lightweight manner. To cope with this, limitations to the “Ruby Compatibility” are defined.
This document is collecting these limitations.
This document does not contain a complete list of limitations. Please help to improve it by submitting your findings.
1/2 gives 0.5Since mruby does not have Bignum, bigger integers are represented by Float numbers. To enhance interoperability between Fixnum and Float, mruby provides Float#upto and other iterating methods for the Float class. As a side effect, 1/2 gives 0.5 not 0.
Array passed to putsPassing an Array to puts results in different output.
puts [1,2,3]
1 2 3
[1, 2, 3]
Kernel.raise in rescue clauseKernel.raise without arguments does not raise the current exception within a rescue clause.
begin 1 / 0 rescue raise end
ZeroDivisionError is raised.
No exception is raised.
mruby does not check infinite recursion across C extensions.
def test; eval 'test'; end; test
SystemStackError is raised.
Segmentation fault.
mruby‘s Fiber is implemented in a similar way to Lua’s co-routine. This results in the consequence that you can't switch context within C functions. Only exception is mrb_fiber_yield at return.
Array does not support instance variablesTo reduce memory consumption Array does not support instance variables.
class Liste < Array def initialize(str = nil) @feld = str end end p Liste.new "foobar"
[]
ArgumentError is raised.
For simplicity reasons no method visibility (public/private/protected) is supported.
class VisibleTest def public_method; end private def private_method; end end p VisibleTest.new.respond_to?(:private_method, false) p VisibleTest.new.respond_to?(:private_method, true)
false true
true true
The defined? keyword is considered too complex to be fully implemented. It is recommended to use const_defined? and other reflection methods instead.
defined?(Foo)
nil
NameError is raised.
alias on global variablesAliasing a global variable works in CRuby but is not part of the ISO standard.
alias $a $__a__
nil
Syntax error
An operator can't be overwritten by the user.
class String def + end end 'a' + 'b'
ArgumentError is raised. The re-defined + operator does not accept any arguments.
'ab' Behavior of the operator wasn't changed.
Kernel.binding missingKernel.binding is not implemented as it is not in the ISO standard.