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