閱讀558 返回首頁    go 阿裏雲 go 技術社區[雲棲]


ruby:借助第三方類名如何查找第三方gem名稱(zlib為例)

    rubygem中含有成千上萬的第三方gem,網上書上擴展教程中都有指導如何使用第三方gem的例子。但是如果不幸這些例子都沒有提及gem名稱的話,如何隻憑第三方類名或require名查找gem名稱呢?換句話說,我怎麼知道要intall神馬gem呢?

    舉個例子來看《ruby之道》p60頁有一個使用字符串壓縮功能的第三方類,書上例子中有如下代碼:

require ‘zlib’
include Zlib

真難為人啊!?我用gem search zlib -r搜索的結果如下:

apple@kissAir: ~$gem search zlib -r


*** REMOTE GEMS ***


ffi-zlib (0.2.0)

pr-zlib (1.0.0)

rubysl-zlib (2.0.1)

sprout-fzlib-library (1.0.0)

zlib-crc32_combine (1.0.2)

zlib-socs (0.1)

Zliby (0.0.5)

zliby (0.0.5)


到底應該用哪個呢?這個真不好說,那麼到https://ruby-doc.com/gems去看看吧!我們當然選擇Z開頭的gem,找到Zliby比較像,進去看看,發現含有Zlib模塊,我才zliby和Zliby是一碼事(他們版本號都一樣哎)我們就用zliby啦:

gem install zliby -r

很快gem安裝完畢,下麵上測試代碼:

#!/usr/bin/ruby

require 'zlib'
include Zlib

str = ("aa0".."zz9").to_a.join*1000
puts "str.size is #{str.size}"

class Deflate
	class << self
		alias old_deflate deflate

		def deflate(str,level=DEFAULT_COMPRESSION)
			t = Time.now
			s=old_deflate(str,level)
			puts "#{__callee__} takes #{Time.now - t}s"
			s
		end
	end
end

#壓縮
s1 = Deflate.deflate(str,BEST_SPEED)
s2 = Deflate.deflate(str)
s3 = Deflate.deflate(str,BEST_COMPRESSION)

puts "s1.size:#{s1.size} s2.size:#{s2.size} s3.size:#{s3.size}"

#解壓縮
us = Inflate.inflate(s3)
puts "us.size is #{us.size}"
puts "#{us == str}"


為了計算deflate方法運行時間,我重寫了該方法,並在其中調用原來的方法。最後是運行結果:

apple@kissAir: ruby_src$./dzh.rb

str.size is 20280000

deflate takes 0.075283s

deflate takes 0.154147s

deflate takes 0.166407s

s1.size:276965 s2.size:160761 s3.size:160761

us.size is 20280000

true


最後更新:2017-04-03 05:39:37

  上一篇:go [數據庫]ROW_NUMBER() OVER函數的基本用法
  下一篇:go 雙緩衝DoubleBuffered解決閃爍問題