Ruby 中的静态类型推断,我该怎么办?

夏巴巴夫

我有一个学校项目,旨在静态键入一些 Ruby 代码。所以,我的输入只是一个.rb文件,我应该能够输入程序中分配的每个变量。

现在,我打算做的是:

  • 使用 Parser 库获取文件的 AST
  • 将各种节点放入容器对象中
  • 实现访问者模式以递归方式遍历程序
  • 尝试从那里推断出一些东西(我正在考虑以某种方式从核心的方法中创建一个可能的输入和输出类型的表)

我只接受一些非常基本的 Ruby 作为输入(= 不调用外部库,只是 ruby​​ 的核心 + 文件中定义的方法)

我的问题是:您如何看待我的方法?是否有任何 gem/现有程序可以帮助我?

Jörg W 中午

您的方法在技术上正确的,但是您如何使用它听起来很奇怪。这:

现在,我打算做的是:

  • 使用 Parser 库获取文件的 AST
  • 将各种节点放入容器对象中
  • 实现访问者模式以递归方式遍历程序
  • 尝试从那里推断出一些东西(我正在考虑以某种方式从核心的方法中创建一个可能的输入和输出类型的表)

听起来有点像你想像这样去火星:

现在,我打算做的是:

  • 拿一支铅笔
  • 拿一张纸
  • 得到一张桌子
  • 坐在办公桌前,用我的笔和纸设计一个太空发射系统和火星着陆器

换句话说,你列出了三个完全微不足道的点,对于一个有经验的程序员来说,这可能是一个小时的工作,然后是第四个,这是多年的工作,值得攻读博士学位。

我所知道的关于 Ruby 静态类型推断的最高级工作是Diamondback Ruby (DRuby)(不要与分布式 Ruby 标准库 aka dRb / dRuby 混淆)。然而,Diamondback Ruby 现在被放弃了,因为作者放弃了 Ruby 的静态类型推断。

Diamondback Ruby 背后的主要研究人员之一现在正在研究一个名为RDL的新项目Diamondback Ruby 和 RDL 之间的主要区别是:

  • RDL 执行动态检查,而不是静态检查
  • RDL 依赖于显式注释,而不是隐式推理

Steep是另一个类似的项目。它也依赖于动态检查和注释,此外实际上并不争取类型正确性。

IDEA 的 Ruby 类型推理完全重新思考了 JetBrains 计划如何在其 IDEA / RubyMine IDE 中处理 Ruby 的类型推理。确实使用类型推断,但它使用动态类型推断,而不是静态的。

所以,你可以看到,对Ruby静态类型推断是这么辛苦,没有人甚至尝试它,谁的家伙做了尝试就放弃了它,现在所做的与明确的类型注释动态类型检查来代替。

Robert Mosolgo 博客上的Ruby Type Checking Roundup很好地概述了当前 Ruby 类型的最新技术。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我无法让我的斐波那契数列通过Ruby中的rspec测试。我该怎么办?

来自分类Dev

ruby-出现错误时我该怎么办(例如:NameError)

来自分类Dev

对复杂的 ruby 哈希进行排序可以正常工作,但无法反转,我该怎么办?

来自分类Dev

Ruby脚本逐行读取文件,如果语句带有puts,该怎么办?

来自分类Dev

我该怎么办呢?该怎么办?

来自分类Dev

如果对象可以在Ruby中打印自己怎么办?[对象#打印]

来自分类Dev

我在编辑控制器中输入错误类型,我该怎么办?

来自分类Dev

为什么在Scala 2.11中执行此代码类型检查,我该怎么办?

来自分类Dev

错误在php中批量插入!我该怎么办?

来自分类Dev

Raspberry Pi我该怎么办?

来自分类Dev

意外升级,我该怎么办?

来自分类Dev

我该怎么办?教义关系

来自分类Dev

日期计数,我该怎么办?

来自分类Dev

Visual Studio C ++静态链接该怎么办

来自分类Dev

如果我想检查硒webdriver中是否存在该元素,该怎么办?

来自分类Dev

当DefinitelyTyped类型定义用于比我想要的新版本时该怎么办?

来自分类Dev

当我不知道需要的数据类型时该怎么办?

来自分类Dev

如果列小于 4 打印列 3,那么 ruby 怎么办?

来自分类Dev

我想获取嵌套的unsizes结构数组中的项目数。我该怎么办?

来自分类Dev

在我的代码textview中不以粗体显示我该怎么办?

来自分类Dev

我不想在 swift 3 中重复相同的单词,我该怎么办?

来自分类Dev

我的属性太不讲究了,我该怎么办?

来自分类Dev

我想运行“ HttpAsyncTask” ...我该怎么办?

来自分类Dev

我单击了病毒链接-我该怎么办?

来自分类Dev

该消息怎么办?

来自分类Dev

AspectFill无法在xamarin中的SkiaSharp中处理调整大小的图像,我该怎么办?

来自分类Dev

在Ubuntu 12.10的WUBI安装中更新到13.04失败。我该怎么办?

来自分类Dev

git:我的提示中显示“ am / rebase”,该怎么办?

来自分类Dev

在MPI中未知发送消息的数量时,我该怎么办?

Related 相关文章

  1. 1

    我无法让我的斐波那契数列通过Ruby中的rspec测试。我该怎么办?

  2. 2

    ruby-出现错误时我该怎么办(例如:NameError)

  3. 3

    对复杂的 ruby 哈希进行排序可以正常工作,但无法反转,我该怎么办?

  4. 4

    Ruby脚本逐行读取文件,如果语句带有puts,该怎么办?

  5. 5

    我该怎么办呢?该怎么办?

  6. 6

    如果对象可以在Ruby中打印自己怎么办?[对象#打印]

  7. 7

    我在编辑控制器中输入错误类型,我该怎么办?

  8. 8

    为什么在Scala 2.11中执行此代码类型检查,我该怎么办?

  9. 9

    错误在php中批量插入!我该怎么办?

  10. 10

    Raspberry Pi我该怎么办?

  11. 11

    意外升级,我该怎么办?

  12. 12

    我该怎么办?教义关系

  13. 13

    日期计数,我该怎么办?

  14. 14

    Visual Studio C ++静态链接该怎么办

  15. 15

    如果我想检查硒webdriver中是否存在该元素,该怎么办?

  16. 16

    当DefinitelyTyped类型定义用于比我想要的新版本时该怎么办?

  17. 17

    当我不知道需要的数据类型时该怎么办?

  18. 18

    如果列小于 4 打印列 3,那么 ruby 怎么办?

  19. 19

    我想获取嵌套的unsizes结构数组中的项目数。我该怎么办?

  20. 20

    在我的代码textview中不以粗体显示我该怎么办?

  21. 21

    我不想在 swift 3 中重复相同的单词,我该怎么办?

  22. 22

    我的属性太不讲究了,我该怎么办?

  23. 23

    我想运行“ HttpAsyncTask” ...我该怎么办?

  24. 24

    我单击了病毒链接-我该怎么办?

  25. 25

    该消息怎么办?

  26. 26

    AspectFill无法在xamarin中的SkiaSharp中处理调整大小的图像,我该怎么办?

  27. 27

    在Ubuntu 12.10的WUBI安装中更新到13.04失败。我该怎么办?

  28. 28

    git:我的提示中显示“ am / rebase”,该怎么办?

  29. 29

    在MPI中未知发送消息的数量时,我该怎么办?

热门标签

归档