主頁(yè) > 知識(shí)庫(kù) > 21個(gè)你應(yīng)該知道的Ruby編程技巧

21個(gè)你應(yīng)該知道的Ruby編程技巧

熱門標(biāo)簽:AI電銷機(jī)器人 線路 柯城手機(jī)地圖如何做地圖標(biāo)注 外呼線路從哪里出來(lái)的 巫師3地圖標(biāo)注魔力之所 天津外呼系統(tǒng)怎么收費(fèi) 漯河電銷 淮安自動(dòng)外呼系統(tǒng)供應(yīng)商 征服者企業(yè)地圖標(biāo)注 中牟外呼系統(tǒng)違法嗎

1. 快速獲取正則表達(dá)式的匹配值

通常我們使用正則表達(dá)式,都是先match,然后再取結(jié)果,但是這樣有時(shí)候會(huì)拋異常,看下面例子:

復(fù)制代碼 代碼如下:

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"

上面例子中還有一種更簡(jiǎn)單的方法,就是使用 String#[]方法,可以直接匹配正則表達(dá)式,更簡(jiǎn)潔,雖然看起來(lái)使用了魔鬼數(shù)字。
當(dāng)然你可以省略掉那個(gè)魔鬼數(shù)字,如果僅匹配一次的話:

復(fù)制代碼 代碼如下:

x = 'this is a test'

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

這個(gè)例子中,我們匹配規(guī)則“先匹配一個(gè)元音,然后一個(gè)輔音,再接著一個(gè)元音”。

2. Array#join!的快捷實(shí)現(xiàn)

我們知道Array的*操作,是將數(shù)組里面的元素成倍的增加:

復(fù)制代碼 代碼如下:

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

但是當(dāng)乘因子不是數(shù)字是字符串會(huì)出現(xiàn)什么效果?

復(fù)制代碼 代碼如下:

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

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

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

對(duì)了,這就是join!的效果。因此可以用這種方式來(lái)快捷地實(shí)現(xiàn)join!操作。

3. 快速格式化十進(jìn)制數(shù)字

格式化浮點(diǎn)數(shù)字的精度顯示通常使用sprintf這個(gè)函數(shù),可是有一種更快捷的方式,使用字符串。

復(fù)制代碼 代碼如下:

money = 9.5

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

4. 快速解析字符串

在技巧3中我們看到了數(shù)字的格式化,這里就說(shuō)一下字符串格式的快捷方式。

復(fù)制代碼 代碼如下:

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

這里的意思是將”same old drag”顯示到[]中。
我們?cè)倏匆幌戮唧w的格式化方法:

復(fù)制代碼 代碼如下:

x = %w{p hello p}

"%s" % x # => "

hello

5. 遞歸刪除文件和目錄

FileUtils提供了這種方法:

復(fù)制代碼 代碼如下:

require 'fileutils'

FileUtils.rm_r 'somedir'

還有一個(gè)方法是FileUtils.rm_rf,與linux上的 rm -rf 對(duì)應(yīng)。

6. 快速窮舉可枚舉對(duì)象

使用*操作可以快速的窮舉出可枚舉對(duì)象中的所有元素,像Array,Hash這種對(duì)象。

復(fù)制代碼 代碼如下:

a = %w{a b}

b = %w{c d}

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

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

這里*操作符的優(yōu)先級(jí)低于+操作符。


復(fù)制代碼 代碼如下:

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. 消除臨時(shí)變量

我們有時(shí)候需要寫一個(gè)臨時(shí)變量如一個(gè)臨時(shí)的Array,有一種方式可以不用單獨(dú)定義臨時(shí)變量:

復(fù)制代碼 代碼如下:

(z ||= []) 'test'

當(dāng)然這不是一種很好的編程習(xí)慣,建議不要大量在代碼中使用。

8. 使用非字符串或非Symbol對(duì)象作為Hash的Key

或許你從來(lái)沒(méi)有嘗試過(guò)使用非String或非Symbol對(duì)象作為Hash的Key,但是確實(shí)是可以的,有時(shí)候還蠻有用。

復(fù)制代碼 代碼如下:

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

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

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

9. 使用and或or將多個(gè)操作組合到一行

這個(gè)技巧很多熟練的Ruby程序員都會(huì)使用,用來(lái)替代if和unless這種短行代碼。

復(fù)制代碼 代碼如下:

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左邊表達(dá)式“queue word”返回nil則“puts "Added to queue"”不會(huì)被執(zhí)行,要慎用。不是Geek建議不要用。

10. 判斷當(dāng)前Ruby解析器是否在執(zhí)行自己的腳本

有時(shí)候你可能需要判斷當(dāng)前的運(yùn)行環(huán)境是否在自己的Ruby腳本文件中,那么可以使用:

復(fù)制代碼 代碼如下:

if __FILE__ == $0

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

end

11. 快速地批量給變量賦值

最常用的多個(gè)變量賦值方法是:

復(fù)制代碼 代碼如下:

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

在函數(shù)中可以批量賦值,通過(guò)傳*的參數(shù):

復(fù)制代碼 代碼如下:

def my_method(*args)

  a, b, c, d = args

end

還可以批量設(shè)置成員變量:

復(fù)制代碼 代碼如下:

def initialize(args)

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

end

12. 使用range替代復(fù)雜的數(shù)字大小比較

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

復(fù)制代碼 代碼如下:

year = 1972

puts  case year

        when 1970..1979: "Seventies"

        when 1980..1989: "Eighties"

        when 1990..1999: "Nineties"

      end

13. 使用枚舉操作替換重復(fù)代碼

寫代碼最忌諱“重復(fù)”,在Ruby中有時(shí)候會(huì)require很多文件,可以使用下面的方式省去重復(fù)的require:

復(fù)制代碼 代碼如下:

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

14. 三元操作

Ruby和其他語(yǔ)言一樣,有三元操作:

復(fù)制代碼 代碼如下:

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. 嵌套的三元操作


復(fù)制代碼 代碼如下:

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的實(shí)現(xiàn)

最普通的是:

復(fù)制代碼 代碼如下:

def is_odd(x)

  # Wayyyy too long..

  if x % 2 == 0

    return false

  else

    return true

  end

end

可以簡(jiǎn)潔一點(diǎn)是:

復(fù)制代碼 代碼如下:

def is_odd(x)

  x % 2 == 0 ? false : true

end

還可以更簡(jiǎn)潔:

復(fù)制代碼 代碼如下:

def is_odd(x)

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

  x % 2 != 0

end

當(dāng)然,有時(shí)候你擔(dān)心返回的nil(ruby中的判定規(guī)則是nil為false,其他都為true),那么可以顯示轉(zhuǎn)換:

復(fù)制代碼 代碼如下:

class String

  def contains_digits

    self[/d/] ? true : false

  end

end

17. 查看異常堆棧


復(fù)制代碼 代碼如下:

def do_division_by_zero; 5 / 0; end

begin

  do_division_by_zero

rescue => exception

  puts exception.backtrace

end

18. 將一個(gè)對(duì)象轉(zhuǎn)換為數(shù)組

*操作符可以將一個(gè)對(duì)象轉(zhuǎn)換為數(shù)組對(duì)象

復(fù)制代碼 代碼如下:

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. 沒(méi)有begin的rescue塊

Ruby中捕獲異常的代碼是begin...rescue...:

復(fù)制代碼 代碼如下:

def x

  begin

    # ...

  rescue

    # ...

  end

end

但是rescue可以沒(méi)有begin:

復(fù)制代碼 代碼如下:

def x

  # ...

rescue

  # ...

end

20. 塊注釋

C和Java中的塊代碼注釋是/**/,ruby中也有類似的塊注釋:

復(fù)制代碼 代碼如下:

puts "x"

=begin

  this is a block comment

  You can put anything you like here!


  puts "y"

=end

puts "z"

21. 拋出異常

Java中拋異常是使用throw,ruby中更靈活,可以在一行代碼中直接拋異常而不中斷當(dāng)前調(diào)用棧:

復(fù)制代碼 代碼如下:

h = { :age => 10 }

h[:name].downcase                         # ERROR

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

標(biāo)簽:棗莊 甘孜 克拉瑪依 南昌 河池 大慶 西雙版納 內(nèi)江

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《21個(gè)你應(yīng)該知道的Ruby編程技巧》,本文關(guān)鍵詞  21個(gè),你,應(yīng)該,知道,的,Ruby,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《21個(gè)你應(yīng)該知道的Ruby編程技巧》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于21個(gè)你應(yīng)該知道的Ruby編程技巧的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章