`
dcaoyuan
  • 浏览: 307386 次
社区版块
存档分类
最新评论

Functinal Style Ruby

阅读更多

After playing with Ruby for weeks, I found Ruby is yet interesting. I try to write my code a bit in the likeness of Erlang, where symbol vs atom, array vs list. And the most important syntax that I like are:

  • everything return a value
  • may return multiple values
  • begin-end clause is lambda that may be directly applied
  • parallel assignment

Now, let's write some code before and after (functional):

Example1:

Before

   1. cond = {}  
   2. if par[:id]  
   3.   feed = Feed.find(par[:id])  
   4.   if feed  
   5.     cond[:feed] = feed.id  
   6.   end  
   7. end  
   8. if par[:m]
   9.   limit = par[:m].to_i  
  10. else  
  11.   limit = 20  
  12. end  
  13. if limit >= 4096  
  14.   limit = 4096  
  15. end  
  16. cond[:limit] = limit  
  17. if par[:d]  
  18.   days = par[:d].to_f  
  19.   if days <= 0 || days >= 365  
  20.     days = 365  
  21.   end  
  22.   cond[:time] = Time.now - days*86400  
  23. end  
After
   1. cond = {  
   2.   :feed   => if par[:id]  
   3.                feed = Feed.find(par[:id])  
   4.                feed ? feed.id : nil  
   5.              end,  
   6.   :limit  => begin  
   7.                 limit = par[:m] ? par[:m].to_i : 20  
   8.                 limit >= 4096 ? 4096 : limit  
   9.              end,  
  10.   :time   => if par[:d]  
  11.                days = par[:d].to_f  
  12.                days = days <= 0 || days >= 365 ? 365 : days  
  13.                Time.now - days * 86400  
  14.              end,  
  15. }.delete_if { |k, v| v.nil? } # delete all nil elements of cond  

Example2:

Before

   1.  if f[:mode] == "rss"  
   2.   rss = f[:feed]  
   3.   params[:feed][:channel] = rss.channel.title  
   4.   params[:feed][:description] = rss.channel.description  
   5.   params[:feed][:link] = rss.channel.link  
   6.   params[:feed][:copyright] = rss.channel.copyright  
   7. else  
   8.   atom = f[:feed]  
   9.   params[:feed][:channel] = atom.title  
  10.   params[:feed][:description] = atom.subtitle  
  11.   params[:feed][:link] = atom.links.join  
  12.   params[:feed][:copyright] = atom.rights  
  13. end  
After
   1. params[:feed][:channel],    
   2. params[:feed][:description],    
   3. params[:feed][:link],    
   4. params[:feed][:copyright] = if f[:mode] == "rss"    
   5.                               rss = f[:feed]   
   6.   
   7.                               [rss.channel.title,    
   8.                                rss.channel.description,    
   9.                                rss.channel.link,    
  10.                                rss.channel.copyright]  
  11.                             else    
  12.                               atom = f[:feed]  
  13.     
  14.                               [atom.title,    
  15.                                atom.subtitle,    
  16.                                atom.links.join,    
  17.                                atom.rights]    
  18.                             end    

Example3

   1. # grp_str: p -> public(0) , u -> user(1), f -> friends(2)   
   2. def privilege_cond(user, grp_str)  
   3.   grp_str ||= 'puf'  
   4.   cond = {:pre => "", :sub => []}  
   5.   cond = if loggedin?(user)  
   6.            frds = grp_str.include?('f') ? user.friends.find(:all) : []  
   7.            frd_ids = frds.collect { |frd| frd.friend_id.to_i }  
   8.              
   9.            cond = if grp_str.include?('u')  
  10.                     {:pre => cond[:pre] + (cond[:pre] == "" ? "" : "OR") +   
  11.                              " user_id  = ? ",  
  12.                      :sub => cond[:sub] + [user.id]}  
  13.                   else  
  14.                     cond  
  15.                   end  
  16.       
  17.            cond = if grp_str.include?('f') && !frd_ids.empty?  
  18.                     {:pre => cond[:pre] + (cond[:pre] == "" ? "" : "OR") +   
  19.                              " user_id in (?) AND privilege in (?) ",  
  20.                      :sub => cond[:sub] + [frd_ids, [0, 2]]}  
  21.                   else  
  22.                     cond  
  23.                   end  
  24.       
  25.            cond = if grp_str.include?('p')  
  26.                     {:pre => cond[:pre] + (cond[:pre] == "" ? "" : "OR") +   
  27.                              " user_id != ? AND privilege  = ? ",  
  28.                      :sub => cond[:sub] + [user.id, 0]}  
  29.                   else  
  30.                      cond  
  31.                   end  
  32.          else  
  33.            {:pre => "privilege = ?",  
  34.             :sub => [0]}  
  35.          end  
  36. end  
分享到:
评论

相关推荐

    Ruby-Style-Guide-ruby.zip

    Ruby_Style_Guide_ruby.zip Ruby_Style_Guide_ruby.zip Ruby_Style_Guide_ruby.zip Ruby_Style_Guide_ruby.zip Ruby_Style_Guide_ruby.zip Ruby_Style_Guide_ruby.zip Ruby_Style_Guide_ruby.zip Ruby_Style_Guide_...

    Ruby Ruby Ruby Ruby Ruby Ruby

    Ruby Ruby Ruby Ruby Ruby Ruby

    Ruby-rubybuild编译和安装Ruby

    Ruby是一种动态、开源的编程语言,以其简洁、优雅的语法和强大的元编程能力著称。在Ruby开发中,为了管理不同版本的Ruby环境,我们常常会使用到`rbenv`和`ruby-build`这两个工具。本文将详细介绍如何使用`ruby-build...

    ruby DBI ruby DBI ruby DBI

    ruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ruby DBIruby DBI ruby DBI ...

    Ruby完全自学手册 下

    《Ruby完全自学手册》是一本完全覆盖Ruby和Ruby on Rails的完全自学手册。《Ruby完全自学手册》的特色是由浅入深、循序渐进,注重理论和实践的结合。虽然定位为入门手册,但是依然涉及许多高级技术和应用,覆盖到的...

    src-oepkgs/ruby-ruby2ruby

    src-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2rubysrc-oepkgs/ruby-ruby2...

    Ruby-rubyinstall安装RubyJRubyRubiniusMagLevorMRuby

    Ruby是一种强大的、面向对象的脚本语言,广泛用于Web开发、服务器端编程和各种应用程序。在Ruby的世界里,管理不同的Ruby实现(如MRI、JRuby、Rubinius、MagLev和MRuby)是非常重要的,这有助于开发者根据项目需求...

    Ruby完全自学手册

    Ruby是一种简洁而功能强大的编程语言,由日本的松本行弘(Yukihiro "Matz" Matsumoto)在1993年开发,并于1995年公开发布。Ruby语言设计之初就非常注重开发人员的编程体验,它拥有自然、表达性强的语法,易于阅读和...

    ruby安装包下载 | ruby环境搭建

    Ruby是一种强大的动态编程语言,广泛应用于Web开发,脚本编写,服务器管理等领域。为了在没有外网连接的环境中搭建Ruby环境,你需要提前下载并准备相关的安装包。在提供的压缩包中,包含了三个关键文件:`ruby-2.7.2...

    Ruby资源ruby-v3.1.1.zip

    Ruby是一种面向对象的、动态类型的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。本资源“ruby-v3.1.1.zip”包含了Ruby的最新版本3.1.1,这是一个重要的里程碑,因为它引入了新特性、性能优化以及对旧...

    ruby2ruby.zip

    ruby2ruby 提供一些用来根据 RubyParser 兼容的 Sexps 轻松生成纯 Ruby 代码的方法。可在 Ruby 中轻松实现动态语言处理。 标签:ruby2ruby

    ruby源代码 ruby源代码 ruby源代码 ruby源代码2

    ruby源代码 ruby源代码 ruby源代码 ruby源代码2

    Ruby-TensorStream用Ruby重新实现TensorFlow

    **Ruby-TensorStream:用Ruby重现实现TensorFlow** Ruby-TensorStream是一个开源项目,旨在为Ruby开发者提供一个类似于Google TensorFlow的深度学习框架。它的核心目标是让Ruby程序员能够利用TensorFlow的强大功能...

    安装rvm,把ruby版本提升至3.0.0

    在IT行业中,管理和切换Ruby版本是一项常见的任务,特别是在开发环境中,不同的项目可能依赖于不同版本的Ruby。`RVM`(Ruby Version Manager)是解决这一问题的利器,它允许开发者在多个Ruby版本之间轻松切换。本文...

    Ruby新手学习书(Ruby语言中文教程)和Rails_4_days

    Ruby是一种面向对象的编程语言,以其简洁、优雅的语法著称,被广泛应用于Web开发,尤其是与Ruby on Rails框架结合使用。"Ruby新手学习书"和"Rails_4_days"这两个资源是为初学者设计的,旨在帮助他们快速掌握Ruby语言...

    ruby源代码 ruby源代码 ruby源代码 ruby源代码4

    ruby源代码 ruby源代码 ruby源代码 ruby源代码4

    使用ruby解析awdb离线库

    使用ruby解析awdb离线库使用ruby解析awdb离线库使用ruby解析awdb离线库使用ruby解析awdb离线库使用ruby解析awdb离线库使用ruby解析awdb离线库使用ruby解析awdb离线库使用ruby解析awdb离线库使用ruby解析awdb离线库...

    Ruby Under a Microscope An Illustrated Guide to Ruby Internals

    《Ruby Under a Microscope: An Illustrated Guide to Ruby Internals》这本书的标题和描述为我们揭开了Ruby语言内部工作机制的面纱。Ruby是一种以简单优雅的语法为核心的强大编程语言,但它内部所执行的无数不为人...

    Ruby基础教程(第5版)1

    《Ruby基础教程(第5版)》是一本由日本知名编程专家高桥征义和后藤裕藏共同著作,经过Ruby之父松本行弘审校的编程入门指南。本书专注于教授Ruby 2.3版本的语法和核心概念,旨在帮助初学者轻松掌握这门强大的面向...

    Ruby 教程 The Book of Ruby

    ### Ruby 教程《The Book of Ruby》知识点总结 #### 一、书籍基本信息 - **书名**:《The Book of Ruby》 - **作者**:Huw Collingbourne - **出版年份**:2011年 - **出版社**:No Starch Press - **ISBN-10**:1-...

Global site tag (gtag.js) - Google Analytics