我对mruby项目很感兴趣,但是与其他更完整的 Ruby 实现(最重要的是 MRI)相比,我没有找到对 mruby 主要遗漏的总结。
项目中的自述文件说 mruby 实现了 Ruby 的ISO 标准的“一部分” ,但没有详细说明哪些特性被省略了。
有谁知道此类遗漏的列表,或者是否有人对实现足够熟悉以进行总结?
所以我没有仔细阅读源代码,但是在构建了 mruby 并运行了一点解释器之后,我发现缺少以下内容(这绝不是一个完整的列表,我也不知道这些是故意遗漏还是只是还没有写的东西):
eval
String#scan
(instance|module|class)_eval
有String
论据Module.constants
Regexp
Process
Bignum
IO
, File
, 和Dir
Encoding
Thread
和Mutex
Marshal
如果有人有更完整的列表,或者知道这些位是否尚未实现或故意省略的详细信息,我仍然很想知道。
可以在https://github.com/mruby/mruby/blob/master/doc/limitations.md找到 Ruby MRI 和 MRuby 之间部分但最新的差异列表。
截至 2020 年 3 月,这些是列出的差异:
1/2
给出Float(0.5)
是因为 mruby 不支持 Bignum。puts
会产生不同的输出。Kernel.raise
没有参数不会在救援子句中引发当前异常。Array
不支持实例变量public
/ private
/ protected
)。defined?
不见了Kernel#binding
不支持。def foo(a, b, **k)
) 以不同的方式解析。def foo(a, (b,c), d=b)
已破坏的参数(无效)。nil?
在条件表达式中忽略方法的任何重新定义。看看所谓的 mrbgems ( https://github.com/mruby/mruby/tree/master/mrbgems )。您缺少的一些功能(即 RegExp、eval、File)可作为附加 GEM 使用。
我只是用 mruby 运行简单的代码片段,并从 MRI 得到不同的结果。
class Fixnum
def +(b)
self * b
end
end
puts 3+4
mruby 输出 7 而 MRI 输出 12