lazybios

强化版的concat与prepend | Ruby

ruby_logo

Ruby 2.3之前,我们可以使用#concat来向一个字符串或数组中追加元素,并且可以使用#prepend向字符串起始位置插入子串。Ruby 2.4中我们仍然可以这样做,不仅如此它们的用法还得到了进一步强化。

Ruby 2.3

String#concat and Array#concat

string = "Good"
string.concat(" morning")
#=> "Good morning"

array = ['a', 'b', 'c']
array.concat(['d'])
#=> ["a", "b", "c", "d"]

String#prepend

string = "Morning"
string.prepend("Good ")
#=> "Good morning"

Ruby 2.4以前这些方法一次只接受一个参数。

string = "Good"
string.concat(" morning", " to", " you")
#=> ArgumentError: wrong number of arguments (given 3, expected 1)

Ruby 2.4

String#concat and Array#concat

string = "Good"
string.concat(" morning", " to", " you")
#=> "Good morning to you"

array = ['a', 'b']
array.concat(['c'], ['d'])
#=> ["a", "b", "c", "d"]

String#prepend

string = "you"
string.prepend("Good ", "morning ", "to ")
#=> "Good morning to you"

可以看到,Ruby 2.4完美的解决了之前只能接受一个参数的问题,并且除了可以接受多个参数外,现在还接受不传入参数的情况。

"Good".concat
#=> "Good"

concat与<<的不同

如果只是调用一次,其实两个没啥区别,但如果是连续调用,差异就出来了,如下:

str = "Ruby"
str << str
str
#=> "RubyRuby"

str = "Ruby"
str.concat str
str
#=> "RubyRuby"

str = "Ruby"
str << str << str
#=> "RubyRubyRubyRuby"

str = "Ruby"
str.concat str, str
str
#=> "RubyRubyRuby"

<<连续调用时,表达式从右往左执行,第一个<<执行完以后,str已经变成了RubyRuby,在执行一次就成了RubyRubyRubyRuby了。这时其实concat更符合我们直观的期待。

-完-

参考引用

微信关注「日拱一卒」公众号