与C#相比,您会强调Ruby的哪些语言特性?
我正在给一个.NET(C#)开发团队做一系列关于Ruby语言和环境的演讲。我把它看作是一个强调Ruby优于C的优势的机会。首先,我想在进入环境(RoR vs ASP MVC,等等)之前集中讨论语言本身。您将介绍Ruby语言的哪些特性 混合插入和多重继承与C#相比,您会强调Ruby的哪些语言特性?,c#,ruby,programming-languages,C#,Ruby,Programming Languages,我正在给一个.NET(C#)开发团队做一系列关于Ruby语言和环境的演讲。我把它看作是一个强调Ruby优于C的优势的机会。首先,我想在进入环境(RoR vs ASP MVC,等等)之前集中讨论语言本身。您将介绍Ruby语言的哪些特性 混合插入和多重继承 这在错误的人手中是危险的,但对于正确封装东西是非常有益的,而不是必须继承很多你不一定需要的东西。!这在c#4.0中不是什么问题,但有时我不得不复制整个代码块,因为(出于我的目的)具有相同API的两个相关类没有共享一个基类 还有,积木。C#有lam
这在错误的人手中是危险的,但对于正确封装东西是非常有益的,而不是必须继承很多你不一定需要的东西。!这在c#4.0中不是什么问题,但有时我不得不复制整个代码块,因为(出于我的目的)具有相同API的两个相关类没有共享一个基类 还有,积木。C#有lambdas,但Ruby的语法更漂亮,在标准库中普遍使用。它们更像是惯用Ruby的一部分,而不是惯用c#,这很重要 编辑
散列文字也值得一提。总的来说,我要强调Ruby的简洁性,以及它如何使您能够更好地表达意图,并花更少的时间让编译器满意。我刚才在一个.NET用户组上做了一次关于IronRuby的演讲,遇到了类似的问题。我关注的是:
- 鸭子打字。没有什么比List stringList=newlist()更愚蠢的了。
- 表达简洁的语法。简单的事情,比如省略括号、数组和散列文本等(结合duck类型,您可以得到
,这显然更好)。所有小事情加起来都很大string\u list=[]
- 元编程。从简单的事情开始,比如
,然后如果他们没有立即看到好处,可能会做一些更高级的事情。不要试图将编写其他程序的程序与lisp和wax进行比较。。。人们会以为你在抽烟。保持简单,并强调您不必再继续编写同样糟糕的样板代码attr\u accessor
- 作为一个好的“结局”,向他们展示一些正常的NUnit风格的测试,以及他们通常所拥有的
,然后说“这是用ruby编写的相同代码”,并向他们展示它是用rspec编写的(它的长度是原来的一半,阅读起来容易10倍……如果这样做不起作用,就什么都不会了)Assert.NotEqual blah
在他们理解Ruby之前,他们不会理解Ruby如何帮助他们。为什么不带他们经历一些玩具问题,向他们展示Ruby程序员将如何解决这些问题呢?教他们红宝石的方法。一周后,当他们看到自己遇到的问题时,其中一个会说,“天啊,我知道如何解决这个问题,但是如果我使用Ruby,它会变得简单得多……”除了其他人都说过的,开放类是Ruby的一个重要特性,值得一提:(从中偷来的示例)
我知道,但我认为向新手强调这个特性应该让他们了解Ruby背后的理念。记住要说:“孩子们,不要在家里试这个!”SO文化是这样的,我们不喜欢语言战争。“Ruby优于C#的好处”很容易让一些人感到振奋。我建议编辑要少一点主观和争议性。我不是想发动语言战争,但是我确实想得到各种各样的答案,说明是什么让一种语言(ruby)与另一种语言(C#)不同。没有什么比List stringList=new List()更愚蠢的了;我的意思是,绕过这一点就是推断,即(var x=newlist())。和+1表示更多的文字和元编程。当然类型推断很好,但它仍然局限于局部变量。我有很多类定义,其中包含List m_strings=new List(),看起来它们不会很快消失:-(^^^关键是,duck类型在ruby中随处可见。你不需要接口,等等,排除“Assert.NotEqual的混乱”,这取决于您正在使用的库,Jafar很好地解决了这个问题,这在某种程度上相当于C#的扩展方法(但在实现细节上可能有所不同)
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