2013-09-27 4 views
5

У меня есть две строки:Обрезать строку, когда он слишком долго

short_string = "hello world" 
long_string = "this is a very long long long .... string" # suppose more than 10000 chars 

Я хочу, чтобы изменить поведение по умолчанию print на:

puts short_string 
# => "hello world" 
puts long_string 
# => "this is a very long long....." 

The long_string лишь частично напечатанных. Я попытался изменить String#to_s, но это не сработало. Кто-нибудь знает, как это сделать?

обновленного

На самом деле я хочу это работает гладко, это означает, что следующие случаи также работает отлично:

> puts very_long_str 
> puts [very_long_str] 
> puts {:a => very_long_str} 

Так я думаю, что поведение принадлежит String.

Спасибо всем.

ответ

9

Это как Ruby on Rails делает это в своем методе String#truncate.

def truncate(truncate_at, options = {}) 
    return dup unless length > truncate_at 

    options[:omission] ||= '...' 
    length_with_room_for_omission = truncate_at - options[:omission].length 
    stop =  if options[:separator] 
     rindex(options[:separator], length_with_room_for_omission) || length_with_room_for_omission 
    else 
     length_with_room_for_omission 
    end 

    "#{self[0...stop]}#{options[:omission]}" 
end 

Затем вы можете использовать его как этот

'And they found that many people were sleeping better.'.truncate(25, omission: '... (continued)') 
# => "And they f... (continued)" 

И да. Его добавили к Rails как monkey-patch. Таким образом, ее реализован следующим образом:

class String 
    def truncate.. 
    end 
end 
3

Вы можете написать обертку puts, который обрабатывает усечение для вас:

def pleasant(string, length = 32) 
    raise 'Pleasant: Length should be greater than 3' unless length > 3 

    truncated_string = string.to_s 
    if truncated_string.length > length 
    truncated_string = truncated_string[0...(length - 3)] 
    truncated_string += '...' 
    end 

    puts truncated_string 
    truncated string 
end 
+0

Исправлено несколько проблем с кодом. – kristinalim

+1

Он возвращает 'nil', что делает его немного сложнее проверить. Вероятно, он должен просто вернуть усеченную строку. – vgoff

+0

Обновленный ответ, чтобы вернуть усеченную строку, как предложил @vgoff. – kristinalim

11

Прежде всего, вам необходимы способ truncate строку, либо что-то вроде:

def truncate(string, max) 
    string.length > max ? "#{string[0...max]}..." : string 
end 

Или путем расширения String:

class String 
    def truncate(max) 
    length > max ? "#{self[0...max]}..." : self 
    end 
end 

Теперь вы можете вызвать truncate при печати строки:

puts "short string".truncate 
#=> short string 

puts "a very, very, very, very long string".truncate 
#=> a very, very, very, ... 

Или вы могли бы просто определить свой собственный puts:

def puts(string) 
    super(string.truncate(20)) 
end 

puts "short string" 
#=> short string 

puts "a very, very, very, very long string" 
#=> a very, very, very, ... 

Обратите внимание, что Kernel#puts принимает переменное число аргументов, вы можете для изменения вашего метода puts.

0

усечения естественно

Я хочу предложить решение, которое обрезает естественно. Я влюбился в String#truncate method, предлагаемый Ruby on Rails. Об этом уже говорилось @Oto Brglez выше. К сожалению, я не мог переписать его для чистого рубина. Поэтому я написал эту функцию.

def truncate(content, max)  
    if content.length > max 
     truncated = "" 
     collector = "" 
     content = content.split(" ") 
     content.each do |word| 
      word = word + " " 
      collector << word 
      truncated << word if collector.length < max 
     end 
     truncated = truncated.strip.chomp(",").concat("...") 
    else 
     truncated = content 
    end 
    return truncated 
end 

Пример

  • Тест: Я образец фразы, чтобы показать результат этой функции.
  • НЕ: Я образец фразы, чтобы показать результат го ...
  • НО: Я образец фразы, чтобы показать результат ...

Примечание: Я открыт для потому что я убежден, что существует более короткое решение.

Смежные вопросы