Project1

标题: Ruby标准库入门参考——字符串(String)【未完成】 [打印本页]

作者: DeathKing    时间: 2010-12-11 14:04
标题: Ruby标准库入门参考——字符串(String)【未完成】
本帖最后由 DeathKing 于 2010-12-12 11:11 编辑
  我们的讲解是使用irbInteractive Ruby)测试的。安装了Ruby解析器的读者可以,通过在运行处键入 irb 来启动irb。没有Ruby,试试TryRuby(1.9.2)吧:http://tryruby.org/    
  加粗的部分是要求读者在终端中键入的部分,而所有的Ruby注释和返回值都会以斜体显示。


一、概述

  Ruby具有强大的文本处理能力,这得益于标准库提供了很多字符处理的方法。而我们今天要讨论的就是Ruby中常用的字串处理得方法。

  Ruby中的所有字串皆由String类生成。而String类的超类是Object。

  字符(Character)是指计算机中使用的字母、数字、字和符号,通常是由一个字节表示(请于“宽字符”比较)。将字符看成一个元素,而字符串也就是这些元素构成的集合。



二、通过反射了解String类

  反射机制是我很喜欢的东西,大家也要学会使用它:
  
  1. irb(main):001:0> String.instance_methods.sort
  2. => [:!, :!=, :!~, :%, :*, :+, :<, :<<, :<=, :<=>, :==, :===, :=~, :>, :>=, :[],:[]=, :__id__,     :__send__, :ascii_only?, :between?, :bytes, :bytesize, :capitalize, :capitalize!, :casecmp, :center, :chars, :chomp, :chomp!, :chop, :chop!, :chr, :class, :clear, :clone, :codepoints, :concat, :count, :crypt, :define_singleton_method, :delete, :delete!, :display, :downcase, :downcase!, :dump, :dup, :each_byte, :each_char, :each_codepoint, :each_line, :empty?, :encode, :encode!, :encoding, :end_with?, :enum_for, :eql?, :equal?, :extend, :force_encoding, :freeze, :frozen?, :gem, :getbyte, :gsub, :gsub!, :hash, :hex, :include?, :index, :insert, :inspect, :instance_eval, :instance_exec, :instance_of?, :instance_variable_defined?, :instance_variable_get, :instance_variable_set, :instance_variables, :intern, :is_a?, :kind_of?, :length, :lines, :ljust, :lstrip, :lstrip!, :match, :method, :methods, :next, :next!, :nil?, :object_id, :oct, :ord, :partition, :private_methods, :protected_methods, :public_method, :public_methods, :public_send,:replace, :respond_to?, :reverse, :reverse!, :rindex, :rjust, :rpartition, :rstrip, :rstrip!, :scan, :send, :setbyte, :singleton_methods, :size, :slice, :slice!, :split, :squeeze, :squeeze!, :start_with?, :strip, :strip!, :sub, :sub!, :succ, :succ!, :sum, :swapcase, :swapcase!, :taint, :tainted?, :tap, :to_c, :to_enum, :to_f, :to_i, :to_r, :to_s, :to_str, :to_sym, :tr, :tr!, :tr_s, :tr_s!, :trust, :unpack, :untaint, :untrust, :untrusted?, :upcase, :upcase!, :upto, :valid_encoding?]
复制代码

  有很多很多的方法,但我们不必要完全了解,我只会介绍一些非常常用的,和一些容易用到的方法。



三、建立字符串

  Ruby为我们提供了一个建立字符串的简便方法,使用""或''将字符集合,不过单引号和双引号也有一些区别。

  单引号字符串会按照提供字串的方法保留字串,而双引号字串则会对一些表达式求值,比如控制符。下面是个很清楚的例子:

        01.irb(main):004:0> puts "i am i\n\n"
        02.i am i
        03.
        04.=> nil
        05.irb(main):005:0> puts 'i am i\n\n'
        06.i am i\n\n
        07.=> nil

  其中,\n是转义字符,代表换行符。puts是Kernel模块提供的方法,用于将对象输出到标准输出。在第一个输出中,双引号对\n进行了转义,输出为换行,而第二个输出,单引号没有对\n进行转义,直接输出到屏幕上。

  
注意!
    事实上,Kernel类提供的四个输出方法(或许更多),puts、print、p、printf是有区别的,请读者查阅手册仔细区分,我们会在以后讨论。

  如果你想让他更面向对象(Object Oriented),下面这个方式也不错:

        i_am_a_str = String.new("Yes, you are!")

  但是我要告诉你,字符串对象i_am_a_str仅是另一个字符串对象"Yes, you are!"的拷贝。(参考资料:ri String#new)

  不过String也是Kernel的一个方法:

        i_am_another_str = String("Err.....")

  下面演示一种你在其他语言中很少(几乎不能)见到的建立字符串的方法,就像变魔术。

        01.irb(main):004:0> str_a = %+this is a way+
        02.#=> "this is a way"
        03.irb(main):005:0> str_b = %: any symbol :
        04.#=> " any symbol "
        05.irb(main):006:0> str_c = %Q(iamtheking\n)
        06.#=> "iamtheking\\n"
        07.irb(main):007:0> str_d = %q(iamtheking\n)
        08.#=> "iamtheking\n"

  %操作符再更上一对用于分界的字符,可以快速建立字符串。%++、%{}、%[]、%()、%!!什么的都可以!

  %Q和%q就特殊一点,%Q表示建立双引号扩住的字符串,%q表示建立单引号扩住的字符串。注意单引号扩住的字符串不会进行转义。

  Here文档(Here Document)和%x不在本次讨论范围之内。



四、连接和访问字串

  Ruby由C编写,继承了C良好的特性。两个字符串可以直接链接,就像C语言里面的那样:

        "This is a "  "guide book"
        #=> "This is a guide book"

  觉得不习惯,+方法是个不错的选择,由String类提供。并且注意,如果引号是成对出现的,即使是单双引号混合链接也不会出错:

        'Hi' + "\tevery\t" + 'one' + "\n"
        #=> "Hi\tevery\tone\n"

  当然,*方法更加欢欢乐乐,将"ha "字符串重复50次,笑得捧腹?

        irb(main):009:0> "ha " * 50
        #=> "ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha ha "

  在C语言中,字符串是一个数组,在Ruby中,它的行为也像个数组,这得益于slice方法。

        "take it easy"[0]                #=> "t" 访问字符串首字符
        "DEETH"[2]="A"                   #=> "A" 将原字符串第三个字符替换为A

        "OMG".slice(-1)                  #=> "G" 访问字符串末字符
        "KIING".slice!(2)                #=> "I" 删掉原字符串的第三个元素

  slice和slice!方法的效果因参数的不同而不同,对初学者来说不容易理解。而他们的别名方法,[]和[]=则简便、易读。故,推荐使用[]和[]=。

  也可以这样访问:

        "Like father like son"[0..3]         #=> "Like"
        "Your master."["Your"]               #=> "Your"

  []方法除了接受字符串和范围表达式,也支持正则式,同样,这里不讨论。



五、字符串的比较

        "I" == "I"                #=> true
        "I" == "i"                #=> false
        "U".eql? "U "             #=> false
        "A" <=> "B"               #=> -1

        ==方法当且仅当两个对象都为String,且内容也完全一致时,返回true。eql?方法和==方法类似,似乎在Ruby 1.8.6(RGSS)中,这两个方法有所区别。<=>被称为飞船操作符(Spaceship Operator),用来比较字符串的字符编码,返回-1(小于)、0(等于)或1(大于),当然,这个是区分大小写的。

        "a" <=> "a"   #=> 0
        "A" <=> "a"   #=> -1
        "B" <=> "A"   #=> 1



六、字符串的插入与修改部分字串

        insert方法可以在指定位置插入字符串。

       "I happy".insert(2, "am ")        #=> "I am happy"

        替换部分字符串也可以用[]=方法。

        "befor the day..."["befor"] = "before"
        #=> "before"
        #=> "before the day..."


        # 当然也可以是范围表达式,而且不用担心长度不匹配
        "befor the day..."[0..4] = "before"
        #=> "before"
        #=> "before the day..."


        gsub和gsub!方法在平时也很常用。gsub方法的第一个参数要求提供想要被替换的字符串,而第二个参数则指出用于替换的字串。

        "DeathQueen is here".gsub "Queen", "King"
        #=> "DeathKing is here"



七、分割字符串

        split方法可以分割字符串,将其转变为数组。处理命令很方便。

        "copy from des".split(" ")
        #=> ["copy","from","des"]

        split的参数指定了你要以什么字符串作为分割符,可以是字符串对象,也可以是正则表达式。

未完……待编辑。





作者: summer92    时间: 2010-12-12 15:44
,返回前几个字母怎么写来着,F1里关键字解释太不详细了,

abcd.xxx(3)=abc

另教程好详细,太赞了!!
作者: 高须小龙    时间: 2010-12-20 23:17
其实F1都有介绍的...




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1