ruby 标准类型总结

一、数字

  1. Ruby支持整数和浮点数,整数可以是任意长度
  2. 一定范围内的整数以二进制存放,它们属于fixnum类型,当超出这个范围时则自动转换为bignum类型
  3. 表达方式:符号+一串字符,数字串中的下划线会被忽略,(前缀包括:0表示八进制, 0x表示十六进制, 0b表示二进制)123_456_789_123_345_789 # Bignum
    0xaabb # 十六进制
  4. 也可以通过在前面加上问号来得到ASCII码字符对应的整数值和转义序列的值
    ?a # 普通字符
    ?\n # 换行符 (0x0a)
    ?\C-a # CTRL+a (0x01)
    ?\M-a # ALT+a
    ?\M-\C-a # CTRL+ALT+a
    ?\C-? # 删除键
  5. 一个带小数点的数字字面值被转换成Float对象
  6. 所有的数字都是对象,不存在相应的函数而是方法
    exp:
    数字的绝对值是aNumber.abs而不是abs(aNumber)
  7. 整数有用的迭代器
    3.times { print "X " } => X X X 1.upto(5) { |i| print i, " " } =>1 2 3 4 5 99.downto(95) { |i| print i, " " }=>99 98 97 96 95 50.step(80, 5) { |i| print i, " " }=>50 55 60 65 70 75 80

二、字符串

  1. Ruby的字符串是8位字节的简单序列,字符串是String类的对象
  2. 注意转换机制(注意单引号与双引号的区别),如:
    单引号中两个相连的反斜线被替换成一个反斜线,,一个反斜线后跟一个单引号被替换成一个单引号
    'escape using "\\"' >> 转义为"\" 'That\'s right' >> That's right

  3. 双引号支持多义的转义
    "\n"
    #{expr}序列来替代任何的Ruby表达式的值 ,(全局变量、类变量或者实例变量,那么可以省略大括号)
    "Seconds/day: #{24*60*60}" >> Seconds/day: 86400 "#{'Ho! '*3}Merry Christmas" >> Ho! Ho! Ho! Merry Christmas "This is line #$." >> This is line 3
  4. here document来创建一个字符串,end_of_string 为结束符号
    aString = <<END_OF_STRING The body of the string is the input lines up to one ending with the same text that followed the '<<' END_OF_STRING
  5. %q和%Q分别把字符串分隔成单引号和双引号字符串(即%q与%Q后面的符号具有',"的功能)
    %q/general single-quoted string/ >> general single-quoted string
  6. String 常用功能
    String#split:把行分解成字段
    String#chomp:去掉换行符
    String#squeeze:剪除被重复输入的字符
    String#scan:以指定想让块匹配的模式
    exp:
    /jazz/j00132.mp3 | 3:45 | Fats Waller | Ain't Misbehavin'
    /jazz/j00319.mp3 | 2:58 | Louis Armstrong | Wonderful World
    #文件格式如上,要进行分解
    songs = SongList.new
    songFile.each do |line|
    file, length, name, title = line.chomp.split(/\s*\|\s*/)#先chomp,后再分解,/\s*表示任字符
    name.squeeze!(" ")#替换空格
    mins, secs = length.scan(/\d+/)#这里用scan匹配模式
    songs.append Song.new(title, name, mins.to_i*60+secs.to_i)
    end

三、区间

  1. 区间存在于任何地方,如:1到12月。ruby用区间实现了3个不同的特性:序列,条件,间隔。
  2. "..":两个点号创建一个闭区间,"...":而三个点号创建一个右开区间(即右边界不取值)
    exp:0..anArray.length-1 等同于 0...anArray.length
  3. to_a 把区间转换成列表
    exp: ('bar'..'bat').to_a >> ["bar", "bas", "bat"]
  4. 区间的共它的用法
    digits = 0..9
    digits.include?(5) >> true
    digits.min >> 0
    digits.max >> 9
    digits.reject {|i| i < 5 } >> [5, 6, 7, 8, 9]
    digits.each do |digit|
    dial(digit)
    end
  5. ruby能把基于自己定义的对象的区间,要求:这个对象必须能够响应succ方法来返回序列中的下一个对象,并且这个对象必须能够使用<=>运算符来被比较,即常规的比较运算符,
  6. 间隔测试
    puts (1..10).include?(3.14)=> ture
    puts (1..10) === 3.14 => ture

四、正则表达式

  1. 正则表达式是Regexp类型的对象,可以使用构造器显式地创建一个正则表达式,也可以使用字面值形式/pattern/和%r\pattern\来创建
  2. 用Regxp#match(aString)的形式或者匹配运算符=~(正匹配)和!~(负匹配)来匹配字符串了。匹配运算符在String和Regexp中都有定义,如果两个操作数都是字符串,则右边的那个要被转换成正则表达式
    exp:
    a = "Fats Waller"
    a =~ /a/ >> 1
    a =~ /z/ >> nil
    a =~ "ll" >> 7
  3. 上面返回的是匹配字符的位置,其它
    $&接受被模式匹配到的字符串部分
    $`接受匹配之前的字符串部分
    $'接受之后的字符串。
    exp:下面的方法后继都会用到
    def showRE(a,re)
    if a =~ re
    "#{$`}<<#{$&}>>#{$'}" #返回前、中、后
    else
    "no match"
    end
    end

  4. 模式,任何一个表达式都包含一个模式,它用来把正则表达式和字任串匹配
    模式中除了., |, (, ), [, {, +, \, ^, $, *,和?以外的字任都匹配它自己
    如果要匹配这些特殊的字符就需要加上反斜线做前缀,分析上面例字
    /\s*\|\s*/,在\s与|之前都加了/做前缀。
    showRE('kangaroo', /angar/) >> k<<angar>>oo
    showRE('!@%&-_=+', /%&/) >> !@<<%&>>-_=+
    showRE('yes | no', /\|/) >> yes <<|>> no

  5. \后跟一个字母或数字表示一个特定的结构如\s表示字符等。
  6. 锚点 一个正则表达式总是返回找到模式的第一个匹配,如何改变?
    模式^和$分别用来匹配行首和行尾
    序列\A匹配字符串开始的位置,\z和\Z匹配字符串结尾的位置
    \b和\B分别匹配字边界和非字边界
    showRE("this is\nthe time", /^the/) >> this is\n<<the>> time
    showRE("this is\nthe time", /is$/) >> this <<is>>\nthe time
    showRE("this is\nthe time", /\Athis/) >> <<this>> is\nthe time

五、字符类

  1. 这里的字符类不是面向对象的类,只表示这些这字符属于一个特殊的种类
  2. 字符类是用方括号扩起来的字符的集合:[characters]匹配方括号中的所有单字符。[aeiou]匹配元音,[,.:'!?]匹配标点符号等等
    showRE('It costs $12.', /[aeiou]/) >> It c<<o>>sts $12.
  3. 在方括号中的序列c1-c2表示在c1-c2之间也包括c1和c2的所有字符
    a = 'Gamma [Design Patterns-page 123]'
    showRE(a, /[]]/) >> Gamma [Design Patterns-page 123<<]>>
    showRE(a, /[B-F]/) >> Gamma [<<D>>esign Patterns-page 123]
    showRE(a, /[-]/) >> Gamma [Design Patterns<<->>page 123]
    showRE(a, /[0-9]/) >> Gamma [Design Patterns-page <<1>>23]
  4. 紧跟在开括号([)后的是字符^,这表示这个字符类的否定:[^a-z]匹配任何不是小写字母的字符。
  5. 字符类缩写
    序列 形如 [ ... ] 含义
    \d [0-9] Digit character
    \D [^0-9] Nondigit
    \s [\s\t\r\n\f] Whitespace character 匹配一个单空白符
    \S [^\s\t\r\n\f] Nonwhitespace character
    \w [A-Za-z0-9_] Word character
    \W [^A-Za-z0-9_] Nonword character
  6. 重复
    r * 匹配0个或多个r的出现
    r + 匹配一个或多个r的出现
    r ? 匹配0个或1个r的出现
    r {m,n} 匹配最少m最多n个r的出现
    r {m,} 匹配最少m个r的出现

    重复结构有高优先权:即它们仅和模式中的直接正则表达式前驱捆绑
    /ab+/匹配一个"a"后跟一个活着多个"b",而不是"ab"的序列
    /a*/会匹配任何字符串:0个或者多个"a"的任意字符串。 
    exp:
    a = "The moon is made of cheese"
    showRE(a, /\w+/) >> <<The>> moon is made of cheese
    showRE(a, /\s.*\s/) >> The<< moon is made of >>cheese
    showRE(a, /\s.*?\s/) >> The<< moon >>is made of cheese
    showRE(a, /[aeiou]{2,99}/) >> The m<<oo>>n is made of cheese
    showRE(a, /mo?o/) >> The <<moo>>n is made of cheese

  7. 替换
    "|"既匹配它前面的正则表达式或者匹配后面的
    a = "red ball blue sky"
    showRE(a, /d|e/) >> r<<e>>d ball blue sky
    showRE(a, /al|lu/) >> red b<<al>>l blue sky
    showRE(a, /red ball|angry sky/) >> <<red ball>> blue sky
  8. 分组
    圆括号把正则表达式分组,组中的内容被当作一个单独的正则表达式
    showRE('banana', /(an)+/) >> b<<anan>>a
    # 匹配重复的字母
    showRE('He said "Hello"', /(\w)\1/) >> He said "He<<ll>>o"
    # 匹配重复的子字符串
    showRE('Mississippi', /(\w+)\1/) >> M<<ississ>>ippi
  9. 基于模式的替换
    你是否想过,大小写替换。
    方法String#sub和String#gsub都在字符串中搜索匹配第一个参数的部分,然后用第二个参数来替换它们。String#sub只替换一次,而String#gsub替换所有找到的匹配。都返回一个包含了替换的新的字符串的拷贝。进化版本是String#sub!和 String#gsub!
    a = "the quick brown fox"
    a.sub(/[aeiou]/, '*') >> "th* quick brown fox"
    a.gsub(/[aeiou]/, '*') >> "th* q**ck br*wn f*x"
    a.sub(/\s\S+/, '') >> "the brown fox"
    a.gsub(/\s\S+/, '') >> "the"
    第二个参数可以是代码块
    a = "the quick brown fox"
    a.sub (/^./) { $&.upcase } >> "The quick brown fox"
    a.gsub(/[aeiou]/) { $&.upcase } >> "thE qUIck brOwn fOx"
  10. 反斜线序列用在替换中
    \& 后面的匹配
    \+ 后面的匹配组
    \` 匹配前面的字符串
    \' 匹配后面的字符串
    \\ 反斜线的字面值
  11. 面向对象的正则表达式
    正则表达式的字面值创建Regexp类
    re = /cat/
    re.type >> Regexp
    方法Regexp#match从字符串中匹配一个正则表达式,如果不成功,方法返回nil,如果成功,返回MatchData类的一个实例
    exp:
    e = /(\d+):(\d+)/ # match a time hh:mm
    md = re.match("Time: 12:34am")
    md.type >> MatchData
    md[0] # == $& >> "12:34"
    md[1] # == $1 >> "12"
    md[2] # == $2 >> "34"
    md.pre_match # == $` >> "Time: "
    md.post_match # == $' >> "am"

(0)

相关推荐

  • ruby 类常量 解析

    一个常量由大写字母开头.它应最多被赋值一次.在Ruby的当前版本中,常量的再赋值只会产生警告而不是错误(non-ANSI版的eval.rb不会报告这一警告) ruby>fluid=30    30 ruby>fluid=31    31 ruby>Solid=32    32 ruby>Solid=33    (eval):1: warning: already initialized constant Solid    33 常量可以定义在类里,但不像实变量,它们可以在类的外部访

  • ruby 学习笔记(2) 类的基本使用

    ruby语言跟c#的一些重要差别在于: 1.ruby是动态语言,c#是静态语言--即对象在new出来以后,ruby还可以动态给对象实例添加一些属性或方法(javascript也是如此) 2.ruby中刻意弱化了变量类型这个概念,默认情况下变量/方法都不需要声明具体(返回)类型,但其实在ruby内部,会自动根据变量的值分配类型.(可以通过 "puts 变量.class"查看) 3.ruby相对c#来讲,可能有些雷的地方在于:父类中的private成员,居然是可以在子类中使用的! ...其

  • Ruby字符串、条件、循环、数组、Hash、类基本操作笔记

    一.字符串操作 字符串插值 1.#{}: 任意放置在#{}中的合法Ruby代码都将被求值,并被替换为求值结果插入到原位置 2.单引号与双引号差别: 双引号允许字符转义,单引号不允许转义,里是什么字符,用户看到的就是什么字符 单引号不允许字符插值 字符串拆分 1.以空格拆分:string.split(' ')字符串连接 方法一.'Ruby' + 'Monk', stdout: RubyMonk 方法二."Monk".concat("Ruby") stdout: Mon

  • Ruby类实例变量、类实例方法和类变量、类方法的区别

    在Ruby中类实例变量.类实例方法和类变量.类方法的区别比较微妙,而且用法也有相当的区别.本文探讨一下他们的定义和基本的使用场景,以抛砖引玉...   一.类实例变量和类变量   类变量大家都很熟悉了,就是在类定义中用@@开头的变量.类变量是用于存储类的全局信息,它只属于类,不同与类实例变量(即用@开头定义的变量)每一个类的对象都有一份数据. 类变量是可以被继承的,也就是说如果我们派生一个子类,那么在子类中是可以访问父类的类变量的.子类和父类共享一份数据,对一个类的修改会反映到另一个类中.如下边

  • Ruby中实现把字符串转换为类的2种方法

    最近有个需求,需要根据一个字符串当作一个类来使用,例如: 有一个字符串 "ChinaMag",根据这个字符串调用 类 ChinaMag下的方法. 解决办法: 1.rails可以使用 constantize方法. 复制代码 代码如下: pry(main)> 'ChinaMag'.constantize => ChinaMag pry(main)> "Test::Unit".constantize => Test::Unit 2.ruby可以使用

  • Ruby面向对象编程中类与方法的基础学习

    打开类和猴子补丁 在Ruby中,类定义的方法和其他的语句没有任何区别,都是一行一行的执行下去的.如下例子: class Example def method_1 puts "method 1" end end class Example def method_2 puts "method 2" end end 本例中,当第一次定义Class Example的时候,还没有一个叫做Example的Class存在,因此,Ruby开始定义这个类,当后面在定义这个类时,Rub

  • js 数组实现一个类似ruby的迭代器

    分为如下几节: ·基本实现 ·在迭代中引用原来的对象,或者直接改变数组的值而不是返回一个新数组 ·向迭代传入无限多的参数 ·基本实现 今天突然发现js的数组处理起来真是麻烦,代码一些就是一大堆,相比起ruby的迭代器来真是逊色不少,主要是要写的代码太多了,也许是js有特殊的处理数组的方式,真是我不知道而已,但是我真的想自己给js实现一个类似ruby的迭代器的东东,而且实现起来也不难,那就开始动手吧. 真的应该庆幸js是动态语言啊,如果是静态语言,实现起来很不方便(别说要我重新定义一个继承自arr

  • Ruby中的Proc类及Proc的类方法Proc.new的使用解析

    Proc是对块及其context(局部变量的作用域以及栈框架)进行对象化处理之后得到的过程对象.您可以像使用无名函数那样来使用Proc,但它不会导入局部变量的作用域(可以把动态局部变量用作Proc局部变量). 在下例中,正因为Proc一直保持着局部变量的作用域,所以才能调用var变量. var = 1 $foo = Proc.new { var } var = 2 def foo $foo.call end p foo # => 2 从生成Proc的方法中返回以后,若Proc中出现return或

  • 一个简单的Ruby可逆加密解密类

    实现代码: 复制代码 代码如下: class Des    require 'openssl'    require 'base64'    ALG = 'DES-EDE3-CBC'    KEY = "mZ4Wjs6L"    DES_KEY = "nZ4wJs6L" #加密    def encode(str)      des = OpenSSL::Cipher::Cipher.new(ALG)      des.pkcs5_keyivgen(KEY, DES

  • ruby 标准类型总结

    一.数字 Ruby支持整数和浮点数,整数可以是任意长度 一定范围内的整数以二进制存放,它们属于fixnum类型,当超出这个范围时则自动转换为bignum类型 表达方式:符号+一串字符,数字串中的下划线会被忽略,(前缀包括:0表示八进制, 0x表示十六进制, 0b表示二进制)123_456_789_123_345_789 # Bignum0xaabb # 十六进制 也可以通过在前面加上问号来得到ASCII码字符对应的整数值和转义序列的值?a # 普通字符?\n # 换行符 (0x0a)?\C-a

  • Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】

    本文实例讲述了Python列表list操作符.分享给大家供大家参考,具体如下: #coding=utf8 ''''' 列表也可以使用比较操作符,比较时更加ASCII进行比较的. 比较列表时也用内建函数cmp()函数: 两个列表的元素分别比较,直到有一方胜出. 元组进行比较操作时和列表遵循相同的逻辑. 列表的切片操作和字符串的切片操作很像, 不过列表的切片操作返回的是一个对象或者几个对象的集合. 列表的切片操作也遵循从正负索引规则,也有开始索引值,结束索引值, 如果这两个值为空,默认为序列的开始和

  • python内建类型与标准类型

    目录 前言 理解对象和类型 关于不可变类型和可变类型 关于动态静态强弱类型 标准类型 其它内建类型 类型的类型 None ->空类型 内建类型的布尔值 前言 全可以访问相同的对象, 因此我们讲 这种变量名也叫对象的 "引用". 验证1: a = 2 b = 3 print(id(a),id(b))  #140734889681584 140734889681616 b = 2 print(id(b))    #140734889681584 验证2: b = 3 print(id

  • Python随手笔记之标准类型内建函数

    Python提供了一些内建函数用于基本对象类型:cmp(),repr(),str(),type()和等同于repr()的(' ')操作符 (1)type() type的用法如下: type(object) 接受一个对象作为参数,并返回它的类型.他的返回值是一个类型对象. >>>type('r') <type 'str'> >>>type(3) <type 'int'> >>>type(type(5)) <type 'typ

  • mybatis类型处理器JSR310标准详解

    目录 类型处理器JSR310标准 使Jackson和Mybatis支持JSR310标准 类型处理器JSR310标准 首先什么是JSR310标准,其实就是新出的一些日期类型等的标准在,mybatisplus3.4之后会自己识别,但是在之前的版本就需要手动进行引入. <dependency>    <groupId>org.mybatis</groupId>    <artifactId>mybatis-typehandlers-jsr310</artif

  • 在Ruby中处理XML和XSLT以及XPath的简单教程

    什么是 XML ? XML 指可扩展标记语言(eXtensible Markup Language). 可扩展标记语言,标准通用标记语言的子集,一种用于标记电子文件使其具有结构性的标记语言. 它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据. XML解析器结构和API XML的解析器主要有DOM和SAX两种. SAX解析器是基于事件处理的,需要从头到尾把XML文档扫描一遍,在扫描

  • 详解Python中映射类型的内建函数和工厂函数

    1.基本函数介绍 (1)标准类型函数[type().str()和 cmp()]         对一个字典调用type()工厂方法,会返回字典类型:"<type 'dict'>".调用str()工厂方法将返回该字典的字符串表示形式.         字典是通过这样的算法来比较的:首先是字典的大小,然后是键,最后是值.可是用cmp()做字典的比较一般不是很有用. 算法按照以下的顺序: 首先比较字典长度         如果字典的长度不同,那么用cmp(dict1, dict2

  • Ruby的25个编程细节(技巧、实用代码段)

    1.try 永远不会抛出异常 在 没有的时候 返回 nil 复制代码 代码如下: province_id = Province.find_by_name(prov).try(:id) 2.find(:first, :condotions) 方法 不言而与 复制代码 代码如下: mobile_info = MobileInfo.find(:first, :conditions => ["mobile_num = ? ", mobile_num.to_i]) 3.find(:all,

  • ruby 模块

    Ruby的模块非常类似类,除了: 模块不可以有实体 模块不可以有子类 模块由module...end定义. 实际上...模块的'模块类'是'类的类'这个类的父类.搞懂了吗?不懂?让我们继续看下去吧. 模块有两种用法.其一是将相近的方法和实体放在一个相对集中的域里.Ruby标准包里的Math模块就扮演着这一角色: ruby> Math.sqrt(2)    1.41421 ruby> Math::PI    3.14159 ::操作符告诉 Ruby 解释器在哪里找常数的值(可以想像,Math外的

  • 详解JavaScript中的4种类型识别方法

    具体内容如下: 1.typeof [输出]首字母小写的字符串形式 [功能] [a]可以识别标准类型(将Null识别为object) [b]不能识别具体的对象类型(Function除外) [实例] console.log(typeof "jerry");//"string" console.log(typeof 12);//"number" console.log(typeof true);//"boolean" console

随机推荐