24

我正在寻找一种nil使用 Ruby 将空字符串转换为适当位置的方法。如果我最终得到一个空格的字符串,我可以这样做

 "    ".strip!

这会给我空字符串""

我希望能够做的是这样的事情。

"    ".strip!.to_nil!

这将用 . 替换空字符串nilto_nil!将字符串更改为nil直接,.empty?否则如果字符串不为空,则不会更改。

这里的关键是我希望它直接发生,而不是通过诸如

f = nil if f.strip!.empty?
4

4 回答 4

65

干净的方法是使用presence.

让我们测试一下。

'    '.presence
# => nil


''.presence
# => nil


'text'.presence
# => "text"


nil.presence
# => nil


[].presence
# => nil


{}.presence
# => nil

true.presence
# => true

false.presence
# => nil

请注意,此方法来自 Ruby on Rails v4.2.7 https://apidock.com/rails/Object/presence

于 2017-08-04T11:59:23.343 回答
4

那是不可能的。

String#squeeze!可以就地工作,因为可以修改原始对象以存储新值。但是该值nil是不同类的对象,因此不能用String类的对象表示。

于 2013-03-14T20:26:49.740 回答
2

我知道我有点晚了,但是您可以为 String 类编写自己的方法,并在初始化程序中运行代码:

class String
  def to_nil
    present? ? self : nil
  end
end

然后你会得到:

'a'.to_nil
=> "a"
''.to_nil
=> nil

当然,您也可以在检查是否适合您之前剥离字符串

于 2014-04-28T15:42:19.137 回答
0

正则表达式来救援!如果匹配或正则表达式不匹配,我们可以使用string[regexp]which 返回 a (参见文档String)。new_stringnil

''[/.+/] 
# => nil

'text'[/.+/] 
# => 'text'

# Caution 1: This doesn't work for strings which are just spaces
'   '[/.+/] 
# => '   '

# In these cases you can strip...
'   '.strip[/.+/] 
# => nil

# ...or use a more complicated regex:
'   '[/.*\S.*/]
# => nil
于 2021-11-01T09:50:05.670 回答