14

私は2つの文字列を持っています:

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 RailsString#truncateメソッドでmonkey-patchとして行う方法です。

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 に答える