如果Java的人去斯卡拉,C#去F#,Ruby的人去哪里function涅??

我知道很多Java开发人员已经开始关注Scala,因为它运行在JVM上,许多Microsoft世界的人都在关注F#,但是Ruby作为一个自然的function性inheritance者有什么用处?

在一个纯粹的FP意义上,Ruby并不缺less任何东西,反而有些人可能会说。 一个函数式语言迫使程序员不要使用全局variables和其他习语(尽pipe可以在函数式语言中使用全局variables)

对于“函数式编程”的含义有两种截然不同的定义。 你可以在Ruby中做一个,但是你不能做另一个。

这两个定义是:

  • 编程与一stream的function和
  • 用math函数编程

您可以在Ruby中使用一stream的函数进行编程。 它支持一stream的function。 实际上,它对它们有太多的支持:有Proc.newproclambdaMethodUnboundMethod ,blocks, #to_proc->() (可能还有一些我忘了)。

所有这些行为略有不同 ,语法略有不同,行为略有不同,限制略有不同。 例如:这些语法上足够轻的可以实际使用它的唯一一个就是块。 但块有一些相当严格的限制:只能传递一个块到一个方法,块不是对象(在面向对象的语言中,“一切都是对象”是一个非常严格的限制),至less在Ruby 1.8参数还有一些限制。

提到一种方法是另一件相当尴尬的事情。 例如,在Python或ECMAScript中,我只能说baz = foo.bar来引用foo对象的bar方法。 在Ruby中, foo.bar是一个方法调用 ,如果我想引用foobar方法,我不得不说baz = foo.method(:bar) 。 如果我现在要调用这个方法,我不能只说baz() ,我必须说baz.callbaz[]或(在Ruby 1.9中) baz.()

所以,Ruby中的一streamfunction并不是一stream的。 他们比二stream的要好得多,而且他们已经够好了 ,但他们并不是一stream的。

但一般来说,Rubyists不会仅仅为了一stream的function而离开Ruby。 Ruby的支持是足够好的,你可能从另一种语言的更好的支持获得的任何好处通常被新语言的培训努力吃掉,或者被其他习惯于你现在必须放弃的东西吃掉。 比如,说RubyGems或紧密的Unix集成或Ruby on Rails或语法或…

然而,FP的第二个定义就是Ruby跌倒的地方。 如果你想在Ruby中使用math函数进行编程,那么你正处于一个痛苦的世界。 你不能使用绝大多数的Ruby库,因为它们大多数是有状态的,有效的,鼓励变异或者是不纯的。 出于同样的原因您不能使用标准库。 你不能使用核心库。 您不能使用任何核心数据types,因为它们都是可变的。 你可以说“我不在乎他们是可变的,我不会改变他们,总是复制他们”,但问题是:别人还可以改变他们。 另外,因为它们是可变的,所以Ruby不能优化复制,并且垃圾收集器不会被调整用于这种工作负载。

它只是不工作。

还有一些与函数式编程没有任何关系的特性,但大多数函数式语言都倾向于缺lessRuby。 模式匹配,例如。 在Enumerator更加积极地用于Ruby 1.9之前,懒惰也不容易实现。 还有一些东西可以用严格的Enumerable s或者Array s来工作,但是不能和懒惰的Enumerator s一起工作,尽pipe实际上没有理由要求严格。

而对于FP的这个定义,离开Ruby是绝对有道理的。

Rubyists已经涌现的两种主要语言是Erlang和Clojure 。 这些对于Ruby来说都是相当不错的匹配,因为它们都是dynamictypes的,与Ruby有着相似的REPL文化,而且(这更像是Rails的东西,而不是Ruby的东西)在networking上也是非常好的。 他们仍然是非常小的欢迎社区,原始的语言创作者仍然活跃在社区中,他们非常专注于做新的,令人兴奋和前卫的事情,所有这些都是Ruby社区所具有的特征。

在Erlang开始的时候,有人在RubyConf 2006上展示了原始的1993年的介绍video“ Erlang:The Movie ”。一些高调的Rails项目开始使用Erlang,例如PowerSet和GitHub 。 Erlang也很容易掌握Ruby,因为它不像Haskell或Clean那样纯粹。 演员的内部是非常纯粹的,但发送消息本身的行为当然是一个副作用。 另一件让Erlang易于理解的事情是,当你遵循Alan Kay的面向对象编程的定义时,Actor和Objects是同样的事情。

Clojure是Rubyist工具带的最新成员。 它的受欢迎程度大概是由于Ruby社区最终热衷于JVM≠Java并接受了JRuby的观点,然后他们开始研究JVM上其他有趣的东西。 再者,Clojure比其他函数式语言(如Haskell和其他像Scheme这样的Lisp)更实用,而且比CommonLisp更简单,更现代,所以它非常适合Rubyists。

关于Clojure的另一个很酷的事情是,因为Clojure和Ruby都运行在JVM上,所以可以它们组合起来。

“ 编程Clojure ”(Stuart Halloway)的作者是一位(前?)Rubyist, Phil Leger是Clojure的Leiningen构build工具的作者Phil Hagelberg 。

然而,Rubyists也在看Scala (作为更实用的静态types的FP语言之一)和Haskell(作为其中一个更优雅的语言)。 然后是像Scuby和Hubris这样的项目,这些项目可以让你分别将Ruby与Scala和Haskell集成在一起。 Twitter将部分低级消息传递基础设施从MySQL迁移到Ruby,然后从Ruby迁移到Scala的决定也是相当广泛的。

F#似乎并没有扮演任何angular色,可能是由于对Ruby社区所拥有的所有事物的不合理的恐惧。 (顺便提一下,考虑到F#团队一直为Mono提供版本,这似乎大部分是没有根据的。)

Java人正在JVM上使用一种语言,并希望一个function更强大的运行时兼容,所以他们去了Scala。

C#人正在CLR上使用一种语言,并希望与其运行时兼容的function更强大,因此他们将转到F#。

Ruby人正在使用一种已经非常实用的语言,他们正在使用它的许多底层运行时(JRuby,IronRuby,MRI,MacRuby,Rubinius等)。 我不认为它有一个自然的function接class人,甚至需要一个。

任何版本的Lisp都可以。

Ruby自己是一种函数式编程语言,所以我没有看到使用Ruby的FP的任何特殊的方言。

在炒作层面,Haskell。

假设Ruby人不只是去JVM自己,我认为大多数人会采用Erlang,另一种dynamictypes的语言。

Ruby不像Lisp那样function强大,但是它的function足够让你可以用一种好玩的方式做一些函数式的编程。 (不像试图在C#中进行函数式编程)

而且,它实际上会迫使你在其一些语法中使用function范例,比如大量使用块和产量。 (在学习Ruby之后我就爱上了它)。