如果a = 'foo'
我可以a << 'bar'
并返回foobar
但是我想删除bar
?
我知道我可以做a.slice!(3..a.length)
- 但该死的是那个丑陋的。
让我们regex
这个愚蠢的混蛋像a.gsub!('bar','')
- 但这个是最好的方法吗?
为什么我不能这样做?: a >> 'bar'
- 这将是超级的!
那你们怎么做呢?什么是最快的方法?
答案 0 :(得分:4)
为什么我不能这样做?:a&gt;&gt; 'bar' - 这将是超级棒!
因为使用[]
会更清楚。
a = 'foobar'
a['bar'] = ''
a # 'foo'
如果您最后只需匹配bar
,请使用正则表达式:
a = 'barfoobar'
a[/bar$/] = ''
a # 'barfoo'
a >> 'bar'
不会是'超级',这将是完全模棱两可的。 a >> b
是什么意思?您是在弹出一个字符并将其存储在b
中,还是将b
的值移到a
的末尾,或者将两边转换为整数和位移? <<
表示移动,右侧的字符向左移动。 >>
会向我建议字符从左向右移动,而不是我想要删除并丢弃左边的字符。
a << 'foo'
的唯一原因是因为追加字符串是您在软件中最常见的事情之一。
答案 1 :(得分:0)
“追加”或“推”的反面通常称为“流行”。这些名称来自堆栈(数据结构)术语,可用于数组:
ary = ?f, ?o, ?o
suffix = ?b, ?a, ?r
suffix.each &ary.method( :push )
ary #=> ["f", "o", "o", "b", "a", "r"]
ary.pop 3 #=> ["b", "a", "r"]
要使用push和pop with strings,你必须首先对它们进行排序:
str = 'foobar'
# arrayification
ary = str.each_char.to_a
ary.pop( 3 ).join #=> "bar"
str = ary.join #=> foo
答案 2 :(得分:0)
在这种情况下这不起作用,并且不比gsub干净得多吗?:
a = 'foobar'
a.delete!('bar')
=> "foo"
a = 'foobarfoobarfoobarfoobar'
a.delete!('bar')
=> "foofoofoofoo"