与C#相比,您会强调Ruby的哪些语言特性?

6

我将给一支.NET (C#)开发团队做一系列讲座,主题是关于Ruby语言和环境。我会把这次机会看作是强调Ruby相对于C#的优势。首先,我想集中讨论语言本身,然后再进入环境(RoR vs ASP MVC等)。你会涉及哪些Ruby语言特性呢?


SO的文化是我们不喜欢语言之争。"Ruby相对于C#的优势"可能会激起一些人的情绪。我建议进行编辑,使其更加客观和不带争议。 - Robert S.
我并不想引发语言之争,但我想得到各种答案,了解是什么使一种语言(如Ruby)与另一种语言(如C#)不同。 - jsmorris
5个回答

10

我之前在一个.NET用户组做了一个关于IronRuby的演讲,遇到了类似的问题。我关注的重点是:

  • 鸭子类型。没有什么比List<string> stringList = new List<string>()更愚蠢的了;

  • 表达简洁。例如省略括号、数组和哈希字面量等简单的东西(再加上鸭子类型,你可以得到更好的代码:string_list = [])。所有这些小细节一起产生了很大的影响。

  • 元编程。从简单的东西开始,比如attr_accessor,然后再尝试一些高级的东西,如果他们并不立即看到好处的话。不要试图将事物与Lisp进行比较,并且反复强调 你不再需要不停地编写相同的糟糕的样板代码。保持简单明了。

  • 作为一个很好的“结局”,向他们展示一些通常具有混乱的Assert.NotEqual<string> blah的常规NUnit测试,然后说“这里是用Ruby编写的相同代码”,并展示使用rspec编写的代码(它的长度只有一半,阅读起来也容易10倍……如果这还不能说服他们的话,那就没有什么能说服他们了)。


没有比这个更愚蠢的东西了:List<string> stringList = new List<string>(); <-- 这不是鸭子类型,而是类型推断。 - MichaelGG
我的意思是,绕过这个的方法就是推断,即(var x = new List<string>())。还有更多的文字和元编程+1。 - MichaelGG
类型推断确实很棒,但它仍然局限于本地变量。我有许多包含List<string> m_strings = new List<string>()的类定义,它们看起来不会很快消失 :-( - Orion Edwards
重点是,Ruby 中的鸭子类型可以在任何地方使用。您不需要接口等。 - Orion Edwards
关于“Assert.NotEqual<string> blah”的混乱,这取决于您使用的库。Jafar解决了这个问题,做得非常好。 http://themechanicalbride.blogspot.com/2009/06/better-unit-tests-with-testassert-for.html - BlackTigerX

5
我把这看作是一个展示 Ruby 相对于 C# 的优势的机会。然而,如果你的演讲口吻是:“Ruby 很酷,因为你可以用它做 x! ”,那么你的 C# 听众很快就会失去兴趣。他们可能会回答:“如果我们想模拟 x,我们也可以在 C# 中实现它,但我们的设计中并没有太多用途。” 或者,“如果你觉得你需要做 x,那么你就错了!” 他们不会理解 Ruby 如何帮助他们,除非他们真正理解了 Ruby。为什么不通过一些玩具问题来向他们展示一个 Ruby 程序员如何解决问题呢?教他们 Ruby 的方式。一周后,当他们遇到一个问题时,其中一个人可能会说:“哎呀,我知道如何解决这个问题,但如果我使用 Ruby,这将变得更加容易....”

4
鸭子类型!在c# 4.0中,这将不再是一个问题,但有时我不得不复制整个代码块,因为两个相关的类具有(对于我的目的)相同的API,却没有共享基类。
另外,块。C#有lambda,但Ruby的语法更漂亮,并且它们在标准库中广泛使用。它们比习惯用的c#更多地成为了习惯用的Ruby的一部分,这很重要。 编辑
哈希字面量也值得一提。总的来说,我会强调在Ruby中你可以做到多么简洁,这使你能够更好地表达意图,并花费更少的时间来让编译器满意。

1
除了其他人已经说过的内容之外,Ruby的一个重要特性值得一提,那就是开放类(Open Classes):(例子来自Ruby From Other Languages
class Fixnum
  def hours
    self * 3600 # number of seconds in an hour
  end
  alias hour hours
end

# 14 hours from 00:00 January 1st
# (aka when you finally wake up ;)
Time.mktime(2006, 01, 01) + 14.hours # => Sun Jan 01 14:00:00

我知道,应该避免像猴子一样打补丁,但我认为向新手介绍这个功能可以让他们了解 Ruby 背后的哲学。只要记得说:“孩子们,在家不要尝试这个!


嗯,有点类似于C#的扩展方法(但在实现细节上可能有所不同)。 - niceman

1
混入和多重继承。
如果被不懂得使用的人拿到手里,它是危险的。但对于正确封装事物来说,它非常有益,相比于必须继承许多不一定需要的东西。

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