【问题标题】:What are the major omissions in mruby compared to MRI?与 MRI 相比,mruby 的主要遗漏是什么?
【发布时间】:2013-09-14 23:37:11
【问题描述】:

我对@9​​87654321@ 项目非常感兴趣,但与其他更完整的 Ruby 实现(最重要的是 MRI)相比,我没有找到 mruby 中主要遗漏的总结。

项目中的自述文件说 mruby 为 Ruby 实现了 ISO standard 的“一部分”,但没有详细说明哪些功能被省略了。

是否有人知道此类遗漏的列表,或者是否有人对实现足够熟悉以进行总结?

【问题讨论】:

    标签: ruby mruby


    【解决方案1】:

    可在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 不带参数不会在救援子句中引发当前异常。
    • 光纤执行不能跨越 C 函数边界
    • Array 不支持实例变量
    • 不支持方法可见性 (public/private/protected)。
    • defined? 不见了
    • 为全局变量取别名在 CRuby 中有效,但不是 ISO 标准的一部分。
    • 用户不能覆盖操作符。
    • 不支持Kernel#binding
    • 关键字参数 splats (def foo(a, b, **k)) 以不同的方式解析。
    • 参数不能默认为其他已破坏的参数(def foo(a, (b,c), d=b) 无效)。
    • 在条件表达式中将忽略 nil? 方法的任何重新定义。

    【讨论】:

      【解决方案2】:

      我只是用 mruby 运行了简单的代码片段,并从 MRI 得到了不同的结果。

      class Fixnum
        def +(b)
          self * b
        end
      end
      puts 3+4 
      

      mruby 输出 7 而 MRI 输出 12

      【讨论】:

      【解决方案3】:

      看看所谓的 mrbgems (https://github.com/mruby/mruby/tree/master/mrbgems)。您缺少的一些功能(即 RegExp、eval、File)可作为附加 GEM 使用。

      【讨论】:

        【解决方案4】:

        所以我没有仔细阅读源代码,但是在构建了 mruby 并运行了一点解释器之后,我发现缺少以下内容(这绝不是一个完整的列表,我也不知道这些是否是故意遗漏或只是还没有写的东西):

        • 反引号
        • eval
        • String#scan
        • (instance|module|class)_evalString 参数
        • Module.constants
        • Regexp
        • Process
        • Bignum
        • IOFileDir
        • Encoding
        • ThreadMutex
        • Marshal

        如果有人有更完整的列表,或者知道这些位是否尚未实现或故意省略的详细信息,我仍然很想知道。

        【讨论】:

        • 这些东西是已经完全消除了,还是将被推到可选的“mrbgems”中?
        猜你喜欢
        • 1970-01-01
        • 2020-01-02
        • 2012-03-19
        • 2023-02-03
        • 2021-10-14
        • 2021-11-10
        • 2012-07-07
        • 2022-01-22
        • 1970-01-01
        相关资源
        最近更新 更多