`
ziyoujiedao
  • 浏览: 41001 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Ruby惯用法(转自:javaeye 中cookoo)

阅读更多
Ruby有不少惯用法,这里略作一些介绍,也方便阅读他人代码:

迭代
一般写法:


代码
for i in (1..10)    
    puts i    
end   



习惯写法:


代码
(1..10).each{|i| puts i}    
或    
1.upto(10){|i| puts i} # from njmzhang   

或 10.times{|i|puts i }





||=赋值
一般写法:


代码
number = 1 if number.nil?    
number = 1 unless number   



习惯写法:

代码
number ||= 1   




程序入口


代码
if __FILE__ == $0   
或    
if $PROGRAM_NAME == __FILE__   



这个相当于main(), 逻辑判断的意思当程序名($0或另一个)和当前文件名(__FILE__)一致时,也就是当前文件是被单独执行的而不是被别的文件调用。这个方法还有个用法是作为unit test使用。


预设变量和特殊记号
类似$0的Perl风格预设常量还有很多,参见Programming Ruby p319

其中比较常用的如$:代表库搜索路径,修改方法常见有:


代码
$:.unshift('buildscript')  # from gigix    
或    
$: << File.join(File.dirname(__FILE__), 'CurrentClass')    



后一种方法使用了相对路径,因为Ruby的module不要求namespace和文件目录结构要对应一致,很多时候统统放一个目录里


%w格式化命令(from qiezi) 可以少打几个引号


代码
%w{a b c d} #等价 ['a', 'b', 'c', 'd']    




``(~键下的撇号)用来执行shell外部命令,如:


代码
`help`   




inject
一般写法:


代码

result = []    
(1..10).each{|item| result << item}   



习惯写法:

代码

(1..10).inject([]){|array, item| array << item}   



inject有点难理解,相当于python的reduce和一些FP里的fold。inject的块变量有两个(这里是array和item),第二个变量(item)用来枚举被inject的集合(这里是(1..10)这个range), 而第一个变量(array)由inject的参数初始化(这里是[],可选),并在block被反复执行时保持持久(相当于静态变量),而item则在每次枚举时被更新为下一个值。我们再看一下inject的另一种通常用法就会更明白了:求和

代码

(1..10).inject{|sum, item| sum += item}    
这个等于    
(1..10).inject(0){|sum, item| sum += item}   



也就是块变量sum被初始化成0然后反复迭代执行块的内容,最后返回sum


并行赋值
这个很多人都知道了,比如:


代码

a,b = 0, 1   
a,b = b, a # 交换a,b   




当然可以延伸出一些很诡异的变化,不提倡使用阿


还有一个用法是让函数返回“多个结果”(不是多个对象),如:


代码

def test    
  1,2   
end    
x, y = test #x = 1, y = 2      




这个njmzhang说的很对,其实函数返回的是一个array,然后再并行匹配到变量上去。(所以我对多个结果特别加了引号)
这显然是个syntax sugar,你随便用逗号分割几个变量是不会自动组成array的。


注意这种并行匹配当两遍不平衡时会造成的问题:


代码

a,b = [1,2,3] # a = 1, b = 2, 3被丢弃    
a,b,c = [1,2] # a = 1, b = 2, c = nil 被初始化成nil   

 



*的匹配
一般来说*用于把一个array展开:


代码

a, *b = [1,2,3]  #a = 1, b = [2,3]   




类似FP里的x:xs(haskell), x::xs(ocaml), [a | b] (erlang from 布娃娃)


rescue简单用法


代码

begin    
 1/0   
rescue    
  puts 'wrong'    
end   



可以简化为

代码

1/0 rescue puts 'wrong'   





命名参数的默认值
ruby有默认参数,但其实没有所谓keyword argument,而是提供一个syntax sugar用hash模拟。但是怎么像Rails的方法那样同时利用命名参数和默认参数值呢?


代码

def image(opt={})    
    default_opt = {:height => 25, :width => 10}    
    default_opt.merge! opt #opt中同样key的内容会覆盖default_opt中key的value    
end   




精细duck typing控制
duck typing的精神就是行为决定类型,而不是相反


代码

a = []    
#不用    
if a.kind_of? Array then a << 1   
if a.instance_of? Array then a << 1   
#而用    
if a.respond_to? :<< then a << 1   




获取metaclass
这也比较常见了,各种动态伎俩的开始


代码

sing = class << self; self; end   





符号转换到Proc
一般写法:


代码

(1..10).map{|item| item.succ}   




习惯写法:

代码

(1..10).map(&:succ)   




map(fun(x))般的FP风格


注意这是Rails特有的,通过ActiveSupport对Symbol插入to_proc方法。
不用Rails怎么办呢?一种办法是借助Ruby Facets库(gem install facets):


代码
require 'facet/symbol/to_proc‘   




Facets库包括大量对Ruby核心类的扩展,是个有趣而又危险的大杂烩,也许我以后会另外再专门介绍一下。

分享到:
评论
1 楼 shaka 2008-09-02  
从百度贴吧迁移到JavaEye上,看起来方便多了

相关推荐

    ruby watir教程

    **Ruby Watir** 是一种用于网页自动化测试的工具库,它能够模拟用户在浏览器中的操作行为,如点击按钮、填写表单等,非常适合进行功能测试、回归测试和系统测试。 #### 二、安装Ruby Watir ##### 1. 安装Ruby环境 ...

    JavaEye+技术架构

    以下是对JavaEye+技术架构中可能涉及的一些核心知识点的详细解释: 1. **MVC模式**:JavaEye+可能采用了Model-View-Controller(模型-视图-控制器)架构模式,这是一种将业务逻辑、用户界面和应用程序数据分离的...

    javaeye热点阅读

    19. Ruby on Rails:Ruby on Rails是一个流行的Web开发框架,文中探讨了其在企业开发、嵌入式开发中的应用,以及工作流实现。 20. AJAX技术:包括ExtJS基础教程和jQuery图片循环效果,展示了AJAX如何提升用户体验。...

    JavaEye3.0开发手记

    ### JavaEye3.0开发手记之开发环境搭建详解 #### 一、开发环境搭建概述 随着JavaEye3.0开发计划的启动,本篇文章将详细介绍如何为该项目搭建高效的开发环境。开发过程中不仅需要考虑软件的选择,还需要针对操作...

    javaeye论坛规则小测验(答案)

    JavaEye论坛,作为中国早期知名的IT技术交流平台,有着严格的社区规则来维护其良好的讨论环境。本小测验主要关注的是论坛中对于内容转载的规定,这对于任何参与在线社区的用户来说都是至关重要的知识。以下是对这些...

    自己仿照javaeye写的jspf分页(原创)

    自己仿照javaeye写的jspf分页(原创),请各位多多指教

    ruby勇士,边玩边学习

    ruby勇士,初学者边游戏边学习ruby的好玩的东西。具体玩法在 http://www.javaeye.com/topic/383938,或者Google一下“ruby勇士”。因为下载游戏的网站有时访问不了,上传一下提供下载。

    测试JavaEye的PDF生成效果

    标题“测试JavaEye的PDF生成效果”提示我们关注的是一个使用JavaEye库生成PDF文档的实践过程。JavaEye可能是一个用于Java平台的开源库,它提供了将数据转换为PDF格式的功能,这对于创建报告、手册或其他需要打印或...

    javaeye被黑

    javaeye被黑 大家看看

    JavaEye2.0_on_rails

    ### JavaEye2.0_on_rails:敏捷Web开发实践与Ruby on Rails的应用 #### 敏捷软件开发方法 - **背景**:传统软件工程方法在实际应用中面临着项目延期、成本超支以及软件质量不高的问题。为了克服这些挑战,业界提出...

    ruby study

    ### Ruby中的正则表达式详解 #### 一、引言 在编程语言Ruby中,正则表达式(Regular Expression)是一种强大的文本处理工具,用于模式匹配、搜索与替换字符串等功能。Ruby采用`//`作为正则表达式的边界标记,使得...

    JavaEye新闻月刊_-_2009年3月_-_总第13期

    JavaEye新闻月刊2009年3月第13期内容涉及了当时软件开发领域内的一系列重要话题,包括IBM拟收购Sun Microsystems公司的新闻报道、Java社区对此的看法以及各种编程语言、开发工具和技术的新动态。 首先,新闻月刊...

    JavaEye Client SourceCode

    JavaEye Client SourceCode是一个开源项目,专为Android平台设计,提供了JavaEYE的客户端实现。这个项目的源代码为我们提供了一个深入了解Android应用开发以及Java编程在移动设备上的实践的宝贵资源。接下来,我们将...

    httpClient调用javaeye API验证用户

    在这个场景中,我们使用HttpClient来调用JavaEye API来验证用户。JavaEye可能是一个提供用户认证服务的平台,而API则提供了验证用户身份的功能。 以下是一个关于如何使用HttpClient调用JavaEye API的基本步骤: 1....

Global site tag (gtag.js) - Google Analytics