如何使用puts到n个字符强制Ruby字符串变量输出,以便如果变量较长,它将被截断,如果较短,它将通过尾随或前导空格展开?

有什么标准方法可以做到这一点吗?

推荐答案

Ruby支持使用格式字符串,就像许多其他语言一样:

[11] (pry) main: 0> '%3.3s' % 'f'
=> "  f"
[12] (pry) main: 0> '%3.3s' % 'foo'
=> "foo"
[13] (pry) main: 0> '%3.3s' % 'foobar'
=> "foo"

如果要在右侧填充,请在格式字符串中使用-:

[14] (pry) main: 0> '%-3.3s' % 'f'
=> "f  "
[15] (pry) main: 0> '%-3.3s' % 'foo'
=> "foo"
[16] (pry) main: 0> '%-3.3s' % 'foobar'
=> "foo"

你也可以用printfsprintf,但我更喜欢更通用的%,也就是sprintf.

sprintf份文件中:

  s   | Argument is a string to be substituted.  If the format
      | sequence contains a precision, at most that many characters
      | will be copied.

以及:

-        | all           | Left-justify the result of this conversion.

如果我不想用空格而是其他字符填充呢?

底层的Ruby代码是用C编写的,而且它的硬编码是使用' '作为pad字符,所以这不可能直接实现,除非您想修改源代码,重新编译Ruby,并使用一次性版本的语言.相反,你可以这样做:

[17] (pry) main: 0> ('%-3.3s' % 'f').gsub(' ', '.')
=> "f.."

但这比简单的gsub要复杂得多.如果需要提供特殊字符,通常最好在不使用格式字符串的情况下调整字符串.格式字符串非常强大,但并不完全灵活.

否则,我会 Select @steenslag的解决方案,这是你自己滚动的基础.你失go 了使用格式字符串的能力,不得不依靠连接字符串或类似的东西来获得列输出,但它也可以工作.

Ruby相关问答推荐

为什么非数字在Ruby中被转换为integer?

带有虾Ruby 的动态标题

有没有办法把条件语句写得更干净?

Ruby迭代器与函数.返回函数的第一个值,而不交互整个列表

这个#divmod 方法输出这个结果是做什么的?

有没有更好的方法来加入剩余不变的子列表?

如何在 Ruby 中正确编写代码?以便它产生正确的输出?

如何在 rspec 中使用 `eq` 匹配器和 `hash_include` 匹配器来获取哈希数组

如何在不将换行符粘贴到字符串中的情况下使用puts添加额外的换行符?

如何在 ruby​​ 中列出当前范围内的当前可用对象?

如何使用 capybara + cucumber 断言 ruby​​ 中的 html 表行数

如何强制 Ruby 显示完整的堆栈跟踪?

在 jekyll 博客中支持标签的简单方法

就地修改 ruby​​ 哈希(rails strong params)

rspec 是否有比 target.should < 6 更具体的东西?

Sinatra 登录?

如何修复错误的 URI 不是 URI

如何理解 class_eval() 和 instance_eval() 的区别?

更好的 ruby​​ markdown 解释器?

Docker for Mac - mkmf.rb 找不到 ruby​​ 的头文件