在 1.9.3 中,直接使用 Random.rand(100..999) 生成区间内的随机数,1.9.2 需要使用实例方法 Random.new.rand(100.999)
标签归档:Ruby
使用 ri 命令查看 API
经常去 APIDOCK.COM 查询标准 API,今天访问时忽然变得很慢,忽然想起 Ruby 有自己的 Rdoc,是不是能自己生成一个本地的文档呢。
隐约记得有两种方法查看本地文档,一个是使用 ri 命令,一个是用 Rdoc 生成 Html 格式的文件在浏览器中查询。ri 文档基于 Rdoc 来生成。我更喜欢使用命令行格式的,不过直接 ri 了一下,只有几个 gem 的文档,没有 Ruby 核心和标准库的。我用的是 rvm,rvm 安装 rubies 后并不会自动生成 rdoc,还需要手动生成。
删除 gem 文档
因为 ri method 会列出所有包含 method 的 gem,为了不让输出显得凌乱,需要把默认的 gem 的 doc 全部去掉,这些 gem 很多只是为了解决依赖自动下载的并不常用,也不需要。先贴一下 gem 环境
abc@abc-desktop:~$ gem env
RubyGems Environment:
- RUBYGEMS VERSION: 1.6.2
- RUBY VERSION: 1.9.2 (2011-02-18 patchlevel 180) [i686-linux]
- INSTALLATION DIRECTORY: /home/abc/.rvm/gems/ruby-1.9.2-p180
- RUBY EXECUTABLE: /home/abc/.rvm/rubies/ruby-1.9.2-p180/bin/ruby
- EXECUTABLE DIRECTORY: /home/abc/.rvm/gems/ruby-1.9.2-p180/bin
- RUBYGEMS PLATFORMS:
- ruby
- x86-linux
- GEM PATHS:
- /home/abc/.rvm/gems/ruby-1.9.2-p180
- /home/abc/.rvm/gems/ruby-1.9.2-p180@global
- GEM CONFIGURATION:
- :update_sources => true
- :verbose => true
- :benchmark => false
- :backtrace => false
- :bulk_threshold => 1000
- REMOTE SOURCES:
- http://rubygems.org/
进入 GEM PATHS 即 ~/.rvm/gems/ruby-1.9.2-p180/doc 中执行 rm -rf 删除掉所有文档。
gem 安装时选择 gem install gemname --no-ri --no-rdoc 可以避免生成文档,如果不想每次麻烦输入,执行 echo 'install: --no-rdoc --no-ri' > ~/.gemrc 新建并写入配置文件即可。
rvm 的 gem 默认会从 ~/.vimrc 以及 $ruby_path/etc/gemrc 下读取配置文件。后者可以通过 IRB 中执行 Gem::ConfigFile::SYSTEM_WIDE_CONFIG_FILE 查看。
安装 Rdoc/ri 文档
删除 gem 文档后,使用 rvm doc generate 生成当前版本 Ruby 的文档,涵盖核心类和标准库。生成的 Html 文档会存放在 /.rvm/docs 下。
命令 ri 的使用示例:
ri Array#sort ri IO.readlines ri String ri gsub ri File::dirname
还可以加入一些常用的 gem 的文档,比如 nokogiri,gem rdoc nokogiri -v 1.5.0
Ruby case 语句与关联操作符
Ruby 中的 case 比其他语言有些不同,在类似 C 等传统的 switch…case 结构之外,还有比较高级的扩展用法。
Case 语句用法
最基本的 case 语句用法为
case str
when 'a'
puts 'str is a'
when 'b'
puts 'str is b'
end
或者不提供参数
case
when str == 'a'
puts 'str is a'
when str == 'b'
puts 'str is b'
end
此种情况下,case 类似于多路 if…elsif 语句,不同点是 case 中当前边的 when 分支满足符合条件后即返回,不会执行下边的语句。因为 when 可以有返回值,所以上面的情况也可以写为:
puts case str
when 'a'
'str is a'
when 'b'
'str is b'
end
case 语句的条件与表达式事实上是由关联操作符(relationship operator)“===” 来进行比较的,类似
case expression
when value
some_action
end
这样的结构,与下边这个是等价的
if value === expression some_action end
此外 when 中可以接受多个条件,使用逗号分隔,各条件分别使用 === 操作符与 case 后的表达式比较,只要条件之一满足,就执行后面的代码,比如:
case x when 0, nil, “”, [] # do something end
=== 操作符
=== 操作符在不同的类中有不同的含义,大多数时候,它和 == 是相同的,但是有些情况下,比如 Regexp 类中,=== 代表 =~ 的意思
/abcd/ === "abcdefg" # => true
Range 类中,=== 表示对象是否落在区间内
(1..9) === 3 # => true
有趣的是在 Proc 类中,=== 表示执行该 proc 代码,相当于 call 方法
multiple_of_10 = proc { |n| (n % 10) == 0 }
multiple_of_10 === 20 #=> true (equivalent to multiple_of_10.call(20))
因为不同的类对 === 有不同的定义,所以 === 操作符两侧的表达式并不总是可以互换。比如 String 类定义的 === 方法与 == 方法等价,但 Regexp 类中, === 是 =~ 的意思。所以当如下两段代码执行结果并不相同:
case "Hello"
when /Hell/
puts "We matched."
else
puts "We didn't match."
end
# => "We matched."
case /Hell/
when "Hello"
puts "We matched."
else
puts "We didn't match."
end
# => "We didn't match."
Ruby 使用 SSL 提交 POST
使用 net/https 标准库,注意需要本地 CA 文件,否则无法通过服务端认证。代码使用人人网开放平台的 password 认证作为示例,环境为 ruby 1.92, ubuntu 10.04:
require 'net/https'
http = Net::HTTP.new('graph.renren.com', 443)
http.use_ssl = true
http.ca_path = '/etc/ssl/certs' # ubuntu 默认的 CA 公共验证文件存放地址
res = http.post('/oauth/token', 'grant_type=password&username=abc@123.com&password=123456&client_id={your_api_key}&client_secret={your_secret_key}&scope=read_user_blog')
人人网 password 允许测试用户使用,其中需要注意,必须添加一个小号作为测试用户,开发用户角色无此权限。另外,应用必须在沙盒状态开启时,才可以使用此权限。
参考页面:http://martinottenwaelter.fr/2010/12/ruby19-and-the-ssl-error/
ruby 192 版本 win32ole 代码页问题
C:\>ruby -v ruby 1.9.2p0 (2010-08-18) [i386-mingw32]
查看本地语言集
C:\>set LANG LANG=zh_CN
irb 加载 win32ole 报错
C:\>irb
irb(main):001:0> require 'win32ole'
WIN32OLERuntimeError: codepage should be WIN32OLE::CP_ACP, WIN32OLE::CP_OEMCP, W
IN32OLE::CP_MACCP, WIN32OLE::CP_THREAD_ACP, WIN32OLE::CP_SYMBOL, WIN32OLE::CP_UT
F7, WIN32OLE::CP_UTF8, or installed codepage.
from <internal:lib/rubygems/custom_require>:29:in `require'
from <internal:lib/rubygems/custom_require>:29:in `require'
from E:/Ruby/lib/ruby/1.9.1/win32ole.rb:1:in `<top (required)>'
from <internal:lib/rubygems/custom_require>:29:in `require'
from <internal:lib/rubygems/custom_require>:29:in `require'
from (irb):1
from E:/Ruby/bin/irb:12:in `<main>'
irb(main):002:0>
google 了半天,发现一个类似情况 http://bit.ly/k4gA4c 查看本地环境变量, 并未定义 lc_ALL ,不过定义了 LANG=zh_CN, 更改 LANG=zh_CN.gbk
C:\>set LANG=zh_CN.gbk
重新加载win32ole,成功
C:\>irb irb(main):001:0> require 'win32ole' => true
参考文章: http://hi.baidu.com/grick/blog/item/f762afc3ab1c3b4cb319a8ff.html