免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2734 | 回复: 4
打印 上一主题 下一主题

ruby base之类型 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-13 15:31 |只看该作者 |倒序浏览
ruby base之类型







1 Array
Array也称作数组,是一系列元素的有序集合。你可以显式使用Array类的new方法来创建一个数组对象,你也可以用方括号包围起来一些以逗号分隔的数字或字符串构成一个数组。

数组可以使用 [] 来索引,其实 [] 是Array类的一个方法,它甚至可以被子类覆盖(overridden)。Ruby中比较有趣的是有多种对数组的索引方法,你可以用负数来索引数组。负数表示从尾部开始,例如索引为-1表示最后一个元素,索引为-2表示倒数第二个元素,以此类推。

你也可以使用一对数来索引数组,第一个数表示开始位置,第二数表示从开始位置起的元素数目。

你甚至可以用一个范围来索引数组,.. 表示包含尾部元素,... 表示不包含尾部元素。

slice方法很简单就像是[ ]方法的别名:
  1. x = [0, 2, 4, 6, 8, 10, 12]
  2. a = x.slice(2) # 4
  3. b = x.slice(2,4) # [4, 6, 8, 10]
  4. c = x.slice(2..4) # [4, 6, 8]
复制代码
方法first与last分别返回数组的第一个和最后一个元素。如果数组为空,它们将返回nil。这儿是一个例子:(译注:它们也可接受一个参数,用于指出从第一个开始返回几个值。)
  1. a = [ "q", "r", "s", "t" ]
  2. a.first #=> "q"
  3. a.first(1) #=> ["q"]
  4. a.first(3) #=> ["q", "r", "s"]
复制代码
2 Hash
to_a 之后为二维数组
3 Number
和C/C++相同,Ruby规定以0开头的数为八进制数,以0x开头的数为十六进制数,以0b开头的数为二进制数。

Ruby代码
  1. 1.irb(main):001:0> 16   
  2. 2.=> 16   
  3. 3.irb(main):002:0> 020#8进制   
  4. 4.=> 16   
  5. 5.irb(main):003:0> 0x10#16进制   
  6. 6.=> 16   
  7. 7.irb(main):004:0> 0b10000#二进制   
  8. 8.=> 16  
  9. irb(main):001:0> 16
  10. => 16
  11. irb(main):002:0> 020#8进制
  12. => 16
  13. irb(main):003:0> 0x10#16进制
  14. => 16
  15. irb(main):004:0> 0b10000#二进制
  16. => 16
复制代码
一个数中间可以用下划线连接,下划线自动被忽略。

Ruby代码
  1. 1.irb(main):005:0> 123_456_789   
  2. 2.=> 123456789  
  3. irb(main):005:0> 123_456_789
  4. => 123456789
  5. 4 String
  6. String也称作字符串,是单引号或双引号包围起来的一串字符。单引号和双引号的意义有所不同,双引号包围的字符作变量替换,单引号包围的变量不做替换。可以在字符串中使用 #{expr} 嵌入代码#估计一般就嵌入简单的表达式吧。

  7. 也可以使用 %q 和 %Q 来生成字符串对象。%q 相当于单引号,%Q相当于双引号。紧跟在q或Q之后的第一个字符是该字符串的分界符,从该分界符之后的第一个字符开始知道下一个相匹配(未被转义)的分界符之间的内容就组成了该字符串。如果起始分界符为(、[、{、那么与之相匹配的分界符就是)、]、}或>,否则结束分界符就是和起始分界符同样的字符。

  8. %q 和 %Q 后面的第一个字符为分隔符。二个分隔符之间的字符被认为一个是字符串。但是如果这个分隔符是 [ { <, 那么结束标志为匹配的 ] } >。
复制代码
你也可以使用“Here Document”的方法来生成字符串,这种方法规定 << 之后的字符串作为结束标志。

Ruby代码
  1. 1.string = <<END_OF_STRING   
  2. 2.With publication started in June 1948 and a current circulation of 3 million,   
  3. 3.People's Daily is the most influential and authoritative newspaper in China.   
  4. 4.According to UNESCO, it takes its place among the world top 10.   
  5. 5.END_OF_STRING  
  6. string = <<END_OF_STRING
  7. With publication started in June 1948 and a current circulation of 3 million,
  8. People's Daily is the most influential and authoritative newspaper in China.
  9. According to UNESCO, it takes its place among the world top 10.
  10. END_OF_STRING
复制代码
5 Range
Range也称作范围,用来表示一个都是连续的值的序列。可以使用 .. 和 ... 操作符来产生Range,..表示包含最后一个元素,...表示不包含最后一个元素。Range对象所属的类是Range。注意Range和
Array是不同的,可以使用Range类的to_a方法将一个Range对象转化为Array对象。

Ruby代码
  1. 1.irb(main):003:0> (1..10).to_a   
  2. 2.=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]   
  3. 3.irb(main):004:0> ('bar'..'bat').to_a   
  4. 4.=> ["bar", "bas", "bat"]   
  5. 5.irb(main):005:0> (1...10).to_a   
  6. 6.=> [1, 2, 3, 4, 5, 6, 7, 8, 9]  
  7. irb(main):003:0> (1..10).to_a
  8. => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  9. irb(main):004:0> ('bar'..'bat').to_a
  10. => ["bar", "bas", "bat"]
  11. irb(main):005:0> (1...10).to_a
  12. => [1, 2, 3, 4, 5, 6, 7, 8, 9]
复制代码
Range除了表示一个序列外还可以出现在条件语句中。在条件语句中,可以把Range看作一个双向开关,当第一个条件满足时打开开关,当第二个条件满足时关闭开关。

Ruby代码
  1. 1.a = [0, 1, 2, 3, 4, 5, 6]   
  2. 2.a.each do |i|   
  3. 3.  print i, " " if i == 1 .. i == 5   
  4. 4.end  
  5. 5.1 2 3 4 5 => [0, 1, 2, 3, 4, 5, 6]   
  6. 6.  
  7. 7.irb(main):026:0> a.each do |i|   
  8. 8.  
  9. 9.irb(main):027:1*   puts i, " " if i == 1 .. i == 5   
  10. 10.  
  11. 11.irb(main):028:1> end  
  12. 12.  
  13. 13.1   
  14. 14.2   
  15. 15.3   
  16. 16.4   
  17. 17.5  
  18. a = [0, 1, 2, 3, 4, 5, 6]
  19. a.each do |i|
  20.   print i, " " if i == 1 .. i == 5
  21. end
  22. 1 2 3 4 5 => [0, 1, 2, 3, 4, 5, 6]

  23. irb(main):026:0> a.each do |i|

  24. irb(main):027:1*   puts i, " " if i == 1 .. i == 5

  25. irb(main):028:1> end

  26. 1
  27. 2
  28. 3
  29. 4
  30. 5
复制代码
可以使用 === 来测试一个元素是否在某个范围:

Ruby代码
  1. 1.irb(main):093:0> (1..10) === 3   
  2. 2.=> true  
  3. 3.irb(main):094:0> (1..10) === 30   
  4. 4.=> false  
  5. 5.irb(main):095:0> (1..10) === 2.71828   
  6. 6.=> true  
  7. 7.irb(main):096:0> ('a'..'f') == 'c'  
  8. 8.=> false  
  9. 9.irb(main):097:0> ('a'..'f') == 'g'  
  10. 10.=> false  
  11. irb(main):093:0> (1..10) === 3
  12. => true
  13. irb(main):094:0> (1..10) === 30
  14. => false
  15. irb(main):095:0> (1..10) === 2.71828
  16. => true
  17. irb(main):096:0> ('a'..'f') == 'c'
  18. => false
  19. irb(main):097:0> ('a'..'f') == 'g'
  20. => false
复制代码
Range也可以位于case语句之内:

Ruby代码
  1. 1.score = 98   
  2. 2.case score   
  3. 3.when 85..100 then puts "A"  
  4. 4.when 70...85 then puts "B"  
  5. 5.when 60...70 then puts "C"  
  6. 6.else puts "D"  
  7. 7.end  
  8. 8.执行结果为:   
  9. 9.A  
  10. score = 98
  11. case score
  12. when 85..100 then puts "A"
  13. when 70...85 then puts "B"
  14. when 60...70 then puts "C"
  15. else puts "D"
  16. end
复制代码
执行结果为:
A
6 Symbol
Symbol是个简单的对象,它使用名字作为唯一的标识符。Symbol对象代表解释器内部一个唯一的名字。Symbol的产生:只需要给一个字符序列前添加“:”或使用“to_sym”方法。 Symbol对象从属于Symbol类。
String和Symbol两者具有紧密的联系。每个symbol都有个字符串的名字(可以使用to_s方法得到)。而每个String可以请求它的相应symbol(通过to_sym方法)。String和Symbol是紧密相联的,但它们不是同一个东西,他们分别是String类和Symbol类的对象。
因为symbol可以大大提高速度。Symbol的内部表示是一个整数,用来做Hash表中检索字符串的关键字,而Ruby语言执行时解析器、运算器需要大量的类名字、方法名字的检索,这可以大大加快解析和执行时字符串查找的速度。
想想,如果没有Symbol,如果需要用方法名称作为参数时,我们必须给一个字符串用来表示方法的名称,解释器处理时首先要作字符串解析,然后才能找到出相应的方法,而如果使用Symbol会大大加快这一速度。
在使用中,Symbol往往表示一个名字,例如一个变量 foo的值为1,那么 :foo可以理解为变量名,如果直接引用foo,会得到1,但如果是 :foo就指变量名本身。
Symbol对象是唯一的。每次你在代码中使用:test, 你是要引用一个名字为"test"的Symbol类的对象。Ruby保证系统中只有一个名字为test的Symbol对象, 所以所有对:test的引用都将引用同一个对象。

Ruby代码
  1. 1.module One   
  2. 2.  class Test   
  3. 3.  end  
  4. 4.  $f1 = :Test   
  5. 5.end  
  6. 6.=> :Test   
  7. 7.module Two   
  8. 8.  Test = 1   
  9. 9.  $f2 = :Test   
  10. 10.end  
  11. 11.=> :Test   
  12. 12.def Test()   
  13. 13.end  
  14. 14.=> nil  
  15. 15.$f3 = :Test()   
  16. 16.=> :Test   
  17. 17.$f1.object_id   
  18. 18.=> 4   
  19. 19.$f2.object_id   
  20. 20.=> 4   
  21. 21.$f3.object_id   
  22. 22.=> 4  
  23. module One
  24.   class Test
  25.   end
  26.   $f1 = :Test
  27. end
  28. => :Test
  29. module Two
  30.   Test = 1
  31.   $f2 = :Test
  32. end
  33. => :Test
  34. def Test()
  35. end
  36. => nil
  37. $f3 = :Test()
  38. => :Test
  39. $f1.object_id
  40. => 4
  41. $f2.object_id
  42. => 4
  43. $f3.object_id
  44. => 4
复制代码
[如果你用大写字母开头定义一个方法,你不会立即得到一个错误,但是当你调用这个方法时,Ruby首先认为你访问的是一个常量,所以可能会解析错误]
=结尾:赋值方法,相当于其他编程语言的set开头的方法,算是一种语法蜜糖。
!结尾:破坏性方法,调用这个方法会修改本来的对象,这种方法通常有个非破坏性的版本,调用非破坏性的版本会回传一个对象的副本。
?结尾:表示这个函数的回传值是个布林值。
7 正则表达式
正则表达式的类是Regexp,可以使用/或%r生成正则表达式。

Ruby代码
  1. 1.irb(main):103:0> a = /\s*[a-f]/   
  2. 2.=> /\s*[a-f]/   
  3. 3.irb(main):104:0> a.class  
  4. 4.=> Regexp  
  5. 5.irb(main):105:0> b = %r{\s*[a-f]}   
  6. 6.=> /\s*[a-f]/   
  7. 7.irb(main):106:0> b.class  
  8. 8.=> Regexp  
  9. 9.irb(main):107:0> c = Regexp.new('\s*[a-f]')   
  10. 10.=> /\s*[a-f]/   
  11. 11.irb(main):108:0> c.class  
  12. 12.=> Regexp  
  13. irb(main):103:0> a = /\s*[a-f]/
  14. => /\s*[a-f]/
  15. irb(main):104:0> a.class
  16. => Regexp
  17. irb(main):105:0> b = %r{\s*[a-f]}
  18. => /\s*[a-f]/
  19. irb(main):106:0> b.class
  20. => Regexp
  21. irb(main):107:0> c = Regexp.new('\s*[a-f]')
  22. => /\s*[a-f]/
  23. irb(main):108:0> c.class
  24. => Regexp
复制代码
你可以使用Regexp#match(string)方法或者=~运算符来匹配正则表达式,你也可以使用!~来测试是否不匹配。

Ruby代码
  1. 1.irb(main):113:0> sentence = "This is a dog."  
  2. 2.=> "This is a dog."  
  3. 3.irb(main):114:0> sentence =~ /dog/   
  4. 4.=> 10   
  5. 5.irb(main):115:0> sentence =~ /a/   
  6. 6.=> 8   
  7. 7.irb(main):116:0> /a/ =~ sentence   
  8. 8.=> 8   
  9. 9.irb(main):117:0> sentence !~ /xyz/   
  10. 10.=> true  
  11. irb(main):113:0> sentence = "This is a dog."
  12. => "This is a dog."
  13. irb(main):114:0> sentence =~ /dog/
  14. => 10
  15. irb(main):115:0> sentence =~ /a/
  16. => 8
  17. irb(main):116:0> /a/ =~ sentence
  18. => 8
  19. irb(main):117:0> sentence !~ /xyz/
  20. => true
复制代码
另外,在匹配正则表达式时,会将匹配到的字符串存放在 $& 变量中,$`变量中存放已经匹配过的字符序列,$'变量中存放还未匹配的字符序列。#教材上明显错误哈

Ruby代码
  1. 1.irb(main):118:0> sentence = "This is a dog."  
  2. 2.=> "This is a dog."  
  3. 3.irb(main):119:0> sentence =~ /a/   
  4. 4.=> 8   
  5. 5.irb(main):120:0> puts $&   
  6. 6.a   
  7. 7.=> nil  
  8. 8.irb(main):121:0> puts $'   
  9. 9.dog.   
  10. 10.=> nil  
  11. 11.irb(main):122:0> puts $`   
  12. 12.This is   
  13. 13.=> nil  
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-02-13 15:32 |只看该作者
谢谢分享

论坛徽章:
0
3 [报告]
发表于 2012-02-15 08:19 |只看该作者
谢谢分享

论坛徽章:
3
寅虎
日期:2013-11-27 07:53:29申猴
日期:2014-09-12 09:24:152015年迎新春徽章
日期:2015-03-04 09:48:31
4 [报告]
发表于 2012-02-15 09:43 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2012-02-16 08:32 |只看该作者
很详细了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP