侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

技术  /  管理员 发布于 6年前   283

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

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

复制代码 代码如下:
email = "Fred Bloggs "

email.match(//)[1] # => "[email protected]"

email[//, 1] # => "[email protected]"

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"


  • 上一条:
    使用workerman实现在线聊天的方法
    下一条:
    详解Ruby中的代码块及其参数传递
  • 昵称:

    邮箱:

    1条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 2024.07.09日OpenAI将终止对中国等国家和地区API服务(0个评论)
    • 2024/6/9最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 国外服务器实现api.openai.com反代nginx配置(0个评论)
    • 2024/4/28最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2017-09
    • 2018-01
    • 2018-07
    • 2018-08
    • 2018-09
    • 2018-12
    • 2019-01
    • 2019-02
    • 2019-03
    • 2019-04
    • 2019-05
    • 2019-06
    • 2019-07
    • 2019-08
    • 2019-09
    • 2019-10
    • 2019-11
    • 2019-12
    • 2020-01
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-12
    • 2024-02
    • 2024-04
    • 2024-05
    • 2024-06
    • 2025-02
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客