Archive for the ‘ruby学习教程’ Category
星期五, 09月 12th, 2008
既然可以把对象或一组对象序列化到一种适合进程外存储的形式,也可以使用这个能力把对象从一个进程发送到另外一个进程。把这个本领和联网的威力结合起来,为了避免自己写代码的麻烦,我们建议使用Masatoshi Seki的分布式Ruby库(drb),它现在是一个标准的Ruby库。
使用drb的Ruby进程可能会作为服务器、客户机或者两者都是。drb服务器是对象的源,而客户机是对象的使用者。对客户机来说,这些对象表现为本地对象,但是实际上代码依然再远程执行。
服务器通过将对象与一个给定的端口相关联来启动服务。线程在内部被创建来处理对这个端口的请求,因此当退出程序时,请记住等待(join)drb线程终止。
- require 'drb'
- class TestServer
- def add(*args)
- args.inject {|n,v| n+v}
- end
- end
- server = TestServer.new
- DRb.start_service('druby://localhost:9000', server)
- DRb.thread.join # Don't exit just yet!
一个鉴定的drb客户机只是创建一个本地的drb对象,并把它与在远程服务器上的对象关联起来,这个本地对象只是一个代理(proxy)
- require 'drb'
- DRb.start_service()
- obj = DRbObject.new(nil, 'druby://localhost:9000')
- # Now use obj
- puts "Sum is: #{obj.add(1,2,3)}"
客户机连接上服务器并调用add方法,这个方法使用inject魔法(magic)对它的参数和。
Tags: ruby, 分布式
Posted in ruby学习教程 | No Comments »
星期四, 09月 4th, 2008
Ruby中TCPServer是一个用来建立TCP服务端的类,如下代码打开本机的9999端口提供tcp协议的服务。
- require 'socket'
- server = TCPServer.new('', 9999)
- server.close
Ruby中Socket相关类的关系如图

下面的代码使用TCPServer建立了一个9527端口的TCP服务,使用多线程等待用户的连接,服务端和客户端可以相互通讯,只是一个简单的应用。
注:其中的“IPSocket#peeraddr”方法以数组形式返回套接字的连接信息。数组的第1元素是”AF_INET”字符串,第2元素是port号,第3元素是表示主机的字符串,第4元素是表示主机IP地址的字符串(octet decimal)。
(more…)
Tags: ruby, tcpserver, 应用
Posted in ruby学习教程 | No Comments »
星期四, 09月 4th, 2008
Rdoc是Ruby官方的API在线查询系统

Tags: api, rdoc
Posted in ruby学习教程 | No Comments »
星期五, 08月 29th, 2008
Ruby语言里的基本命名习惯,这些习惯不一定事语法要求,但会给程序提供更好的可读性。
- 类:类名通常以大写字母开头,后门部分可以是字母和数字,也可以是下划线。但通常我们定义一个类名时,不会使用下划线和数字,而是直接使用一个或多个单词来命名。如果类名包含多个单词,则多个单词的首字母大写。
- 模块:模块名通常以大写字母开头,后门部分可以是字母和数字,也可以是下划线。但通常我们定义一个模块名时,不会使用下划线和数字,而是直接使用一个或多个单词来命名。如果模块名包含多个单词,则多个单词的首字母大写。
- 局部变量:局部变量通常以小写字母或者下划线(_)开头,后面部分可以是字母和数字,也可以是下划线。
- 实例变量:实例变量通常以“@”符号开头,后门部分可以是字母和数字,也可以是下划线。
- 常量:通常认为以大写字母开头的是常量,但实际上我们通常将常量的所有字母全部大写,即常量名全部由大写字母组成。
- 方法:方法名通常以小写字母或者下划线(_)开头,后门部分可以是字母和数字,也可以是下划线。如果方法名的首字母大写,即使调用方法时不带参数,也不能省略方法名后的空括号。
Tags: ruby, 变量, 常量, 类名
Posted in ruby学习教程 | No Comments »
星期二, 08月 26th, 2008
Ruby使用ASCII字符来做为标识符,Ruby是区分大小写的语言。
Ruby的标识符用于命名Ruby的变量、类、模块、方法、等。Ruby的局部变量、实例变量、类变量、全局变量喝常量都有一套固定的命名规则,这样我们可以通过区分Ruby变量名的首位字符来确定它是局部变量、全局变量、实例变量、类变量还是常量。
- 以“$”开头的变量:全局变量。
- 以“@”开头的变量:实例变量。
- 以“@@”开头的变量:类变量。
- 以小写字母或者下划线(_)开头的变量:局部变量。
- 以大写字母开头的变量:常量。
通常情况下,标识符的第二位字符以后后以是字母、数字、或下划线,但有的内部变量名比较特殊,还可以是“$”或者“?”通常,变量名长度只受内存大小的限制。
Ruby的类、方法、常量、变量等都有一套严格的命名规则,通过这些命名规则,可以减少标识符命名错误。
注意,保留字不可用做类名和变量名,Ruby语言中的保留字如下:
BEGIN class ensure nil self when
END def false not super while
alias defined? for or then yield
and do if redo true
begin else in rescue undef
break elsif module retry unless
case end next return until
如果在浙西保留字前增加$ ,@ , @@等前缀,则该标识符就不再是保留字,可以作为相应的全局变量、实例变量、类变量名使用。如在def方法定义后、或方法调用炒作符“,”后出现这些保留字,则可确定它们是方法名,就可使用Ruby保留字作为方法名。
Ruby的保留字不可以作为变量名和类名,但可以作为方法名。
Tags: ruby, 变量, 常用, 标识符
Posted in ruby学习教程 | No Comments »
星期日, 08月 3rd, 2008
在ruby中类所最常见的对象,每个类都是类Class来的实例。当定义一个信的类时通常使用class Name — end ,Class类型的一个对象将被创建,并赋值给一个常量,当调用Name.new创建一个新对象时,在运行新对象的initialize方法前,默认情况下Class的实例方法new将运行,它会调用allocate来为对象分配内存。
- Object.const_get( "String") or Object.const_get( :String)
-
- s = eval("String" ).new
-
- foo.constanize.new()
Tags: class, initialize, ruby, 实例, 对象, 常量, 方法
Posted in ruby学习教程 | No Comments »
星期二, 07月 29th, 2008
几个ruby使用法的性能探索
1、数组的 [] 和 at 这两个方法取元素的性能比较,请给出论证,谁的效率更高?
2、看下面代码,
- a=[]
- for x in 1..100
- a<<x
- end
- 和
- a=Array.new(100)
- for x in 1..100
- a<<x
- end
请分析这两段代码的区别(主要从性能和效率的角度分析)
3、数组的 <=> 与 == 和eql? 三个方法到底是如何比较的?相互有什么关系?有什么区别?
开始讨论
Tags: ROR, ruby, ruby on rails, rubyrails, Web, web 开发
Posted in ruby学习教程 | No Comments »
星期日, 07月 20th, 2008
$0 :当前脚本名称
$: :动态库路径
$& :[正则表达式]与模式匹配的那部分
$` :(反引号)[正则表达式]与模式匹配之前的那部分
$’ :[正则表达式]与模式匹配之后的那部分
$~ :[正则表达式]是MatchData对象,它持有有关匹配的所有信息
$1…… :[正则表达式]持有匹配各个部分的值
$+ :[正则表达式]成功模式匹配产生的最高序号的组的内容
$/ :输入记录分隔符
$-0 :同$/的同义词
$\ :附后加到方法调用的输出结果的字符串。默认为nil(如kernel#print,IO#write)
$, :输出的分隔符,默认为nil
$. :从当前输入文件中读入的最后一行的行号
$; :String#split使用的默认分隔模式
$> :Kernel#print 和Kernet#printf的输出目标
$< :输入的内容
$_ :Kernel#gets或者Kernel#readline读入的最后一行[thread]
$stderr
$stdin
$stdout
$* :调用参数(除了ruby使用的参数)
$” :包含require装载的文件名或者模块名
__FILE__ :当前源文件名
$FILENAME :当前输入的文件的名字
$ARGF :同$<
$ARGV :同$*
ENV :包含了所有的环境变量的值
Tags: javascripts, rails框架研究, ROR, ruby, web 开发, 敏捷, 脚本, 语言
Posted in ruby学习教程 | No Comments »
星期五, 07月 18th, 2008
转道友Blog中的一小段code说明ruby中的闭包
Ruby代码
procs = []
(1..3).each do |i|
procs << lambda { puts i }
end
procs.each { |p| p.call }
# Output:
# 1
# 2
# 3
###############################################
procs = []
for j in (1..3) do
procs << lambda { puts j }
end
procs.each { |p| p.call }
# Output:
# 3
# 3
# 3
为什么是上面的结果?首先这是因闭包所引起;
在Ruby 1.8.x中,与each迭代器关联的block里的变量是局部变量,每次each中使用yield来调用block时,block都会创建新的局部变量。而for与each的区别就是在循环变量的作用域上:for被展开后,先定义了一个局部变量,然后再调用each迭代器。也就是主产for实际上只产生了一个j局部变量,而each每循环一次则产生一个。
Tags: block, ruby, 变量, 闭包
Posted in ruby学习教程 | No Comments »
星期四, 07月 17th, 2008
- def trc_utf8(text, length = 40, t_string = "...")
- l=0
- char_array=text.unpack("U*")
- char_array.each_with_index do |c,i|
- l = l+ (c<127 ? 0.5 : 1)
- if l>=length
- return char_array[0..i].pack("U*")+(i<char_array.length-1 ? t_string : "")
- end
- end
- return text
- end
Tags: ruby, 中文, 方法
Posted in ruby学习教程 | No Comments »