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
>&