How to go about removing the last element? For example, I have strings like these:
str1 = "My testing String"
str2 = "My another testing string"
I need a neat way of showing the output:
str1 = "My testing"
str2 = "My another testing"
This is what I could do:
str1 = str1.split(" ")
str1.delete(str1.last)
str1.join(" ")
# => "My testing"
I was wondering if there's any neat way of doing this maybe in one line, like: str.split(" ", 2).last => "testing string"
, which should show "my testing"
instead.
EDIT
Thank you guys for the multiple and interesting answers. I appreciate your effort and time. But, I had to be fair, so I decided to benchmark everybody's answer. Here is the report with benchmark:
#!/usr/bin/ruby
require 'benchmark'
str2 = "My another testing string"
n = 500
Benchmark.bm(20) do |x|
x.report("str2[/(.*)\s/,1] "){ n.times { str2[/(.*)\s/,1] } }
x.report("str2[0...str2.rindex(' ')] "){ n.times { str2[0...str2.rindex(' ')] } }
x.report("str2.split(' ')[0...-1].join(' ') "){ n.times { str2.split(' ')[0...-1].join(' ') } }
x.report("str2[/.*(?=\s)/] "){ n.times { str2[/.*(?=\s)/] } }
end
user system total real
str2[/(.*) /,1] 0.000000 0.000000 0.000000 ( 0.001394)
str2[0...str2.rindex(' ')] 0.000000 0.000000 0.000000 ( 0.000956)
str2.split(' ')[0...-1].join(' ') 0.010000 0.000000 0.010000 ( 0.002569)
str2[/.*(?= )/] 0.000000 0.000000 0.000000 ( 0.001351)
Which makes it clear that answer p str2[0...str2.rindex(' ')]
is performing well. Though I liked other approaches as well, very thoughtful and interesting. Thanks.
Second Edition
As per @theTineMan comment here is the updated benchmark:
require 'benchmark'
str2 = "My another testing string"
n = 999999
Benchmark.bmbm(20) do |x|
x.report("str2[/(.*)\s/,1] "){ n.times { str2[/(.*)\s/,1] } }
x.report("str2[0...str2.rindex(' ')] "){ n.times { str2[0...str2.rindex(' ')] } }
x.report("str2.split(' ')[0...-1].join(' ') "){ n.times { str2.split(' ')[0...-1].join(' ') } }
x.report("str2[/.*(?=\s)/] "){ n.times { str2[/.*(?=\s)/] } }
end
Rehearsal ----------------------------------------------------------------------
str2[/(.*) /,1] 1.030000 0.000000 1.030000 ( 1.033787)
str2[0...str2.rindex(' ')] 0.850000 0.000000 0.850000 ( 0.853124)
str2.split(' ')[0...-1].join(' ') 4.740000 0.000000 4.740000 ( 4.750215)
str2[/.*(?= )/] 0.990000 0.000000 0.990000 ( 0.990726)
------------------------------------------------------------- total: 7.610000sec
user system total real
str2[/(.*) /,1] 1.020000 0.000000 1.020000 ( 1.014772)
str2[0...str2.rindex(' ')] 0.830000 0.000000 0.830000 ( 0.839385)
str2.split(' ')[0...-1].join(' ') 4.620000 0.010000 4.630000 ( 4.629874)
str2[/.*(?= )/] 0.990000 0.000000 0.990000 ( 0.988224)
str2 = "My another testing string"
p str2[/(.*)\s/,1] #=> My another testing
And if you are not a fan on regexp:
str2 = "My another testing string"
p str2[0...str2.rindex(' ')] #=> My another testing
With split
you can slice the last array element like this:
str1.split(' ')[0...-1].join(' ')
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With