设为首页 加入收藏

TOP

Ruby字符串(2):String方法详细整理(一)
2019-08-15 00:10:18 】 浏览:349
Tags:Ruby 字符串 String 方法 详细 整理

String方法整理

官方手册

类方法

new

new(str="") → new_str
new(str="", encoding: enc) → new_str
new(str="", capacity: size) → new_str

encoding指定创建什么编码的字符串,即new_str是什么编码的。

capacity指定创建字符串对象时预先分配好的buffer大小。如果以后要扩容该字符串,就不需要再临时动态分配内存。对于后续可能需要频繁扩展该字符串的情况,可以提升一些性能。

例如:

try_convert

try_convert(obj) → string or nil

尝试通过调用to_s()将obj转换成字符串,如果不能转换,则不报错而是返回nil。

String.try_convert("hello")  #=> "hello"
String.try_convert(/re/)     #=> nil

实例方法

%格式化字符串

str % arg → new_str

arg有三种方式:单参数、数组、hash

"%05d" % 123                          #=> "00123"
"%-3s: %05d" % [ "ID", 123 ]          #=> "ID : 00123"
"foo = %{foo}" % { :foo => 'bar' }    #=> "foo = bar"

除了%,还有sprintf()(Kernel模块中)也可以格式化字符串。

*重复字符串

str * integer → new_str

integer必须是大于等于0的整数,表示重复str字符串N次。重复0次表示返回空字符串。

"Ho! " * 3   #=> "Ho! Ho! Ho! "
"Ho! " * 0   #=> ""

+串联扩展字符串

str + other_str → new_str

将other_str串联追加到str的尾部。注意,返回的是新字符串对象,而不是原处修改的

a="hello"

a + self.to_s  #=> "hellomain"

puts a         #=> "hello"

<<和concat和prepend原处追加字符串

str << obj → str
str << integer → str
concat(obj1, obj2, ...) → str
prepend(other_str1, other_str2, ...) → str

将给定obj对象追加到str的尾部,很经常的,obj会是另一个字符串对象,表示将另一个字符串追加到str尾部进行扩展。注意是原处修改的

如果追加的是一个integer,则integer被当作是代码点(或ASCII码),于是将对应的字符插入到str的尾部。

如果obj不能转换成字符串(通过to_str方法而不是to_s方法),则报错,例如Array对象有to_s但是没有to_str方法,所以Array不能追加到str尾部。

<<可以多个串联在一起,例如a <<"hello" <<"world"

concat功能和<<一样,它可以接收多个参数。它也是原处修改对象

a = "hello "
a << "world"   #=> "hello world"
a << 33        #=> "hello world!"

b = "hello
b << "xyz" <<"hello"
b              #=> "helloxyzhello"

a="hello"
a.concat("world","nihao")  #=>helloworldnihao

prepend()是将一个或多个其它字符串插入到字符串的前端。它也是原处修改对象。

a = "!"
a.prepend("hello ", "world") #=> "hello world!"
a                            #=> "hello world!"

+-可变和不可变(frozen)字符串

+str → str (mutable)
-str → str (frozen)
freeze()

+str表示返回一个可变的字符串对象:

  • 如果原始字符串是frozen的,则拷贝一份并返回它的可变对象
  • 如果原始字符串本身就是可变的(字符串默认就是可变的),则返回自身,不拷贝字符串对象

-str表示返回一个不可变(frozen)的字符串对象:

  • 如果原始字符串是可变的,则拷贝一份
  • 如果原始字符串本身不可变,则返回自身

freeze()也表示返回不可变字符串对象,它都是在原处修改的。

所以,[+ -]str可能会创建新对象,而freeze则总是使得原始字符串不可变。

>> a="world"     #=> "world"
>> a.object_id   #=> 15976580

>> b = +a        #=> "world"
>> b.object_id   #=> 15976580  # 因为a本身可变,所以不拷贝,返回自身

>> a="world"     #=> "world"
>> a.object_id   #=> 8911880

>> b=-a          #=> "world"
>> b.object_id   #=> 8897840   # 因为a可变,所以拷贝,返回新的不可变对象b
>> b[1]="OO"     # b不可变,RuntimeError: can't modify frozen String

>> a[1]="OO"     # a仍然可变
=> "OO"
>> a
=> "wOOrld"

>> b.object_id   #=> 8854280
>> c = -b        #=> "world"    # b不可变,所以-b返回自身
>> c.object_id   #=> 8854280

>> d = +b        #=> "world"    # b不可变,所以+b创建新对象
>> d.object_id   #=> 11837980

>&
首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/11/11
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇猫眼电影练习,动态字体 下一篇安装Ruby、多版本Ruby共存、Ruby..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目