瞎扯淡 前端视角下的 Ruby

lanzhiheng · 2017年06月12日 · 最后由 lanzhiheng 回复于 2020年09月25日 · 12825 次阅读
本帖已被管理员设置为精华贴

请把话筒转交给我,对 Ruby 我有一些逼要装。

image.png

在 Beansmile 做前端已经有半年多了,这件四川特产我还留着。倒不是说这件衣服布料有多好,它怎么看都更像是一个表白的工具吧?当然穿着这件衣服在外面招摇撞骗的时候,还是会有些朋友问我“Ruby 是谁?”........ 此处有乌鸦飞过

Ruby 既不是我心仪的女孩,也不是它原来的意思(红宝石)。它只是一门编程语言,一门为程序员而设计的编程语言。

问:所有编程语言不都是为程序员设计的吗?
答:错, 有些语言是为打字员设计的。比如.......我不敢说,怕遇上喷子,我不擅长吵架。

正如很多人口中所说的,程序员本应该是贪新忘旧的物种。因为他们会在坚守本分(或者有时候会忘记自己本分)的时候,关注一些与工作无关的新技术,新动向。这种情况理解起来倒有点像偷腥行为。 不过 Ruby,并不是什么新潮的编程语言,于我而言在做着前端工作的时候去玩 Ruby 倒有些再会老情人的味道。它就像陈年美酒,让人回味无穷。 好了,喝大了,得开始扯扯正题了,本文不会讲太多关于语言特性的东西,只是瞎扯自己的一些看法。

1. 可能是全世界最短的"Hello World"

谈论任何编程语言,都喜欢从"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 的优雅之处,也是一直吸引我的地方。

2. 你几乎可以做任何你想做的事情

Ruby 这门语言,给了程序员很大的权限,它允许你把事情搞砸,跟其他编程语言所持有的态度害怕你把事情搞砸有着本质的区别。我就简单地举几个例子。

(1)修改字符串

字符串是不可以修改的,似乎成了业内的共识,我所知道的能够修改字符串本身的语言似乎就只有 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 的做法,通过这些符号可以判断方法的性质。比如:用来做条件判断方法的一般会在后面加上?

(2)修改内置库

其他编程语言如 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 的魅力所在,不是吗?

3. 社区

(1)相对集中

因为社交恐惧症本人很少逛社区。不过我依然觉得偶尔去专门社区看看还是挺好的。以前写 Python 的时候,觉得 Python 的社区资源比较分散的(当然我说的是国内的),找不到一个合适的大本营。后来也就放弃了,觉得直接上 StackOverflow 都能解决手头上的问题了,没必要强迫自己去逛所谓的社区,只为了标榜自己是一个写 Python 的?

后来经我同学介绍,发现了中国居然有一个叫做Ruby China的社区。而 Ruby 的社区也就只有这一个,我觉得挺好的。业内的 Ruby 开发者还有相关学习资源几乎都集中到这里了,里面的人也相对有情怀一些,还比较热心(这里有广告嫌疑)。

中国 Ruby 社区的人一般都写 Ruby On Rails,而 Rails 这个框架也是出了名的 Ruby 技术集中点。毕竟 Ruby 的开源项目不会说特别多,但是一般都是精品。跟现在的前端圈有着鲜明的对比,Ruby 这么多年来社区的力量相对比较集中,框架少而精。而如今的前端圈大家自己看吧,琳琅满目的框架,都说是自己才是最佳实践,每次让我选择框架我就头疼。

(2)纯净

相对于前端圈来说 Ruby 社区还比较纯净一些,为什么说是纯净?业界有流传说 Lisp 社区是最纯净的社区,里面人是真的是黑客,他们真的喜欢技术。其实在中国,Ruby 社区也给我这种感觉。

就拿前端圈来说事吧?我觉得现在前端圈有点像前几年的 IOS,安卓。带来了一波热潮,如今,前端圈又是出了名的工资高,导致什么人都往里面挤。哥,你们冷静一点。你真的能静下心来好好地调样式吗,你不会还在用 IE8 吧?看着前端圈这么疯狂,我有时候会想下一波热潮是什么?我猜可能会是 Python 的大数据时代吧?现在已经很多人问我,如今 Python 的数据分析这么火,你为什么当初要转?其实我只是觉得自己样式都不会写,想来前端圈历练一下罢了。只是没想到的是,前端圈如今近乎疯狂的火热。

问题来了,什么时候技术热潮会轮到 Ruby?我希望最好不要吧。当然自己喜欢的语言被群众认可自己也会觉得自豪,不过我更不想有些抱着奇奇怪怪想法的人来污染 Ruby 社区,我希望多年后,它依然如今日这般纯净

4. 学习 Ruby 到底有什么意义

(1)Just For Fun

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?或许它会给你一种不一样的编程体验。

(2)薪资与工作机会

本来不打算谈这个,后来觉得 Ruby 社区至今还算比较纯净,似乎跟这方面有那么一点联系。

刚开始转前端的时候上慕课网搜了一下 Ruby 发现并没有什么 Ruby 教学视频,另外,培训机构也没什么 Ruby 的课程。似乎真应了我同学说的那句话“这是个资本推动的社会”。国企有钱,Java 稳定且需求量大,如今前端大火各行各业都需要这方面的人才。鉴于市场需求,各式各样的 Java,PHP,Javascript 培训班起来了。不过这也搞得现在大家对培训班可是越来越反感了,这些东西真能 30 天学会?

说实话,我并不反对培训班,只是不太喜欢现在这样的培训风气罢了。现在想起来真庆幸 Ruby 没有被市场选中,可能敢用它做后端支撑的公司并不多吧?公司少了工作机会相对也少了,薪资方面比起前端圈,PHP,Java 这些技术方向会相对低一些。现在想想真是好事。这可能也是现在 Ruby 社区还是相对纯净的原因之一吧?现在跟 Ruby 相关的培训不多,可能 Beansmile 以后会有热心的同事来做这个事情也说不定(可能是免费的),不过我觉得肯定会比某某培训机构做得出色。起码我们跟罗永浩的观念一致,我们诺言是“30 天不能精通 Ruby”,“我们不保证你找到工作”

如果真有那么一天,我想是否可以在机构上贴上当年黄埔军校的横幅

升官发财请往他处,贪生畏死勿入斯门

5. 如何学习 Ruby

干货留在最后,因为我一直觉得干货这东西用处不大,如果真有心想学,何须我提供干货?也曾被人骂说我写的文章没什么干货毫无意义。我内心却只有一个想法:“我写的文章我作主”

得益于 Ruby 社区的纯净,市面上还没有能够保证我们 30 天能够精通 Ruby 的书籍,这真的是好事。如今网上的 Ruby 书籍普遍还是比较不错的,这里我只说几本我接触过的。

(1)《Ruby 基础教程》

我有时候称它做“红宝书”,是一本很不错的 Ruby 入门书籍,里面讲解了许多 Ruby 的基础语法,你可能会因此喜欢上 Ruby。适合完全没有接触过 Ruby 的人阅读,不过现在 Ruby 官方版本已经是 2.4.X 了,可能有些语法跟书上的不兼容,大家多担待。

(2)《优雅的 Ruby》

这可以算是一本 Ruby 的进阶的读物。它会从实战角度给你一些编程上的建议,如何用最少的代码去优雅地解决问题,如何保证程序的健壮性,比较适合有 Ruby 开发经验的人阅读。这本书一买回来我看了两章后就看不下去了,对于一个没有太多 Ruby 开发经验的人来说,本书的意义并不是很大。因为你没写过 Ruby 的话,可能永远都不会遇到书上面说的情形,一方面不利于知识的吸收,另一方面里面有些解决方案只适用于 Ruby 这门语言。

(3)《Rails 指南》

这是一本电子版书籍,讲解了 Ruby 最优秀的 Web 框架 Ruby On Rails。是由 Ruby 爱好者共同翻译维护的,更新速度还算比较可观,想要入门 Rails 这是不错的选择。

(4)《Ruby 元编程》

最重要的,我放在最后了。这本书不得不提,如果你已经入门了 Ruby 觉得不过瘾,这本书绝对是不二之选。这本书不单单会介绍动态方法幽灵方法单件类猴子补丁细化等方面的元编程知识,我们能够更加深入地理解闭包这些高级概念在 Ruby 这门语言上会如何体现出来。通过学习这本书你能够更加深刻地体会 Ruby 魅力所在。

当然这也不只是一本介绍语法的书籍,书籍里面会提供一些开源项目的案例(包括 Ruby On Rails)的源码。你可能会震惊于框架的简练语法,跟反人类的代码组织方式。

6. 尾声

以上只是一个前端人员眼中的 Ruby,会显得很不专业,请谅解。对于 Ruby,我还有很多想说。但是考虑到篇幅,就此打住。

如果你是个语言控,我觉得 Ruby 是不错的选择。它能让你有不一样的编码体验。当然学了 Ruby 不能保证你月薪过万,迎娶白富美。松本行弘在设计这门语言的时候可没有帮我们考虑过薪资以及工作机会的问题。

作者以及社区对 Ruby 的定位始终都是Enjoy Programming,而不是Guaranteed Income。祝你旅途愉快!!

Happy Coding and Writing !!

其实我一直觉得 Ruby 需要除了 Rails 以外新的更为强大轮子,要不然学习 Ruby 除了脚本,Rails 以外,可以干的事情太少了,这是我觉得 Ruby 唯一让我不爽的地方。 数据分析,爬虫这些新手 Ruby 入门困难,最近在忙活这方面东西,本来想用 Ruby 来着,最后放弃了。

写的很好。 刚开始也是因为 ruby 的优雅而入坑,不过现在比较迷茫,在优雅要不要继续用 ruby 工作,因为用 ruby 的公司还是比较少的,跳槽什么的不是很方便。

Rei 将本帖设为了精华贴。 06月12日 14:28
Rei 将本帖设为了精华贴。 06月12日 14:28
Rei 将本帖设为了精华贴。 06月12日 14:28

…网一卡点了三次加精

Rei 回复

thx, Rei😃

默默点个赞😄

写得好 然后我看到了论坛一个前端 bug 手机访问 在你帖子里点目录...然后就懵逼了 整个人都目录了 也关不掉 hhh

学不学 ruby 是一回事,用不用 ruby 工作是另一件事,像我读书的时候用了几年的 ruby,算不上很好但也不差,最后工作用的还是 java。语言只是工具,怎么开心怎么来。要工作挣钱,还是得有其他的技能。当然最好还是想找 ruby 并且工资什么都 ok 的工作,毕竟既开心还能顺便挣钱。个人拙见,不喜勿喷~

14 楼 已删除

我是把 ruby 当成工具用的,parse 文本,操作数据库,写监控脚本等等,找工作语言本身无关紧要,领域知识最重要

👏👏👏

@ForrestDouble 目前为止这些东西以 python 居多,历史原因吧,ruby 还没有。 如果你有兴趣可以弄弄,首先肯定是基础框架,就是对应于 python 的 numPy 和 sciPy 库, 这些基础计算库出来以后,在上层才可以弄数据分析,deep learning 等等

p 'Hello World' 这样写才是最短的吧 😂

进入了 java 圈,看看 java 和 JS 谁更恶心

ruby 的强大之处在于脚本

非常久没有写 RUBY 了,看到这篇文章,又想起了当年自己对 RUBY 狂热的“爱”,谢谢楼主,这篇文章的链接我要转给我认识所有 ruby 开发者

317583395 回复

thank you

Ruby 社区的人一般都写 Ruby On Rails

建议改为 中国 Ruby 社区的人一般都写 Ruby On Rails.

国外,我觉得 Ruby 社区和 Rails 社区还是有点分割线的吧?

zw963 回复

thx updated

配图不错

语言只是一种工具,语言之间也会有想通之处,掌握一门语言后,学其他也不会很难

写 ruby 是很爽,但 ruby 的热潮其实十年前才是鼎盛的。自从移动互联网兴起,后端收窄成为借口服务提供者,Rails 这种一站式的优势就没撒意义了,反而 ruby 的性能完全会带来麻烦。而收窄的模式进一步扩展到 Web,前后端彻底开始往分离的方向走了。抛开此种分离模式到底是好是坏不谈,但确实 rails 的很多强项没了用武之地。

工作能力不在乎用什么工具,关键是对事物的理解。

317583395 回复

同,转前端三四年了,很久没写 Ruby 了

「修改字符串」這個我覺得沒啥用,而且宮本好像也發現了,所以他說 Ruby 3 裡面要默認所有的字符串都是 freeze 的。

另外 Ruby 有兩點點我很喜歡的(相對於 Python):

  1. 優秀的工具鏈。Bundler 是「依賴管理工具」的先鋒(並且依然是最優秀的);後續的其他依賴管理方式都有大量借鑑 Bundler,比如 Rust 的 Cargo,JavaScript 的 Yarn,Dart 的 Pub,等等。Python 的 pip 比起來就差多了,唯一的希望就在於 pip-tools 了。我唯一不認同 Bundler 的是,他不應該用來管理 Ruby 版本。Ruby 版本應該是先於 Bundler 的,否則會形成循環依賴。但作為補償,chruby 是我用過(rbenv,RVM,pyenv,nvm)的所有版本管理器裡面,最喜愛的,沒有之一。

  2. 內置方法(built-in method)比 Python 更「面向對象」。比如說 Python 裡面「類型轉換」是 int('3')str(4) 的形式,Ruby 裡面則是 '3'.to_i4.to_s;還有「排序」,Python 是 sorted(arr),Ruby 是 arr.sort。當需要進行多次轉換、調用,Python 需要函數嵌套,Ruby 則是 method chaining,而我認為「函數嵌套」更「面向過程」,method chaining 更「面向對象」。

franklinyu 回复

第一点用的不多,不好发言。第二点,我感受到了,Ruby 确实是真正做到了一切都是对象。Python 里面除了类 (class),还有你所提到的类型 (type)。🐭

想问下前端的话现在要掌握哪些知识啊,现在主要做企业的网站开发,不知道学什么框架,还有哪些知识要学,想把网站做的好看酷炫

nicetyler 回复

主要还是 HTML + CSS + Javascript 吧,我也很少看框架。框架的而话 Vue 会比较简单一些。

前端热因为前段容易入门啊

lanzhiheng 回复

我在那段話裡面沒有特意區分類和類型,反正在 Ruby 裡面都是一個東西。不過 class 和 type 的區別是不是只有 Python 2 有?Python 3 我記得都是 object 了。

franklinyu 回复

Python3 我用得不多,我记得确实有些地方会比 Python2 规范一些。至于还有没有 type 跟 class 的区别我就不清楚了。

nicetyler 回复

我不怎麼寫前端,但是感覺前端框架不是主要問題,主要是設計:什麼樣子的網站才能稱得上「好看酷炫」……

发现一名 python 的叛徒!~~开个玩笑

一直在用 python 所以也没好好学 ruby, 毕竟 python 能做的事要多点。ruby 似乎更集中在 web 开发上。

不过现在主要都在写前端,写 javascript 了。很少有机会写 python , 也更没机会用 ruby 了。

bigzhu 回复

ruby 适合写 RESTful API 吗

...首先想纠正一点理解错误: Python2 里 print 可以不加括号是因为 print 根本不是函数…………是语句 而函数调用都是需要加括号的……所以这不一致导致了坑……而且是 Python2 坑,不是 Python3 坑……

kabie 回复

明白,是我对 Python 理解太浅薄

说实在,ruby 是我读大学那会最喜欢的语言,一直到现在也是,但是迫于工作,无奈,现在用的都是 python,但我还是经常到 rc 这片净土来逛逛

destinyjingkun 回复

这也是没办法的事情。Ruby 的工作毕竟太少。

45 楼 已删除
ForrestDouble 回复

爬虫用em-http-request就可以,我自己在它的基础上也封装了一个list_spider😁

同感。

希望 ruby 保持小众、干净、高质量、锋利、创新的感觉。

同为前端不喜欢前端大染缸。太乱了。

Mark24 回复

哈哈,是啊。ruby 这边比较务实吧。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号