虽然打算把自己的一个开源项目移植到erlang,但手头的一个工作项目却是在用ruby on rails,花了一段时间了解ruby后,发现ruby还是有点意思的。(反倒是不太喜欢Rails。我喜欢直来直去的编程,rails里面太多的magic,实在让我这个喜欢刨根究底的人难受)。
回到主题,Ruby之所以比Python、groovy和Javascript更适合函数风格的编程,尤其是erlang风格,主要因为以下几点:
- everything is message(也即任何语句都会返回值)
- may return multiple values(可以返回多值)
- parallel assignment(并行赋值)
让我们看几个例子:
例一、
命令式风格:
ruby 代码
- cond = {}
- if par[:id]
- feed = Feed.find(par[:id])
- if feed
- cond[:feed] = feed.id
- end
- end
- if par[:m]
- limit = par[:m].to_i
- else
- limit = 20
- end
- if limit >= 4096
- limit = 4096
- end
- cond[:limit] = limit
- if par[:d]
- days = par[:d].to_f
- if days <= 0 || days >= 365
- days = 365
- end
- cond[:time] = Time.now - days*86400
- end
函数时风格:
ruby 代码
- cond = {
- :feed => if par[:id]
- feed = Feed.find(par[:id])
- feed ? feed.id : nil
- end,
- :limit => begin
- limit = par[:m] ? par[:m].to_i : 20
- limit >= 4096 ? 4096 : limit
- end,
- :time => if par[:d]
- days = par[:d].to_f
- days = days <= 0 || days >= 365 ? 365 : days
- Time.now - days * 86400
- end,
- }.delete_if { |k, v| v.nil? }
注意15行删nil项,因为在一个if .. end子句中,总会返回一个值,在不满足所有条件的情况下,就是返回nil
例二
命令式风格:
ruby 代码
- if f[:mode] == "rss"
- rss = f[:feed]
- params[:feed][:channel] = rss.channel.title
- params[:feed][:description] = rss.channel.description
- params[:feed][:link] = rss.channel.link
- params[:feed][:copyright] = rss.channel.copyright
- else
- atom = f[:feed]
- params[:feed][:channel] = atom.title
- params[:feed][:description] = atom.subtitle
- params[:feed][:link] = atom.links.join
- params[:feed][:copyright] = atom.rights
- end
函数式风格:
ruby 代码
- params[:feed][:channel],
- params[:feed][:description],
- params[:feed][:link],
- params[:feed][:copyright] = if f[:mode] == "rss"
- rss = f[:feed]
- a, b, c, d = rss.channel.title,
- rss.channel.description,
- rss.channel.link,
- rss.channel.copyright
- else
- atom = f[:feed]
- a, b, c, d = atom.title,
- atom.subtitle,
- atom.links.join,
- atom.rights
- end
或者:
ruby 代码
- params[:feed][:channel],
- params[:feed][:description],
- params[:feed][:link],
- params[:feed][:copyright] = if f[:mode] == "rss"
- rss = f[:feed]
-
- [rss.channel.title,
- rss.channel.description,
- rss.channel.link,
- rss.channel.copyright]
- else
- atom = f[:feed]
-
- [atom.title,
- atom.subtitle,
- atom.links.join,
- atom.rights]
- end
函数式风格的好处是,如果这一段代码只是为了给某几个变量赋值,那么函数式的写法一目了然,副作用也变得尽在掌控中。而命令式风格则没那个好处了。
说明:
1、并行赋值的重要性主要在于让处理分支中的多变量赋值时方便,否则例二中的情况就很难用函数式风格处理了
2、例二中的a,b,c,d当然可以直接用[]括起来处理(如上),但我用abcd也是为了让代码一目了然,个人感觉而已。
分享到:
- 2007-02-05 20:14
- 浏览 10296
- 评论(11)
- 论坛回复 / 浏览 (11 / 21733)
- 查看更多
相关推荐
5. 支持多种编程范式:除了面向对象,Ruby还支持函数式、命令式和过程式编程,这使得开发者可以根据需求选择合适的编程风格。 6. 标准库丰富:Ruby的标准库包含了大量实用的模块和类,如HTTP客户端、正则表达式处理...
- **多范式支持**: 支持面向对象、过程式和函数式编程风格,开发者可以根据项目需求选择最适合的方式。 #### 三、Ruby的应用场景 - **Web开发**: 特别是与Ruby on Rails框架结合,可以快速构建高效且功能丰富的Web...
此外,Ruby的元编程能力使得代码能自我描述和自我修改,为实现函数式编程风格提供了可能。在Ruby中,学生将探索如何在面向对象的语言中融合函数式编程的思想,以及如何在实际开发中利用这些概念提高代码的简洁性和...
在Ruby编程语言中,函数式编程是一种编程范式,它强调使用无副作用的纯函数来构建软件。这种编程风格能够帮助开发者写出更加清晰、可预测且易于测试的代码。"函数式-确定性-Ruby取笑___下载.zip"这个文件名暗示了...
Ruby是一种动态类型语言,支持面向对象编程、函数式编程等多种编程范式。它具有以下特点: - **简洁易读**:Ruby语法简洁明了,易于阅读和理解。 - **动态性**:支持运行时修改代码结构。 - **面向对象**:一切皆...
3. **函数式编程**:虽然Ruby主要被视为面向对象的语言,但它也支持函数式编程风格,如使用map、reduce等函数进行数据处理。 4. **多重继承**:Ruby支持多重继承,一个类可以从多个父类继承属性和方法,从而增强了...
Lambda表达式提供了一种更严格的块定义方式,类似于函数,这在编写函数式风格的代码时特别有用。 《Programming Ruby》还深入探讨了Ruby的库和框架,如ActiveRecord(用于数据库操作)、Test::Unit(单元测试框架)...
总之,Ruby-Functo是Ruby开发中的一个重要工具,尤其对于那些喜欢函数式编程风格的开发者来说,它提供了一套强大的工具集,用于构建可组合、可重用的方法对象,提升了代码的可读性和维护性。通过熟练掌握Functo,...
Ruby还支持闭包,这是一种强大的工具,可以捕获和存储当前环境的变量,这在函数式编程中尤其有用。 "不墨迹,大量练习"是该教程的一大特点。学习编程不仅仅是理论知识的积累,更重要的是动手实践。书中的每个小节...
- **多范式支持**:Ruby支持面向对象编程、函数式编程等多种编程风格。 #### 三、Ruby编程书籍推荐——《Programming Ruby》 《Programming Ruby》被誉为是最好的Ruby编程书籍之一,它不仅详尽地介绍了Ruby语言的...
4. 块和闭包:Ruby中的块是一段可以被传递、存储和执行的代码,与闭包紧密相关,支持函数式编程风格。 5. 自动内存管理:Ruby采用垃圾回收机制,自动处理内存分配和释放,减少了内存泄漏的风险。 6. 标准库:Ruby...
尽管Ruby主要被归类为面向对象语言,但它也支持函数式编程风格。书中介绍了如何在Ruby中使用闭包、lambda、块等高级功能,以及如何利用这些特性来简化代码,提高程序的可读性和维护性。 #### 4. 元编程 Ruby的元...
5. **闭包**:Ruby中的 Proc 和 lambda 实现了闭包,能够捕获其定义时的上下文环境,这在函数式编程中非常有用。 6. **模块(Module)**:Ruby的模块用于实现命名空间,代码重用和混合(mixin)功能。一个类可以...
- **错误处理**: 在函数式编程中,可以通过利用单子进行错误处理,同时保持与Go语言原生代码风格的一致性。这种方式可以简化错误处理过程,减少代码的复杂度。 - **性能**: 函数式编程中的引用透明性允许开发者只...
3. **函数式编程**:尽管Ruby主要是面向对象的语言,但它也支持函数式编程风格。书中会介绍闭包、块、Proc对象和Lambda,以及如何利用这些特性实现函数式编程。 4. **元编程**:Ruby的一大特色是元编程能力,它允许...
4. **块和Proc对象**:Ruby 2.1加强了Proc对象,使其可以作为方法参数传递,并且可以捕获局部变量,这在函数式编程风格中非常有用。 5. **垃圾收集**:Ruby 2.1对垃圾回收机制进行了优化,减少了内存占用,提升了...