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]).*"g"
上面例子中还有一种更简单的方法,就是使用 String#[]方法,可以直接匹配正则表达式,更简洁,虽然看起来使用了魔鬼数字。
当然你可以省略掉那个魔鬼数字,如果仅匹配一次的话:
复制代码 代码如下:
x = 'this is a test'
x[/[aeiou].+"codetitle">复制代码 代码如下:
[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 "codetitle">复制代码 代码如下:
qty = 1
qty == 0 "codetitle">复制代码 代码如下:
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 "codetitle">复制代码 代码如下:
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/] "codetitle">复制代码 代码如下:
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"
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 第五街的士高《印度激情版》3CD [WAV+CUE][2.4G]
- 三国志8重制版哪个武将智力高 三国志8重制版智力武将排行一览
- 三国志8重制版哪个武将好 三国志8重制版武将排行一览
- 三国志8重制版武将图像怎么保存 三国志8重制版武将图像设置方法
- 何方.1990-我不是那种人【林杰唱片】【WAV+CUE】
- 张惠妹.1999-妹力新世纪2CD【丰华】【WAV+CUE】
- 邓丽欣.2006-FANTASY【金牌大风】【WAV+CUE】
- 饭制《黑神话》蜘蛛四妹手办
- 《燕云十六声》回应跑路:年内公测版本完成95%
- 网友发现国内版《双城之战》第二季有删减:亲亲环节没了!
- 邓丽君2024-《漫步人生路》头版限量编号MQA-UHQCD[WAV+CUE]
- SergeProkofievplaysProkofiev[Dutton][FLAC+CUE]
- 永恒英文金曲精选4《TheBestOfEverlastingFavouritesVol.4》[WAV+CUE]
- 群星《国风超有戏 第9期》[320K/MP3][13.63MB]
- 群星《国风超有戏 第9期》[FLAC/分轨][72.56MB]