当前位置: 首页 > 编程笔记 >

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

佘飞鸣
2023-03-14
本文向大家介绍21个你应该知道的Ruby编程技巧,包括了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"

 类似资料:
  • 前言 作为一名程序员, 不可能不与网络打交道. 现在我们的手机, 电脑, 不夸张地说, 离开了网络就是一块’废铁’, 它们的作用将大打折扣.. 本文的作用呢, 主要是针对不是非网络专业开发的人员准备的, 以’最短的时间, 了解计网最多的知识’为前提起笔. 目录 概述 物理层 数据链路层 网络层 传输层 应用层 概述 先来了解下各种我们知道, 但是不太了解的专业名词的意思 因特网 因特网是当今世界上

  • 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 的人,可能会对此也有一些体会。 今天,如果有一个前端工程师说,不知道前后端分离是什么。那么,要么是刚毕业不久的,要么是从老版的公司里出来的员工,要么是刚从时光机里出来的。 前后端分离 我刚开始接触前后端分离的时候,正值它开始慢慢扩散的时候,也还没有意识到它带来的好处。觉得它甚是麻烦,当我改一个接口的