去年我在BREX开始了一份新工作,Elixir是业务逻辑的主要编程语言。这是我在Ruby(主要)为我的职业生涯工作后第一个真正的冒险。由于JoséGalim来自Ruby World,因此Elixir是我多年来听到的常见流行语。我在这里做过了一个教程或两个,但从未真正使用它。现在,回顾过去一年,我对elixir变得相当舒适,并希望概述一些我真正喜欢的一些关于酏剂的东西,以及我想念的一些我想念的东西。
首先有很多关于Elixir编程语言的好事。这篇文章绝不是将所有这些帖子覆盖或谈论,何时应该使用Elixir vs Ruby。这些只是我在过去一年中收集的一些意见和观察,从Ruby(在Rails)背景中收集了Elixir。
进程是一种抽象,内置于语言(谢谢Erlang),在内存和CPU方面非常轻量级,并且允许代码以隔离运行并同时运行。进程为Elixir中的并发性提供了构建块,并允许我们编写分布式和容错代码。由于流程在Elixir中编写并发代码非常简单和简单。但是在Ruby中,存在全局解释器锁(GIL)的概念,这可以防止多个Ruby线程同时执行。
在文献中,Elixir在文件方面做得非常好。通过Hexdocs,开发人员可以轻松地与其代码内联编写文档,然后免费生成并托管它!这使得为您的OSS创建文档令人难以置信的努力。核心团队开发的Elixir语言和其他库充分利用了六角洲,创造了非常强大的文档。 Hexdocs设计得很好,这使得它们难以读和导航。您甚至可以从文档中编写和运行测试,这是在文档中编写多功能代码示例的重要方法。只需查看Elixir DateTime Docs,下面的@doc模块属性将生成Hexdocs,并且通过将Doctest DateTime添加到XXX_Test.exs文件中的测试期间,将在测试期间运行示例。
"""比较两个DateTime结构。如果第一个DateTime晚于第二个DATETIME而返回“:GT`,则为”:LT`反之亦然。如果两个日期时间是平等的`:返回EQ`。请注意,在完成比较时,将考虑UTC和标准偏移。 ##示例IEX> dt1 =%datetime {年:2000,月:2,日:29,zone_abbr:" amt" ...>小时:23,分钟:0,第二:7,微秒:{0,0},...> UTC_OFFSET:-14400,std_offset:0,time_zone:"美国/ Manaus"} Iex> dt2 =%datetime {年:2000,月:2,日:29,zone_abbr:" cet" ...>小时:23,分钟:0,第二:7,微秒:{0,0},...> UTC_OFFSET:3600,std_offset:0,time_zone:"欧洲/华沙"} Iex> DateTime.comPare(DT1,DT2):GT""" " 1.4.0"比较(日历.datetime(),calendar .datetime()):::LT | :EQ | :GT DEF比较(...)做...
当我在大学时,我采取了一个功能的程序编程课程,教我OCAML。这是我第一次进入功能规划和回来的方式,然后我意识到了令人难以置信的强大和有用的模式匹配是多么令人难以置信的。没有更复杂,难以读取交换机/ if语句。因此,当我第一次开始写Elixir时,我很高兴再次使用模式匹配。例如,= sign是Elixir中的匹配操作员而不是赋值。模式匹配允许我们匹配简单的值,数据结构甚至函数。那么这在实践中是什么样的?
在这里,我们可以看到我们如何将元组的值提升为变量。我们还看到了PIN运算符^的示例,它将与当前值vs提取到变量中的匹配。这使得简单地写作自信的代码。
IEX> {a,b,c} = {:你好,"世界" ,42} {:你好,"世界" ,42} iex>答:Helloiex> B"世界" iex> ^ c = 34 * *(matchError)没有右手边的匹配
图案匹配权的另一个例子是基于参数动态分配函数。例如,下面显示定义为处理三种不同参数模式的第一函数,并动态选择正确的函数定义。
最后,通过案例陈述或如下陈述,控制流程非常棒,如果先前的模式匹配,则只能沿着当前流程继续沿着当前流程。例如,坐标必须是三元组,每个评估函数必须返回确定的元组以进行最终添加。如果任何模式不匹配它将转到else子句,并尝试将匹配匹配返回0(虽然没有模式匹配的情况,但我们得到一个鼠置场景。
使用{x,y,z}< - 坐标,{:确定,x_val}< - 评估(x),{:确定,y_val}< - 评估(y),{:确定,z_val}< - 评估(z)do x_val + y_val + z_val else nil - > 0 {:错误,_REAN} - > 0结束
Elixir标准库配有许多有用的功能和模块,以及一流的工具。首先,外出和异步测试在Ruby中是一个大的胜利。在Ruby工作时,第一件事就是拉到RSPEC和任何必要的匹配,但在Elixir中,这不是必需的,因为散发是语言的。您可以开箱即用测试框架,它还允许您异步运行测试!这是一个巨大的痛苦点,当我在铁路巨石上的Ruby时,随着时间的推移同步地运行所有测试,但在Elixir中,即使在大型服务中,也与Async测试运行相对较快。 Elixir中的另一个伟大的工具是混合,它是“带有Elixir的构建工具,并提供用于创建,编译,测试应用程序,管理其依赖项的任务。”混合允许您快速且轻松地通过MIX New,2)启动新的Elixir项目,2)通过Mix Deps.get,3)通过Mix测试运行测试,4)格式化您的代码可以轻松地进行测试通过混合格式读取和摘要。在Ruby中,这将替换为4个单独的工具:Rails新项目或模板,用于启动新项目,2)Bundler用于管理和检索依赖项,3)RSPEC用于运行测试,4)Rubocop或其他用于格式化和检查的第三方工具你的代码。这使得它非常简单且易于通过轻松获得项目和运行。
管道(|>)是轻松链接函数调用在Elixir中的好方法,类似于你将如何在Ruby中呼叫。在我知道熟悉Elixir之前,管道运营商有点混乱,但在快速介绍后,您可以轻松地发现它们并理解代码的流程。
据说,关于红宝石还有很多好事和我想念的一些事情。这些可能是过去一年中真正错过的最大两件事。
就个人而言,Ruby最伟大的事情是它周围的大量社区和资源。 Ruby于1995年开始,而Elixir是一个较新的,最初在2011年发布。Ruby和Ruby在Rails上获得了大量的用户基础,因为这有很多资源。关于Ruby的最佳事物之一是,几乎总是将永远是您想要做的内容(Gem),并且它们通常保持良好。最重要的是,有一个富豪的教程和资源来学习Ruby。具有Elixir的大痛点是较小的社区和缺乏开源库。虽然新的Elixir开发商有很多学习资源。 Core Elixir团队的大多数需要也有很多伟大的图书馆,但与其他语言相比,仍然没有很多图书馆。在BREX,我们需要为我们的特定需求或第三方服务编写许多内部ELIXIR库,或者在Elixir中没有SDK。其他一些问题是,许多以纯粹的西仙图书馆都没有得到很好的维护,经常保持休眠,或者由单个维护者维护,这使得难以及时获得更新。被称为Elixir仍然是一个相当年轻的语言,并且持续增长,希望它将改善。
猴子补丁是一种扩展或更改Ruby类的方法,包括库中,通过将代码直接写入项目中动态地进行动态。这使得令人难以置信的易于个性化或自定义图书馆功能,以便您的个人需求或修补错误作为停止间隙,直到可以修复底层库。在Elixir中,您可以使用自己的代码包装开源库以扩展或个性化,但这可能是大量的样板和额外的代码,只需添加简单的更改。通常,这也可能涉及写一种宏,只要尽可能避免。但是,这不允许您修复像猴子修补的底层库中的错误。您需要拼写一个库并使自己的变化,然后将项目指向分支以便在不等待潜在的图书馆修复这一点。