瞎扯淡 前端视角下的 Ruby

lanzhiheng · 发布于 2017年06月12日 · 最后由 lanzhiheng 回复于 2017年08月11日 · 7146 次阅读
744a59
本帖已被设为精华帖!

请把话筒转交给我,对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 !!

共收到 38 条回复
28931

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

23315

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

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

…网一卡点了三次加精

3
23315dearest 回复

我这么看,水平达到某个 level 之后,你肯定不会仅仅掌握一门语言,而跳槽取决于你的综合能力,另外一个角度,掌握一门跳槽方便的语言未必是件好事。

744a59
1Rei 回复

thx, Rei😃

23315

@lgn21st 谢谢指点

65e0a2

默默点个赞😄

744a59
65e0a2iamzephyr 回复

thx

11562

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

96

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

14楼 已删除
254

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

269

👏👏👏

744a59
32Kylelkh 回复

同意

96

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

14823

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

24996

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

17671

ruby的强大之处在于脚本

8886

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

744a59
8886317583395 回复

thank you

1031

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

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

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

744a59
1031zw963 回复

thx updated

96

配图不错

15999

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

6224

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

5023

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

3845
8886317583395 回复

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

96

「修改字符串」這個我覺得沒啥用,而且宮本好像也發現了,所以他說 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 更「面向對象」。

744a59
32franklinyu 回复

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

A44eb4

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

744a59
A44eb4nicetyler 回复

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

96

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

96
744a59lanzhiheng 回复

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

744a59
32franklinyu 回复

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

96
A44eb4nicetyler 回复

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

7ddd37

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

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

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

Ae6f9e
7ddd37bigzhu 回复

ruby 适合写RESTful API吗

2474

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

744a59
2474kabie 回复

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

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