¿Cómo calculo el ancho de una cadena en Ruby?

String.length solo me dirá cuántos caracteres hay en la cadena. (De hecho, antes de Ruby 1.9, solo me dirá cuántos bytes, lo que es aún menos útil).

Realmente me gustaría poder averiguar cuántos 'en' ancho es una cadena. Por ejemplo:

'foo'.width
# => 3

'moo'.width
# => 3.5          # m's, w's, etc. are wide

'foi'.width
# => 2.5          # i's, j's, etc. are narrow

'foo bar'.width
# => 6.25         # spaces are very narrow

Aún mejor sería si pudiera obtener el primeron es de una cadena:

'foo'[0, 2.en]
# => "fo"

'filial'[0, 3.en]
# => "fili"

'foo bar baz'[0, 4.5en]
# => "foo b"

Y aún mejor sería si pudiera elaborar una estrategia para todo. Algunas personas piensan que un espacio debería ser 0.25en, algunas piensan que debería ser 0.33, etc.

Respuestas a la pregunta(5)

Su respuesta a la pregunta