我需要了解哪些Ruby知识?

26
我刚刚发现了我应该具备哪些C#知识?的问题,并且对于Ruby也有同样的疑问。 我认为Ruby是我最喜欢的编程语言,除了学习基础知识外,至少从众多Ruby on Rails项目和一些Ruby脚本中学到的内容,我还尝试通过阅读博客(如GluttonousO'Reilly RubyOla BiniPolishing Ruby)来学习。 我也阅读过像The Ruby Way这样的书籍。
然而,在面试我的Ruby技能时,我并没有感到完全准备好。 有一次有人问我是否了解闭包,起初我回答说我不知道,但后来我问面试官是否指的是代码块,比如lambda和do...end,他是这个意思。 我怎么会在学习Ruby三年并试图学习这种语言的过程中,没有学到闭包=代码块的知识呢?

那么,作为一名Ruby程序员,你应该具备哪些关于Ruby语言的知识呢?作为一名Ruby职位面试官,你会期望我掌握什么呢?只需列出一些主题,我会自行阅读学习。如果你认为必要,也可以列出像Ruby on Rails、Rake、Rack等Ruby特定工具。

6个回答

61

这只是我的个人想法,我确定我漏掉了很多东西。除了这里提到的事情,当然理解编程和面向对象编程是必须的。

一些重要的语言特性:

  • 认识到在Ruby中一切都是表达式,并能够应用该原则,即使您认为它会使您的代码难以阅读。
  • 闭包被提及;我还希望Ruby程序员知道块与procs(和lambdas)之间的差异,并知道如何在它们之间进行转换。在我看来,精通闭包对于编写优美的Ruby代码非常重要。
  • 运算符重载:知道在对象上定义名为[][]===+<<等方法时会发生什么。
  • 熟练掌握ArrayEnumerableHash的大多数实例方法(即使您不知道确切的定义)。如果您不在适当的位置使用collectinjectjoinzip等方法,您的Ruby代码将变得非常冗长。
  • 充分了解符号是什么,以及何时应该使用/避免它们。
  • 了解元类是什么,知道类变量类实例变量之间的区别。
  • 知道在Ruby中如何使用对象属性,如何使用attr_accessor等方法定义属性,以及如何自己定义属性。
  • 能够使用模块,既可以作为混入,也可以作为命名空间工具。您还应该了解如何混入实例方法和类方法(或能够弄清楚如何做到)。
  • 掌握 raise/rescuethrow/catch 的区别,并且能够正确使用。
  • 了解元编程的工作原理,至少对所有允许进行元编程的方法有基本的概念(大多数在类ModuleObject中隐藏)。
  • 能够使用Hash方法参数代替命名参数(即使只是因为这是一种常见模式)。
  • 了解Ruby中的并发性如何工作和不工作。
  • 即使它们很少使用,也要了解Continuations
  • 一些重要的工具:

    • 知道并理解Ruby gems
    • 以及rake
    • 以及RDoc
    • 以及YAML

    一些框架的知识:

    • 了解基本的Rails知识将会很有用,即使只是因为外界有时似乎不知道Rails和Ruby之间的区别。
    • 知道除Rails之外还有其他Web框架:Merb、Sinatra、Camping等。

    最终,请记住以上是“知识”而不是技能。如果您不熟悉这些内容,那么学习它们可能很容易。


    非常好的回答 - 你几乎涵盖了我想到的所有内容。 - Barry Gallagher
    很棒的清单,谢谢!我最好开始行动了。 - Dan Rosenstark

    15

    如果您是一名真正的程序员而不是学术界人士,那么您可能可以通过阅读 Ruby 语言的创建者 Yukihiro Matsumoto 所写的《Ruby 编程语言》来弥补由此产生的知识缺口。该书涵盖了很多晦涩难懂的细节,例如在不同类型的 lambda 中进行多个赋值时的种种变幻莫测的细节,并且相对较新,介绍了 Ruby 1.9 中的新语义。

    我的一个老板曾经告诉我,他认识并信任的一位长期从事编程的程序员曾经问他:“我忘了……字节里有多少位?” 这个故事的寓意并不是说这个人是白痴——有时候,长时间编写出色的代码,也会错过其他人看来应该是基础中的基础的东西。


    说得好。一个人可以专注于需要完成的事情或学术问题。好观点! - James Testa

    9

    在@molf的列表中,我想补充以下内容:

    DSL(领域特定语言) - 如何使用它们以及如何编写它们。深入挖掘rake和capistrano的内部可对此非常有用。

    Rack - 使用Ruby(而不是Python)进行Web应用程序的关键优势。了解为什么这是优势、它是如何工作的以及通常如何使用。

    消息传递 vs. 函数调用 - Ruby相对于Java等其他语言的另一个关键优势。使用method_missing及其如何使ActiveRecord和DSL成为可能。


    1
    对于最后一点加上“+1”。实际上,所有的点都要加。 - Swanand

    7
    闭包(要了解它们的作用域)、特异类(或元类,或者你想怎么称呼它们)、混入(包括 include 和 extend 以及所有你能做的愚蠢技巧)和元编程是 Ruby 特有的东西。标准面向对象和函数式编程技术也是公平竞争的领域。

    3

    听起来你正在寻找一些通用的理论。我最近没有读过任何相关书籍,但是一本关于编程语言原则的书可能会有所帮助(寻找一本涵盖面向对象和函数式语言的书)。

    另外,你可能会发现研究Rails或Rake的工作原理(而不仅仅是如何使用它们)很有启发性。这可能会帮助你更深入地了解Ruby的功能。


    2

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接