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)


到底应该用哪个呢?这个真不好说,那么到http://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

ruby:借助第三方类名如何查找第三方gem名称(zlib为例)的更多相关文章

  1. 整理Ruby相关的各种概念(rvm, gem, bundle, rake, rails等)

    转自:http://henter.me/post/ruby-rvm-gem-rake-bundle-rails.html Ruby 这个就不用多说了 RVM 用于帮你安装Ruby环境,帮你管理多个Ru ...

  2. webpack指定第三方模块的查找路径

    通常我们会使用一些地方模块在我们的项目中,比如bootstrap import 'bootstrap' 导入的bootstrap默认会查找当前目录的node_modules文件,但是如果这个文件没有, ...

  3. CMake查找第三方库路径

    问题 一直都有一个问题,就是基于Windows下使用CMake构建VS工程时,CMake是如何查找到第三方库所在的路径的呢? 答案 今天重新想起这个问题,就拿构建Vtk的VS工程测试了一下, 才发现是 ...

  4. 查找第三方银行官方app下载链接探索过程

    需求:最近有个需求,点击按钮,弹出一个所需银行选项的非全屏弹出层,再点击某银行选项,随即跳转到该银行的app下载界面,如下图所示           注:这里只是引用相关银行的链接,不需要做什么逻辑处 ...

  5. 解决ruby安装后无法添加淘宝gem源------------学习记录

    使用sass ,需要安装ruby,会建议移除gem源,添加淘宝的gem源,但是淘宝的镜像源已经停止维护啦!!用https://gems.ruby-china.com 代替即可. 操作如下: 1)删除原 ...

  6. Unity 下集成第三方原生 SDK,以极光厂商通道为例

    Unity中集成三方SDK有两种方式: Unity 项目开发中时常有集成 Android 第三方 SDK 的需求,比如接入第三方推送,分享等功能.而第三方 SDK 的集成文档提到的往往是基于原生 An ...

  7. 如何在app里利用js调取手机第三方地图--以高德地图和百度地图为例(2)

    接着上篇文章说一下js调取第三方地图的问题,上次的方式是通过一个链接直接接到了第三方的web页面,又从第三方的web页面调用的第三方app;结果,这个方法被否定了,因为需求不是这样,需求直接就想调用第 ...

  8. flutter 引入第三方 Icon 图标(以阿里图标库为例)

    在fluttter中引入第三方图标库的具体方法: 1.在阿里图标库选好需要用的图标,添加进购物车将选好的图标打包下载到本地(下载代码),复制iconfont.ttf文件到项目中 2.存放途径:lib/ ...

  9. 基于MFC的Media Player播放器的制作(2---导入第三方库和介绍第三方库)

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. 这一节我们介绍如何导入类库,和介绍类库的一功能和介绍MFC的一些主要的模块部分.下面是如何导入类库.第一步我们选中 Media Playe ...

随机推荐

  1. Android 增量更新和升级

    在年初的时候,尝试了一把热修复技术,当时选择的是阿里的andfix,使用起来也很简单,这里就不在多少,如果你对andfix有兴趣请链接:点击打开链接.虽然网上将热修复的文章很多,不过我还是想说原理,然 ...

  2. 2.0、Android Studio编写你的应用

    Android Studio包含了每个开发阶段的各种工具,但是最重要就是编写代码. 高效编码 接下来的是能够帮助你高效编程的方法. 使用Lint快速修复 Android Studio提供一个叫Lint ...

  3. 通过一个color创建一个image

    使用的地方: [_addButton setBackgroundImage:[UIImage imageWithColor:[[UIColor whiteColor] colorWithAlphaCo ...

  4. Android下拉列表控件spinner-andoid学习之旅(十一)

    废话不多说,下拉列表常用的就是spinner控件. 直接上代码: package peng.liu.testview; import android.app.Activity; import andr ...

  5. XMPP即时通讯资料记录

    几天开始研究XMPP即时通讯的技术,来实现移动应用的计时聊天功能.记录下参考的博客地址,还挺详细的. http://blog.csdn.net/fhbystudy/article/details/16 ...

  6. 【一天一道LeetCode】#113. Path Sum II

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  7. Mybatis源码之Statement处理器CallableStatementHandler(六)

    CallableStatementHandler实际就是使用CallableStatement来执行SQL语句,当然它执行的是存储过程. 源码如下: /** * @author Clinton Beg ...

  8. Uva - 816 - Abbott's Revenge

    这个迷宫问题还是挺好玩的,多加了一个转向的问题,有些路口不同的进入方式会有不同的转向限制,这个会比较麻烦一点,所以定义结点结构体的时候需要加一个朝向dir.总体来说是一道BFS求最短路的问题.最后打印 ...

  9. 15-5-23 下午02时22分58秒 CST> <Info> <Management> <BEA-141281> <unable to get file lock, will retry ...>

     A-141281> <unable to get file lock, will retry ...>   http://gdutlzh.blog.163.com/blog/s ...

  10. Linux IPC实践(3) --具名FIFO

    FIFO具名/命名管道 (匿名)管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信. 如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道;命 ...