请把话筒转交给我,对 Ruby 我有一些逼要装。
在 Beansmile 做前端已经有半年多了,这件四川特产我还留着。倒不是说这件衣服布料有多好,它怎么看都更像是一个表白的工具吧?当然穿着这件衣服在外面招摇撞骗的时候,还是会有些朋友问我“Ruby 是谁?”........ 此处有乌鸦飞过。
Ruby 既不是我心仪的女孩,也不是它原来的意思(红宝石)。它只是一门编程语言,一门为程序员而设计的编程语言。
问:所有编程语言不都是为程序员设计的吗?
答:错, 有些语言是为打字员设计的。比如.......我不敢说,怕遇上喷子,我不擅长吵架。
正如很多人口中所说的,程序员本应该是贪新忘旧的物种。因为他们会在坚守本分(或者有时候会忘记自己本分)的时候,关注一些与工作无关的新技术,新动向。这种情况理解起来倒有点像偷腥行为。 不过 Ruby,并不是什么新潮的编程语言,于我而言在做着前端工作的时候去玩 Ruby 倒有些再会老情人的味道。它就像陈年美酒,让人回味无穷。 好了,喝大了,得开始扯扯正题了,本文不会讲太多关于语言特性的东西,只是瞎扯自己的一些看法。
谈论任何编程语言,都喜欢从"Hello World"讲起,今天以前端程序员的身份来谈 Ruby,我也先从"Hello World"谈起吧。Ruby 的"Hello World"其实很简单,就一句话。
p "Hello World"
我猜应该很难找到比这更简练的版本了吧。这个时候有人会提到 Python 跟 Javascript*,由于要限制篇幅,我就不贴 Java 的"Hello World"了,不然会被骂成凑字数的*。
Python 的是这样的
print "Hello World"
Javascript
console.log("Hello World")
确实也足够简练,不过兄弟,这是 Python2 的写法了,Python3 之后就强制把所有的函数调用都加上括号了。也就是
print("Hello World")
说实话,我刚开始学 Python 也被这个给坑过,因为当时我觉得不需要加括号就能调用方法,太酷了,果断入坑。后来写了一年的 Python,才发现,在 Python 里面除了打印语句在内的极其个别的方法(或者说函数)不需要用括号来调用之外,其他的方法调用都需要加括号。现在想想如果那时候我能早点了解 Ruby,可能我就不会写 Python 了。
Ruby 的方法调用括号是可选的,这是亮点也是槽点,有些人觉得这样子代码可读性就不够高了,但是我个人觉得这样真的很酷。Ruby 社区的程序员考虑到代码可读性的事情,会建议如果方法调用是带参数的话,最好加上括号,如:
[3] pry(main)> "Ruby".methods.grep(/str/) # 获取字符串对象的所有方法,检索出能够匹配正则表达式的方法名
=> [:rstrip, :strip!, :rstrip!, :strip, :lstrip!, :lstrip, :to_str]
这就是 Ruby 的方法链,"Ruby"
是字符串实例,调用了String#methods
方法后以数组形式返回方法名,再调用返回数组对象的Array#grep
方法。在该省略掉括号的时候可以省略掉,是 Ruby 的优雅之处,也是一直吸引我的地方。
Ruby 这门语言,给了程序员很大的权限,它允许你把事情搞砸,跟其他编程语言所持有的态度害怕你把事情搞砸有着本质的区别。我就简单地举几个例子。
字符串是不可以修改的,似乎成了业内的共识,我所知道的能够修改字符串本身的语言似乎就只有 C,C++。诡异的是 Ruby 允许你这样做
[11] pry(main)> str = "Ruby"
=> "Ruby"
[12] pry(main)> str.reverse
=> "ybuR"
[13] pry(main)> str
=> "Ruby"
[14] pry(main)> str.reverse!
=> "ybuR"
[15] pry(main)> str
=> "ybuR"
可见,使用带感叹号的方法去翻转字符串的时候,除了会返回一个处理过的字符串副本以外,还会改变字符串本身。它还提供了一个不带感叹号的版本,这个版本只返回处理后的副本,不修改字符串本身。另外你有没有发现,Ruby 的方法命名是可以带像?!
这样的特殊符号的,据说这是参考的 Lisp 的做法,通过这些符号可以判断方法的性质。比如:用来做条件判断方法的一般会在后面加上?
。
其他编程语言如 Python,不会允许我们对它内置的库进行修改。当我我想修改字符串这个类的某个方法,我只能通过继承的方式,然后在新类重写对应的方法。而 Ruby 并没有给我们强加这种限制,它允许我们直接修改内置库。
我就选择 String#reverse
方法这个方法作个尝试好了。我们可以用下面的方式重新打开类,然后重新定义对应的方法。
[25] pry(main)> class String
[25] pry(main)* def reverse
[25] pry(main)* "Hello World"
[25] pry(main)* end
[25] pry(main)* end
=> :reverse
这样,我以后就算对使用字符串字面量创建的对象调用String#reverse
方法的时候都会返回同样的值了
[26] pry(main)> "lan".reverse
=> "Hello World"
[27] pry(main)> "cool".reverse
=> "Hello World"
这样一看确实很危险,但也是 Ruby 较为人性化的一面,给你一把刀至于怎么用还是要看你自己。甚至还可以把给类名赋值,让它丧失原来的功能,引发整个系统的崩溃。
[1] pry(main)> String = 1
(pry):1: warning: already initialized constant String
=>
(pry) output error: #<TypeError: can't define singleton>
[2] pry(main)> "lan".reverse
SystemStackError: stack level too deep
from /Users/lan/.rvm/gems/ruby-2.3.1/gems/pry-0.10.4/lib/pry/command.rb:178:in `command_regex'
往 String
这个类名(其实它是个常量)附上一个值之后,它就代表 1 了,这样所有依赖于String
类的库都会失效,可见整个解释器环境都不能用了。总的来说Ruby 的编程方式跟其他语言会有所不同,你可能不小心会把一些重要的功能库改掉,引发不知名的 Bug。不过这也正是 Ruby 的魅力所在,不是吗?
因为社交恐惧症本人很少逛社区。不过我依然觉得偶尔去专门社区看看还是挺好的。以前写 Python 的时候,觉得 Python 的社区资源比较分散的(当然我说的是国内的),找不到一个合适的大本营。后来也就放弃了,觉得直接上 StackOverflow 都能解决手头上的问题了,没必要强迫自己去逛所谓的社区,只为了标榜自己是一个写 Python 的?
后来经我同学介绍,发现了中国居然有一个叫做Ruby China的社区。而 Ruby 的社区也就只有这一个,我觉得挺好的。业内的 Ruby 开发者还有相关学习资源几乎都集中到这里了,里面的人也相对有情怀一些,还比较热心(这里有广告嫌疑)。
中国 Ruby 社区的人一般都写 Ruby On Rails,而 Rails 这个框架也是出了名的 Ruby 技术集中点。毕竟 Ruby 的开源项目不会说特别多,但是一般都是精品。跟现在的前端圈有着鲜明的对比,Ruby 这么多年来社区的力量相对比较集中,框架少而精。而如今的前端圈大家自己看吧,琳琅满目的框架,都说是自己才是最佳实践,每次让我选择框架我就头疼。
相对于前端圈来说 Ruby 社区还比较纯净一些,为什么说是纯净?业界有流传说 Lisp 社区是最纯净的社区,里面人是真的是黑客,他们真的喜欢技术。其实在中国,Ruby 社区也给我这种感觉。
就拿前端圈来说事吧?我觉得现在前端圈有点像前几年的 IOS,安卓。带来了一波热潮,如今,前端圈又是出了名的工资高,导致什么人都往里面挤。哥,你们冷静一点。你真的能静下心来好好地调样式吗,你不会还在用 IE8 吧?看着前端圈这么疯狂,我有时候会想下一波热潮是什么?我猜可能会是 Python 的大数据时代吧?现在已经很多人问我,如今 Python 的数据分析这么火,你为什么当初要转?其实我只是觉得自己样式都不会写,想来前端圈历练一下罢了。只是没想到的是,前端圈如今近乎疯狂的火热。
问题来了,什么时候技术热潮会轮到 Ruby?我希望最好不要吧。当然自己喜欢的语言被群众认可自己也会觉得自豪,不过我更不想有些抱着奇奇怪怪想法的人来污染 Ruby 社区,我希望多年后,它依然如今日这般纯净。
I hope to see Ruby help every programmer in the world to be productive, and to enjoy programming, and to be happy. That is the primary purpose of Ruby language.
这句话是 Ruby 的作者松本行弘说的。发明 Ruby 是为了让开发者更快乐,更高产。
没错就是照片里面的日本人,可别以为日本只擅长小电影。
写过一点 Ruby 的人可能会就能体会到 Ruby 元编程的强大。我之前举的例子只是它很小的一部分特性。它的内省机制异常强大,得益于此我们可以通过代码来写代码,通俗点来说这叫做元编程,我们可以编写代码的代码。这种机制在某种程度上会导致程序运行相对缓慢,但是请谅解,Ruby 设计的初衷跟 Go 这种支持系统级编程的语言本来就不一样。让解释性语言跟编译型语言 PK 性能,会不会有那么点不厚道呢?
如果你平时觉得自己的工作充满了复制粘贴,想下班的时候找点乐子,不妨试试 Ruby?或许它会给你一种不一样的编程体验。
本来不打算谈这个,后来觉得 Ruby 社区至今还算比较纯净,似乎跟这方面有那么一点联系。
刚开始转前端的时候上慕课网搜了一下 Ruby 发现并没有什么 Ruby 教学视频,另外,培训机构也没什么 Ruby 的课程。似乎真应了我同学说的那句话“这是个资本推动的社会”。国企有钱,Java 稳定且需求量大,如今前端大火各行各业都需要这方面的人才。鉴于市场需求,各式各样的 Java,PHP,Javascript 培训班起来了。不过这也搞得现在大家对培训班可是越来越反感了,这些东西真能 30 天学会?
说实话,我并不反对培训班,只是不太喜欢现在这样的培训风气罢了。现在想起来真庆幸 Ruby 没有被市场选中,可能敢用它做后端支撑的公司并不多吧?公司少了工作机会相对也少了,薪资方面比起前端圈,PHP,Java 这些技术方向会相对低一些。现在想想真是好事。这可能也是现在 Ruby 社区还是相对纯净的原因之一吧?现在跟 Ruby 相关的培训不多,可能 Beansmile 以后会有热心的同事来做这个事情也说不定(可能是免费的),不过我觉得肯定会比某某培训机构做得出色。起码我们跟罗永浩的观念一致,我们诺言是“30 天不能精通 Ruby”,“我们不保证你找到工作”。
如果真有那么一天,我想是否可以在机构上贴上当年黄埔军校的横幅
升官发财请往他处,贪生畏死勿入斯门
干货留在最后,因为我一直觉得干货这东西用处不大,如果真有心想学,何须我提供干货?也曾被人骂说我写的文章没什么干货毫无意义。我内心却只有一个想法:“我写的文章我作主”。
得益于 Ruby 社区的纯净,市面上还没有能够保证我们 30 天能够精通 Ruby 的书籍,这真的是好事。如今网上的 Ruby 书籍普遍还是比较不错的,这里我只说几本我接触过的。
我有时候称它做“红宝书”,是一本很不错的 Ruby 入门书籍,里面讲解了许多 Ruby 的基础语法,你可能会因此喜欢上 Ruby。适合完全没有接触过 Ruby 的人阅读,不过现在 Ruby 官方版本已经是 2.4.X 了,可能有些语法跟书上的不兼容,大家多担待。
这可以算是一本 Ruby 的进阶的读物。它会从实战角度给你一些编程上的建议,如何用最少的代码去优雅地解决问题,如何保证程序的健壮性,比较适合有 Ruby 开发经验的人阅读。这本书一买回来我看了两章后就看不下去了,对于一个没有太多 Ruby 开发经验的人来说,本书的意义并不是很大。因为你没写过 Ruby 的话,可能永远都不会遇到书上面说的情形,一方面不利于知识的吸收,另一方面里面有些解决方案只适用于 Ruby 这门语言。
这是一本电子版书籍,讲解了 Ruby 最优秀的 Web 框架 Ruby On Rails。是由 Ruby 爱好者共同翻译维护的,更新速度还算比较可观,想要入门 Rails 这是不错的选择。
最重要的,我放在最后了。这本书不得不提,如果你已经入门了 Ruby 觉得不过瘾,这本书绝对是不二之选。这本书不单单会介绍动态方法
,幽灵方法
,单件类
,猴子补丁
,细化
等方面的元编程知识,我们能够更加深入地理解闭包这些高级概念在 Ruby 这门语言上会如何体现出来。通过学习这本书你能够更加深刻地体会 Ruby 魅力所在。
当然这也不只是一本介绍语法的书籍,书籍里面会提供一些开源项目的案例(包括 Ruby On Rails)的源码。你可能会震惊于框架的简练语法,跟反人类的代码组织方式。
以上只是一个前端人员眼中的 Ruby,会显得很不专业,请谅解。对于 Ruby,我还有很多想说。但是考虑到篇幅,就此打住。
如果你是个语言控,我觉得 Ruby 是不错的选择。它能让你有不一样的编码体验。当然学了 Ruby 不能保证你月薪过万,迎娶白富美。松本行弘在设计这门语言的时候可没有帮我们考虑过薪资以及工作机会的问题。
作者以及社区对 Ruby 的定位始终都是Enjoy Programming,而不是Guaranteed Income。祝你旅途愉快!!