2013-07-19 8 views
8

Ich möchte in Rubin quetschen. Ich habe diese Methode in Ruby auf Rails gefunden, aber ich möchte sie nur in Ruby verwenden, weil ich Ruby nicht auf Rails verwende.Wie in Rubin quetschen

Wie kann das in Ruby tun.

" foo bar \n \t boo".squish # => "foo bar boo" 
+7

Wenn Sie genau wissen, was Sie wollen, warum nicht auf seine Quelle? – sawa

Antwort

8

Versuchen Sie Folgendes:

" foo bar \n \t boo".split.join(" ") 
# => "foo bar boo" 
+0

funktioniert perfekt !! –

8

Vom Rails source, die squish! ergänzt String:

# File activesupport/lib/active_support/core_ext/string/filters.rb, line 16 
def squish! 
    gsub!(/\A[[:space:]]+/, '') 
    gsub!(/[[:space:]]+\z/, '') 
    gsub!(/[[:space:]]+/, ' ') 
    self 
end 
6
>> " foo bar \n \t boo".strip.gsub(/\s+/, ' ') 
=> "foo bar boo" 
1

Sie es selbst implementieren können:

def squish 
    string = strip 
    string.gsub!(/\s+/, ' ') 
    string 
end 

Es ist modifizierte Rails 'squish! Methode.

5

Ich sehe keinen Grund, (wieder) implementieren diese und nicht verwenden ActiveSupport, können Sie es ohne die gesamte Rails-Framework verwenden:

require 'active_support/core_ext/string/filters' 
" foo bar \n \t boo".squish 
# => "foo bar baz" 

Oder, wenn Sie wirklich Rails vermeiden möchten, können Sie Ruby Facets verwenden :

require 'facets/string/squish' 
" foo bar \n \t boo".squish 
# => "foo bar baz" 


aktualisieren Nun, vielleicht, perfomarmances könnte ein Grund sein. Eine schnelle Benchmark:

require 'benchmark' 

require 'facets/string/squish' 

def squish_falsetru(s) 
    s.strip.gsub(/s+/, ' ') 
end 

def squish_priti(s) 
    s.split.join(' ') 
end 

# ActiveSupport's implementation is not included to avoid 
# names clashes with facets' implementation. 
# It is also embarrassing slow! 

N = 500_000 
S = " foo bar \n \t boo" 

Benchmark.bm(10) do |x| 
    x.report('falsetru') { N.times { squish_falsetru(S) } } 
    x.report('priti') { N.times { squish_priti(S) } } 
    x.report('facets') { N.times { S.squish } } 
end 

       user  system  total  real 
falsetru  1.050000 0.000000 1.050000 ( 1.047549) 
priti  0.870000 0.000000 0.870000 ( 0.879500) 
facets  2.740000 0.000000 2.740000 ( 2.746178)