为什么我选择了Ruby而不是Python

Python011

为什么我选择了Ruby而不是Python,第1张

伴随着RoR的风行,Ruby语言受到越来越多的开发者的关注,同为脚本语言,Python的地位却略显尴尬,什么样的原因,造成了这样的局面?

笔者认为有以下几个方面:

一、 RoR的推波助澜

笔者认为,Ruby的成功,很大一部分是由于RoR的带动。

几年前,如果你没听过RoR倒是情有可原,但如果今天,RoR对你来说,还是一个陌生词汇的话,那你就有点危险了。:)

什么是RoR呢?

全称,Ruby on Rails,简称,RoR或者Rails。

它是个全栈的(full-stack)web应用框架,它为开发者提供了构建一个web应用所需的完整基础结构,并且严格按照MVC(模型-视图-控制器)架构进行开发。

RoR致力于提高开发者的开发效率,希望通过尽量少的代码,完成尽可能多的功能。基于这样的考虑,RoR有两大设计原则,一是,不要重复自己 (Don''t Repeat Yourself);二是,惯例优于配置(Convention Over Configuration)。

使用RoR,你甚至可以通过简单的几条命令行、几行代码,就完成一个功能强大的web应用程序,这极大地提高了开发者的开发效率。

2004年7月,RoR一经发布,在短期内,便受到很多开发者的追捧。时至今日,RoR已经被全世界的开发者们所关注,它带给开发者的效率提升,是前所未有的;它带给业界关于软件开发的思考,也是意义深远的。

在RoR如此风行的大背景下,Ruby on Rails,这个需要使用Ruby进行开发的web框架,也自然地带动了Ruby语言的发展。

在下面的“Ruby语言受关注程度趋势图”上,可以清晰地看出,Ruby语言在RoR发布也就是2004年7月后,进入了高速发展期。

Ruby因为有了RoR这样的“杀手级”应用,变得春风得意,那么Python呢?

在《浅谈Python语言》一文中,我们提到了Python具有丰富的API库,在web开发方面,也有Django、Turbogears这样的一些框架,就运行速度而言,

Python比Ruby快;就社区而言,Python也比Ruby成熟,可是为什么Python没有产生一个像RoR这样的“杀手级”应用呢?

Python语言的创始人Guido在接受InfoQ采访时,是这样解释的:

“我不喜欢Killer

Application,因为那会让多数人或者社区将精力集中于一个地方。Python是一个应用广泛的语言,基于Python已经产生了很多好用的

Web框架,比如Django等。但是Python不Killer

Application,至少目前是这样,而且我相信随着Python社区的发展,会有很多Killer

Applications自然出现。我喜欢多样化的应用。”

通过这个观点,我们可以看出Python在其发展道路上,追求的是一种均衡,一种“大而全”。

“会有很多Killer Applications自然出现”,这点,我想我们需要拭目以待。单就“均衡”而言,笔者认为这很危险,作为一门脚本语言,试图做Java之类传统语言做的事情,不太可取。

以Java为例,在web应用上,有太多的框架可供选择,不错,“在不同的场景用不同的框架”,这想法很好。可是,在实际应用中,有多少开发者可以根据项目特点,正确、合理地选择框架?

与其到最后,用户还不知道该如何选择,还不如一开始就替用户做出一个选择。

作为Python的使用者,我更愿看到有个Python的“杀手级”应用出现,进而带动Python更快速地发展。

你可以说RoR成就了Ruby,可是Rails为什么偏偏选择了Ruby?!Ruby优势何在?

二、 Ruby的优势

1. 比Perl更强大,比Python更面向对象

“比Perl更强大,比Python更面向对象”,这是Ruby创始人Matz设计Ruby的初衷。

Python既支持面向过程的编程也支持面向对象的编程,而Ruby则是完全面向对象。

在Ruby中,任何东西都是对象,包括Python中的基本数据类型;每个过程或函数都是方法。

例如,取-3的绝对值,在Python中,是这样的:abs(-3)。

而在Ruby中,则是这样的:-3.abs。这种OO的方式,显得更加直观。

2. 强大的语法功能

单就语法的简单性而言,Ruby不及Python。但解决一些较复杂的问题,Ruby强大的语法功能,有助于降低问题的复杂度。

例如:

Ruby以“块”的方式来实现列表内的条件、循环语句,比Python的更灵活、更具通用性。

Ruby具有类似Lisp的彻底的函数方式的条件、循环语句等。

Ruby的迭代器功能可以将流程控制结构抽象化。

3. 强大的字符串处理、正则表达式功能

Matz认为:Ruby >(Smalltalk + Perl) / 2。

Ruby类库是对Perl语言功能的面向对象方式的重组,因为借鉴了很多Perl的东西,使得字符串处理、正则表达式这块,Ruby同样强大。

4. 不会僵住的“胶水语言”

同样是“胶水语言”,Ruby比Python更灵活。

使用过一段时间的Python,你会发现,Python比较依赖第三方的东西。相比较,Ruby则更依赖自身。例如,Ruby可以使用(UNIX的)绝大部分的系统调用,单独使用Ruby也可以进行系统编程等。

有优势,Ruby就一定可以成功了?Python同样也有很多优势!对,还得看当时所处的环境。

三、 时势造英雄

这点还得回到RoR的崛起。

Ruby,1995年12月正式发布,2000年进入美国;2004年7月,RoR正式发布。

RoR的出现时间,值得玩味。

在下面的“Java语言受关注程度趋势图”上,可以看到,2004年7月前后,Java处于一个相对“衰退期”。

提到Java,大家应该都会想到J2EE。

J2EE应用程序的广泛实现是从1999、2000年开始的,它的出现带来了诸如事务管理之类的核心中间层概念的标准化,但是因其开发效率、学习难度和实 际性能的问题,在实践中没有获得完全的成功。作为J2EE核心技术的EJB(2.x),更是因其高昂的学习代价、极低的开发效率和极高的资源消耗,备受指 责。

在这样一个大背景下,2003年,Spring框架诞生了。

Spring的设计思想在于“使J2EE开发更加简单”。这个设计思想,在包括Java领域在内的众多软件开发领域引起了广泛关注。软件开发者们开始思考,如何让开发向着一个更简单的方向发展。

RoR在这一时期出现,无疑是顺应了这样一个潮流。

可以这么说,是历史选择了RoR,当然也选择了Ruby。

遇到合适的机遇,还不够,俗话说得好:“众人拾柴火焰高”。

四、 众星捧月

Ruby的出现,受到了两大主流平台Java和.NET的极力追捧。

2006年9月,SUN雇佣了JRuby的主要开发者Charles Nutter和Thomas Enebo;一年不到,2007年6月14号,JRuby 1.0正式发布。SUN在其Java IDE NetBeans 6.0 M10中,更是集成了对Ruby/JRuby的支持。反观Python的Java实现——Jython,则没有这么幸运,发展至今,它并没有得到SUN的 支持。

而Microsoft,也在2007年7月,推出了Ruby的.NET实现——IronRuby的预览版。

相信SUN和Microsoft对Ruby的竞相推崇,必然推动Ruby的进一步发展。

基于以上几点,笔者认为Ruby的成功不是偶然,并且相信这样的成功还会持续下去。对于Python的未来,我们也将拭目以待。

假设您有一个可以工作的 Ruby 应用程序,并且需要向其添加电子邮件传递功能。这可能与用户身份验证或任何其他类型的事务性电子邮件有关,这没有什么区别。本教程旨在帮助您实现使用 Ruby 发送电子邮件

用 Ruby 发送电子邮件的选项

大多数情况下,你可以从三个选项中选择一个。

最简单的方法是使用 Net: : SMTP 类。它提供了通过 SMTP 发送电子邮件的功能。该选项的缺点是 Net: : SMTP 缺少撰写电子邮件的功能。你可以自己创建,但这需要时间。

第二种选择是使用专用的 Ruby gem,如 Mail、 Pony 或其他。这些解决方案使您能够以简单有效的方式处理电子邮件活动。Action Mailer 是一个完美的电子邮件解决方案,通过 Rails 的棱镜。而且,很有可能,这将是你的选择。

第三个选项是类 Socket。通常,这个类允许您设置流程之间或流程内部的通信。因此,电子邮件发送也可以用它来实现。然而,事实是 Socket 并没有为您提供广泛的功能,您也不太可能想要使用它。

现在,让我们尝试使用所描述的每个解决方案发送电子邮件。

如何通过 Net: : SMTP 在 Ruby 中发送电子邮件

根据我的经验,在一个普通的 web 应用程序中使用这个选项是不常见的。但是,如果您在某些物联网设备上使用 mruby (Ruby 语言的一种轻量级实现) ,那么通过 Net: : SMTP 发送电子邮件可能是合适的。此外,如果在无服务器计算中使用,例如 AWS Lambda,它也会这样做。首先查看这个脚本示例,然后我们将详细介绍它。

Ruby 露比

这是一个通过 SMTP 发送文本电子邮件的简单示例(可以在这里找到官方文档)。您可以看到四个标题: 发件人、收件人、主题和日期。请记住,您必须将它们与电子邮件正文中的空行分开。同样重要的是连接到 SMTP 服务器。

Net::SMTP.start('your.smtp.server', 25) do |smtp|

Start (‘ your.smtp.server’,25) do | smtp |

自然,这里将显示您的数据,而不是“ your.smtp.server”,并且25是默认端口号。如果需要,可以指定其他详细信息,如用户名、密码或身份验证方案(普通、登录和 cram _ md5)。它可能看起来如下:

`Net::SMTP.start('your.smtp.server', 25, ‘localhost’, ‘username’, ‘password’ :plain) do |smtp|`

在这里,您将使用纯文本格式的用户名和密码连接到 SMTP 服务器,客户机的主机名将被标识为 localhost。

之后,可以使用 send _ message 方法并将发送方和接收方的地址指定为参数。

Start (‘ Net: : SMTP.start (‘ your.SMTP.server’,25) do | SMTP |’)的块形式将自动关闭 SMTP 会话。

在 Ruby Cookbook 中,使用 Net: : SMTP 库发送电子邮件被称为极简主义,因为您必须手动构建电子邮件字符串。尽管如此,这并不像你想象的那样没有希望。让我们看看如何用 HTML 内容增强电子邮件,甚至添加附件。

在网上发送 HTML 电子邮件: : SMTP

查看这个引用消息部分的脚本示例。

Ruby

除了消息体中的 HTML 标记之外,我们还有两个额外的头: MIME-Version 和 Content-type。MIME 指的是 MIME。它是 Internet 电子邮件协议的扩展,允许您在单个消息体中组合不同的内容类型。MIME-Version 的值通常为1.0。它指示消息是 MIME 格式的

至于 Content-type 头,一切都很清楚。在我们的示例中,有两种类型-HTML 和纯文本。另外,确保使用定义的边界分隔这些内容类型。

除了 MIME-Version 和 Content-type,您可以使用其他 MIME 头:

内容-传输-编码-表示二进制到文本的编码方案(7位、 Quoted-printable、 base64、8位或二进制)。

在网上发送带附件的电子邮件: : SMTP

- Content-Disposition-指定表示样式(内联或附件)

让我们添加一个附件,例如 PDF 文件。在这种情况下,我们需要将 Content-type 更新为 multipart/mix。另外,使用 pack (“ m”)函数用 base64编码对附加文件进行编码。

Ruby

之后,你需要定义你的电子邮件的三个部分。

第1部分-主要标题

第2部分-消息行动

第三部分-附件

现在,我们可以把所有的部分放在一起,并最终确定剧本。这就是它看起来的样子:

Ruby

我可以发送电子邮件给多个收件人在网络: : SMTP?

当然,你可以. send _ message 期望第二个和随后的参数包含收件人的电子邮件。例如:

Ruby

发送电子邮件的最佳 Ruby Gems

在 Ruby 生态系统中,您可以找到特定的电子邮件 gems,它们可以改善您的电子邮件发送体验。

Ruby Mail

该库旨在提供一个单点访问管理所有电子邮件相关活动,包括发送和接收电子邮件。

Pony

您可能听说过一个关于用一个命令发送电子邮件的童话故事。抓紧你们的帽子,因为它是真的,由小马宝石提供。

ActionMailer

这是最流行的宝石发送电子邮件在 Rails 上。如果你的应用程序写在上面,ActionMailer 肯定会出现。它允许您使用邮件类和视图发送电子邮件

使用邮件陷阱测试使用 Net: : SMTP 的电子邮件发送

设置非常简单。进入演示收件箱后,复制 SMTP“设置”选项卡上的 SMTP 凭据并将其插入到代码中。或者,您可以在 Integrations 部分获得一个简单消息的即用模板。只要选择一种编程语言或框架,你的应用程序是建立。

Ruby

如果一切正常,您将在邮件陷阱演示收件箱中看到您的消息。此外,您可以尝试检查您的 HTML 内容和附件的电子邮件。

您刚刚阅读了关于如何使用 Ruby 测试和发送电子邮件的完整教程。希望您喜欢!