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 = 1972puts 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 = 1qty == 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 Stringdef contains_digits
self[/d/] ? true : false
end
end
17. 查看异常堆栈
def do_division_by_zero; 5 / 0; endbegin
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 xbegin
# ...
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"
前言 作为一名程序员, 不可能不与网络打交道. 现在我们的手机, 电脑, 不夸张地说, 离开了网络就是一块’废铁’, 它们的作用将大打折扣.. 本文的作用呢, 主要是针对不是非网络专业开发的人员准备的, 以’最短的时间, 了解计网最多的知识’为前提起笔. 目录 概述 物理层 数据链路层 网络层 传输层 应用层 概述 先来了解下各种我们知道, 但是不太了解的专业名词的意思 因特网 因特网是当今世界上
Perl 程序员应该知道的事 是一本以食谱形式来介绍 Perl 语言 编程的书籍。通过本书,你不仅可以快速掌握 Perl 语言的基础知识,而且能 够将所掌握的知识立即用到真实世界的 Perl 编码中。 我们认为,使用 Perl 编程是有趣的。因此,学习 Perl 编程也应当有趣 才是。本书没有长篇大论式的枯燥说教,而是直击 Perl 程序员必需的每个知 识点。既能让你在较短的时间内理解 Perl
问题内容: 每个JavaScript程序员都应该具备能够说“我知道JavaScript”的东西吗? 问题答案: 不是jQuery。 不是YUI。不是(等) 框架可能很有用,但是它们经常隐藏一些关于JavaScript和DOM实际工作方式的丑陋细节。如果您的目标是能够说“我知道JavaScript”,那么在框架上投入大量时间是相反的。 以下是一些JavaScript语言功能,您应该了解这些功能在做什
本文向大家介绍你该知道的Gradle配置知识总结,包括了你该知道的Gradle配置知识总结的使用技巧和注意事项,需要的朋友参考一下 前言 本文主要介绍了关于Gradle配置的相关知识,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 参考链接:https://developer.android.com/studio/build/index.html 本片文章的内容全部参考自上面的链
本文向大家介绍PHP 开发者该知道的 5 个 Composer 小技巧,包括了PHP 开发者该知道的 5 个 Composer 小技巧的使用技巧和注意事项,需要的朋友参考一下 Composer 是新一代的PHP依赖管理工具。其介绍和基本用法可以看这篇《Composer PHP依赖管理的新时代》。本文介绍使用Composer的五个小技巧,希望能给你的PHP开发带来方便。 1. 仅更新单个库 只想更新
前后端不分离,是怎样的?大概也只有我们这些『老古董』们,才对此有更多感受。不对,那些写 React 的人,可能会对此也有一些体会。 今天,如果有一个前端工程师说,不知道前后端分离是什么。那么,要么是刚毕业不久的,要么是从老版的公司里出来的员工,要么是刚从时光机里出来的。 前后端分离 我刚开始接触前后端分离的时候,正值它开始慢慢扩散的时候,也还没有意识到它带来的好处。觉得它甚是麻烦,当我改一个接口的