Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以编写与1.8.7向后兼容的ruby 2.3.7脚本吗?_Ruby - Fatal编程技术网

我可以编写与1.8.7向后兼容的ruby 2.3.7脚本吗?

我可以编写与1.8.7向后兼容的ruby 2.3.7脚本吗?,ruby,Ruby,到目前为止,我一直在POSIX shell中编写所有脚本,以便在我使用的所有机器(macOS、各种Linux、FreeBSD)上运行它们。我希望有一个统一的体验,在那里我可以从git中提取我的点文件,并准备好所有的设置和脚本 然而,POSIX shell是一种非常令人恼火的语言,我一直在考虑切换到Ruby以满足我的脚本需求。不幸的是,在我开始之前,我就意识到macOS附带Ruby 2.3.7,而我经常需要使用的一台机器只有Ruby 1.8.7。这是一台我没有sudo访问权限的学校机器,所以我无法

到目前为止,我一直在POSIX shell中编写所有脚本,以便在我使用的所有机器(macOS、各种Linux、FreeBSD)上运行它们。我希望有一个统一的体验,在那里我可以从git中提取我的点文件,并准备好所有的设置和脚本

然而,POSIX shell是一种非常令人恼火的语言,我一直在考虑切换到Ruby以满足我的脚本需求。不幸的是,在我开始之前,我就意识到macOS附带Ruby 2.3.7,而我经常需要使用的一台机器只有Ruby 1.8.7。这是一台我没有sudo访问权限的学校机器,所以我无法安装更高版本的Ruby

TL;DR


是否有可能编写同时在1.8.7和2.3.7上运行的Ruby脚本(希望在这两者之间都能运行)?是否有一套指导原则可以帮助我避免不兼容的语言功能?

是的,如果您将自己限制在Ruby 1.8.7、Ruby 2.3.7以及两者之间的语言和库功能的交叉点上,这是可能的

向后兼容性的最后一个重大突破是从Ruby 1.8跳到Ruby 1.9。字符串处理完全改变了,所以任何与文本处理有关的操作都需要非常小心

在我的头顶上:

  • 在Ruby 1.8中,字符串被认为是字节序列。在Ruby 1.9中。字符串是不同迭代器的工厂,按代码点、字符或字节进行迭代
  • 因此,在Ruby 1.9中,字符串不再是可枚举的
  • 在Ruby 1.8中,索引到字符串将返回一个
    整数
    ,在Ruby 1.9中返回一个单个字符
    字符串
  • 在Ruby 1.8中,字符文本(例如
    ?a
    )将计算为
    整数
    ,在Ruby 1.9中计算为单个字符
    字符串
  • 在Ruby 1.8中,假设所有字符串都采用相同的编码(通常为ASCII,但可以更改为非常有限的集合,即UTF-8和两种亚洲编码)。Ruby 1.9完全支持编码,每个字符串都有自己的单独编码,每个I/O流有两种编码(内部编码和外部编码),每个源文件都有单独的编码
您的最佳选择可能是限制自己仅使用中指定的内容。该规范是专门编写的,因此当时所有现有的Ruby实现(MRI、YARV、IronRuby、JRuby、MacRuby、Rubinius)都将自动兼容,这基本上意味着该规范只指定Ruby 1.8.6、Ruby 1.8.7和Ruby 1.9.0交集的最小要求子集


由于从那时起没有任何向后不兼容的更改,您可以放心,您的代码将适用于从Ruby 1.8.6到(但不包括)3.0的所有版本,以及所有符合ISO的Ruby实现,据我所知,这些实现包括MRI、YARV、JRuby、IronRuby、Rubinius、MacRuby、MRuby、MagLev、,和块菌。

不要使用后来Ruby中添加的功能。这包括语言和库功能。@DaveNewton我听说1.9破坏了与1.8的兼容性。除非我误解了,否则这意味着在1.8中有用的东西在1.9中不起作用。因此,它比仅仅编写1.8代码要复杂得多,因为有些东西在以后的版本中不起作用。除了映射顺序,没有什么重要的iirc。这些更改都有文档记录——如果您已经在bash中完成了所有工作,那么您不太可能会做太多强调兼容性的工作。另外,安装多个版本的Ruby进行测试也很简单。因此,询问Ruby版本更改的详细清单并不是最好的地方——只要看看文档、主要版本的更改日志以及讨论更改的博客文章就可以了。