2013-07-19 14 views
8

Chcę zgnieść w rubin. Znalazłem tę metodę w Ruby na szynach, ale chcę używać jej tylko w Ruby, ponieważ nie używam Ruby na szynach.Jak zgnieść w rubinie

Jak to zrobić w Ruby.

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

Jeśli wiesz dokładnie, czego chcesz, to dlaczego nie spojrzeć na jego źródło? – sawa

Odpowiedz

8

Spróbuj wykonać następujące czynności:

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

działa idealnie! –

8

Z Rails source, który dodaje squish! do 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

Można to realizować siebie:

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

Jest to zmodyfikowana metoda Rails 'squish!.

5

widzę żadnego powodu do (re) wdrożyć to i nie używać ActiveSupport, można go używać bez całej Rails:

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

Lub, jeśli naprawdę chcemy uniknąć szynach, można użyć Ruby Facets :

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


Aktualizacja No, może, perfomarmances może być powód. Szybki test porównawczy:

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) 
Powiązane problemy