21个你应该知道的Ruby编程技巧

1. 快速获取正则表达式的匹配值

通常我们使用正则表达式,都是先match,然后再取结果,但是这样有时候会抛异常,看下面例子:

代码如下:

email = "Fred Bloggs "

email.match(//)[1] # => "fred@bloggs.com"

email[//, 1] # => "fred@bloggs.com"

email.match(/(x)/)[1] # => NoMethodError [:(]

email[/(x)/, 1] # => nil

email[/([bcd]).*?([fgh])/, 2] # => "g"

上面例子中还有一种更简单的方法,就是使用 String#[]方法,可以直接匹配正则表达式,更简洁,虽然看起来使用了魔鬼数字。
当然你可以省略掉那个魔鬼数字,如果仅匹配一次的话:

代码如下:

x = 'this is a test'

x[/[aeiou].+?[aeiou]/] # => 'is i'

这个例子中,我们匹配规则“先匹配一个元音,然后一个辅音,再接着一个元音”。

2. Array#join!的快捷实现

我们知道Array的*操作,是将数组里面的元素成倍的增加:

代码如下:

[1, 2, 3] * 3 == [1, 2, 3, 1, 2, 3, 1, 2, 3]

但是当乘因子不是数字是字符串会出现什么效果?

代码如下:

%w{this is a test} * ", " # => "this, is, a, test"

h = { :name => "Fred", :age => 77 }

h.map { |i| i * "=" } * "n" # => "age=77nname=Fred"

对了,这就是join!的效果。因此可以用这种方式来快捷地实现join!操作。

3. 快速格式化十进制数字

格式化浮点数字的精度显示通常使用sprintf这个函数,可是有一种更快捷的方式,使用字符串。

代码如下:

money = 9.5

"%.2f" % money # => "9.50"

4. 快速解析字符串

在技巧3中我们看到了数字的格式化,这里就说一下字符串格式的快捷方式。

代码如下:

"[%s]" % "same old drag" # => "[same old drag]"

这里的意思是将”same old drag”显示到[]中。
我们再看一下具体的格式化方法:

代码如下:

x = %w{p hello p}

"%s" % x # => "

hello

5. 递归删除文件和目录

FileUtils提供了这种方法:

代码如下:

require 'fileutils'

FileUtils.rm_r 'somedir'

还有一个方法是FileUtils.rm_rf,与linux上的 rm -rf 对应。

6. 快速穷举可枚举对象

使用*操作可以快速的穷举出可枚举对象中的所有元素,像Array,Hash这种对象。

代码如下:

a = %w{a b}

b = %w{c d}

[a + b]                              # => [["a", "b", "c", "d"]]

[*a + b]                             # => ["a", "b", "c", "d"]

这里*操作符的优先级低于+操作符。

代码如下:

a = { :name => "Fred", :age => 93 }

[a]                                  # => [{:name => "Fred", :age =>93}]

[*a]                                 # => [[:name, "Fred"], [:age, 93]]

a = %w{a b c d e f g h}

b = [0, 5, 6]

a.values_at(*b).inspect              # => ["a", "f", "g"]

7. 消除临时变量

我们有时候需要写一个临时变量如一个临时的Array,有一种方式可以不用单独定义临时变量:

代码如下:

(z ||= []) << 'test'

当然这不是一种很好的编程习惯,建议不要大量在代码中使用。

8. 使用非字符串或非Symbol对象作为Hash的Key

或许你从来没有尝试过使用非String或非Symbol对象作为Hash的Key,但是确实是可以的,有时候还蛮有用。

代码如下:

does = is = { true => 'Yes', false => 'No' }

does[10 == 50]                       # => "No"

is[10 > 5]                           # => "Yes"

9. 使用and或or将多个操作组合到一行

这个技巧很多熟练的Ruby程序员都会使用,用来替代if和unless这种短行代码。

代码如下:

queue = []

%w{hello x world}.each do |word|

queue << word and puts "Added to queue" unless word.length <  2

end

puts queue.inspect

# Output:

#   Added to queue

#   Added to queue

#   ["hello", "world"]

但是注意,这种方式,若and左边表达式“queue << word”返回nil则“puts "Added to queue"”不会被执行,要慎用。不是Geek建议不要用。

10. 判断当前Ruby解析器是否在执行自己的脚本

有时候你可能需要判断当前的运行环境是否在自己的Ruby脚本文件中,那么可以使用:

代码如下:

if __FILE__ == $0

# Do something.. run tests, call a method, etc. We're direct.

end

11. 快速地批量给变量赋值

最常用的多个变量赋值方法是:

代码如下:

a, b, c, d = 1, 2, 3, 4

在函数中可以批量赋值,通过传*的参数:

代码如下:

def my_method(*args)

a, b, c, d = args

end

还可以批量设置成员变量:

代码如下:

def initialize(args)

args.keys.each { |name| instance_variable_set "@" + name.to_s, args[name] }

end

12. 使用range替代复杂的数字大小比较

如果要比较if x > 1000 && x < 2000 ,可以使用如下方式替代:

代码如下:

year = 1972

puts  case year

when 1970..1979: "Seventies"

when 1980..1989: "Eighties"

when 1990..1999: "Nineties"

end

13. 使用枚举操作替换重复代码

写代码最忌讳“重复”,在Ruby中有时候会require很多文件,可以使用下面的方式省去重复的require:

代码如下:

%w{rubygems daemons eventmachine}.each { |x| require x }

14. 三元操作

Ruby和其他语言一样,有三元操作:

代码如下:

puts x == 10 ? "x is ten" : "x is not ten"

# Or.. an assignment based on the results of a ternary operation:

LOG.sev_threshold = ENVIRONMENT == :development ? Logger::DEBUG : Logger::INFO

15. 嵌套的三元操作

代码如下:

qty = 1

qty == 0 ? 'none' : qty == 1 ? 'one' : 'many'

# Just to illustrate, in case of confusion:

(qty == 0 ? 'none' : (qty == 1 ? 'one' : 'many'))

16. 几种返回true,false的实现

最普通的是:

代码如下:

def is_odd(x)

# Wayyyy too long..

if x % 2 == 0

return false

else

return true

end

end

可以简洁一点是:

代码如下:

def is_odd(x)

x % 2 == 0 ? false : true

end

还可以更简洁:

代码如下:

def is_odd(x)

# Use the logical results provided to you by Ruby already..

x % 2 != 0

end

当然,有时候你担心返回的nil(ruby中的判定规则是nil为false,其他都为true),那么可以显示转换:

代码如下:

class String

def contains_digits

self[/d/] ? true : false

end

end

17. 查看异常堆栈

代码如下:

def do_division_by_zero; 5 / 0; end

begin

do_division_by_zero

rescue => exception

puts exception.backtrace

end

18. 将一个对象转换为数组

*操作符可以将一个对象转换为数组对象

代码如下:

1.9.3p125 :005 > items = 123456

=> 123456

1.9.3p125 :006 > [*items]

=> [123456]

1.9.3p125 :007 > [*items].each do | i | puts i end

123456

=> [123456]

19. 没有begin的rescue块

Ruby中捕获异常的代码是begin...rescue...:

代码如下:

def x

begin

# ...

rescue

# ...

end

end

但是rescue可以没有begin:

代码如下:

def x

# ...

rescue

# ...

end

20. 块注释

C和Java中的块代码注释是/**/,ruby中也有类似的块注释:

代码如下:

puts "x"

=begin

this is a block comment

You can put anything you like here!

puts "y"

=end

puts "z"

21. 抛出异常

Java中抛异常是使用throw,ruby中更灵活,可以在一行代码中直接抛异常而不中断当前调用栈:

代码如下:

h = { :age => 10 }

h[:name].downcase                         # ERROR

h[:name].downcase rescue "No name"        # => "No name"

(0)

相关推荐

  • 21个你应该知道的Ruby编程技巧

    1. 快速获取正则表达式的匹配值 通常我们使用正则表达式,都是先match,然后再取结果,但是这样有时候会抛异常,看下面例子: 复制代码 代码如下: email = "Fred Bloggs " email.match(//)[1] # => "fred@bloggs.com" email[//, 1] # => "fred@bloggs.com" email.match(/(x)/)[1] # => NoMethodError

  • 你应该知道的Ruby代码风格

    一.空格与tab使用空格缩进(95.364%)使用Tab缩进(4.636%)基于 1,001,987 次提交二.最大行宽80字符(92.618%)120字符(5.893%)150字符(1.489%)基于 1,057,374 次提交三.运算符.冒号.花括号周围,逗号.分号后是否使用空格不使用空格(73.366%) 复制代码 代码如下: sum = 1 +2a,b = 1, 21>2 ? true : false;puts 'Hi'[1, 2, 3].each {|e| puts e} 使用空格(2

  • WEB前端开发都应知道的jquery小技巧及jquery三个简写

    一个简单技巧的集合,帮你提升 jQuery 技能.目前小编给大家整理了14个jquery小技巧. 目录结构 1回到顶部按钮 2预加载图片 3检查图片是否加载完毕 4自动修复损坏的图片 5Hover 上的 Class 开关 6禁用 input 字段 7停止链接加载 8淡入淡出/滑动开关 9简单的折叠效果 10将两个 Div 设为相同高度 11在新窗口打开外部链接 12找到文本元素 13切换可视与隐藏的触发器 下面给大家介绍每个小技巧的具体含义. 1.回到顶部按钮 通过使用 jQuery 中的 an

  • 你应该知道的Python3.6、3.7、3.8新特性小结

    很多人在学习了基本的Python语言知识后,就转入应用阶段了,后期很少对语言本身的新变化.新内容进行跟踪学习和知识更新,甚至连已经发布了好几年的Python3.6的新特性都缺乏了解. 本文列举了Python3.6.3.7.3.8三个版本的新特性,学习它们有助于提高对Python的了解,跟上最新的潮流. 一.Python3.6新特性 1.新的格式化字符串方式 新的格式化字符串方式,即在普通字符串前添加 f 或 F 前缀,其效果类似于str.format().比如 name = "red"

  • 一定要知道的 25 个 Vue 技巧

    目录 1. 将 prop 限制为类型列表 2. 默认内容和扩展点 3. 使用引号观察嵌套值 4. 知道何时使用 v-if(以及何时避免使用) 5. 单作用域 slot 的简写(不需要模板标签!) 6. 有条件地渲染slot 6.1 为什么我们希望能够有条件地渲染slot呢? 7. 如何观察slot的变化 8. 将本地和全局风格混合在一起 9. 覆盖子组件的样式--正确的方法 10. 用上下文感知组件创造魔法 10.1 状态共享 10.2 配置 10.3 造型 11. 如何使在 Vue 之外创建的

  • 学习JavaScript一定要知道的3个小技巧

    目录 一.神奇的扩展运算符 1.拷贝数组 2.合并数组 3.展开对象 二.进行空检查的最佳方法 1.可选链操作符 2.空值合并运算符 三.使用 .map()..reduce() 和 .filter() 前言: 通常在 Angular 或 React 项目中,code review 时看到一些老式的 JavaScript 代码,就会将开发人员归类为初学者.但是,如果您知道以下 3 个技巧,您将被视为现代 JavaScript 的尤达大师.那么,让我们开始我们的旅程吧! 一.神奇的扩展运算符 扩展运

  • PHP小白必须要知道的php基础知识(超实用)

    很多人看到PHP就以为是程序员,就以为钱很多(虽然是事实),但是也要考虑下自己是不是适合这一行,知道PHP是什么吗?PHP都有什么样的功能,都能用来干嘛? PHP是什么? •PHP(PHP: Hypertext Preprocessor,超文本预处理器的缩写),是一 种被广泛应用的开放源代码的.基于服务器端的用于产生动态网页 的.可嵌入HTML中的脚本程序语言,尤其适合 WEB 开发. •当客户端向服务器的程序提出请求时,web服务器根据请求晌应对应 的页面,当页面中含有php脚本时,服务器会交

  • 分享下网站开发人员应该知道的61件事

    不出意料地,他得到了一大堆回答. 通常情况下,你需要把所有人的发言从头到尾读一遍.但是,Stack Overflow有一个很贴心的设计,它允许在问题下方开设一个wiki区,让所有人共同编辑一个最佳答案.于是,就有了下面这篇文章,一共总结出六个方面共计61条"网站开发须知". 我发现,这种概述性的问题,最适合这种集合群智.头脑风暴式的回答方式了.这也是我第一次觉得,Stack Overflow做到了Wikipedia做不到的事.(难怪它最近挤进了全美前400大网站.) 在我的印象中,关于

  • Web开发/设计人员应当知道的15个网站

    ColorCombos 在进行网站设计的时候,开始步骤的其中一项(也是最重要)的内容是选择出一个配色方案. Color Combos让你可以浏览上千个不同的颜色组合,以便从中为你即将开始的设计汲取灵感.其配色方案可按颜色浏览. LIpsum 风靡之至的Lorem Ipsum文字,其大名谁人不知?哪个不晓?(译注:查了才知道,这是指一篇用于测试排版设计的拉丁文文章,从15世纪开始就被广泛使用,文章因以Lorem Ipsum开头而得名)该段文字被全球各地的网站设计者用来在设计中对其真正的文字的呈现效

  • PHP 开发者该知道的 5 个 Composer 小技巧

    Composer 是新一代的PHP依赖管理工具.其介绍和基本用法可以看这篇<Composer PHP依赖管理的新时代>.本文介绍使用Composer的五个小技巧,希望能给你的PHP开发带来方便. 1. 仅更新单个库 只想更新某个特定的库,不想更新它的所有依赖,很简单: composer update foo/bar 此外,这个技巧还可以用来解决"警告信息问题".你一定见过这样的警告信息: Warning: The lock file is not up to date wi

随机推荐