Ruby惯用法总结概览

开发 开发工具
我们这次为大家介绍的Ruby惯用法包括:迭代;||=赋值 ;程序入口;预设变量和特殊记号;求和;交换等等。我们将会对此做一个详细介绍。

Ruby最近是一个比较热门的词汇,许多程序员都开始将目光转向这项语言。它存在着许多惯用法,下面就向大家总结了一些Ruby惯用法,作为参考对象。#t#

迭代

一般写法:

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

习惯写法:

(1..10).each{|i| puts i}

1.upto(10){|i| puts i} # from njmzhang

||=赋值

一般写法:

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'

责任编辑:曹凯 来源: 百度博客
相关推荐

2015-07-13 09:46:44

Java习惯用法

2009-12-17 13:46:01

Ruby表单语句

2011-06-09 15:15:52

RAII

2017-09-05 09:17:47

Java编程用法总结

2024-02-01 00:10:21

C++PIMPL编程

2009-12-29 13:43:26

WPF URI

2010-01-26 17:05:37

Android缺点

2009-12-24 13:46:03

WPF控件

2015-12-28 13:45:53

Windows 10照片应用

2024-02-02 12:42:42

C++Policy模板

2009-12-14 15:04:32

Ruby性能特点

2009-12-23 18:16:35

WPF布局控件

2009-12-07 16:44:45

PHP图形处理函数

2010-03-05 16:38:48

Python应用范围

2009-12-17 14:29:50

Ruby on Rai

2009-12-16 14:40:14

Ruby控制结构

2009-12-17 11:27:31

Ruby时间方法

2009-12-14 13:27:06

Ruby区间

2009-12-14 17:48:46

Ruby String

2010-02-06 09:59:54

C++ void使用规
点赞
收藏

51CTO技术栈公众号