14

我有两个字符串:

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....."

long_string仅部分打印。我试图改变String#to_s,但没有奏效。有谁知道如何做到这一点?

更新

实际上我希望它工作顺利,这意味着以下情况也可以正常工作:

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

所以我认为这种行为属于字符串。

总之谢谢大家。

4

4 回答 4

22

首先,您需要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相应地更改您的方法。

于 2013-09-27T10:32:39.637 回答
11

这就是Ruby on Rails在他们的String#truncate方法中作为猴子补丁的方式:

class String
  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
end

然后你可以像这样使用它

'And they found that many people were sleeping better.'.truncate(25, omission: '... (continued)')
# => "And they f... (continued)"
于 2013-09-27T09:29:33.250 回答
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
于 2013-09-27T09:31:40.330 回答
2

自然截断

我想提出一个自然截断的解决方案。我爱上了Ruby on Rails提供的String#truncate 方法。上面的@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

例子

  • 测试:我是一个示例短语来显示这个函数的结果。
  • 不是:我是一个示例短语来显示...的结果
  • 但是:我是一个示例短语来显示...的结果

注意:我对改进持开放态度,因为我确信可能存在更短的解决方案。

于 2017-12-27T00:34:26.673 回答