ruby 将空字符串就地转换为nil?

h7appiyu  于 2023-02-03  发布在  Ruby
关注(0)|答案(4)|浏览(204)

我正在寻找一种方法来使用Ruby将一个空字符串转换为nil。如果我最终得到的字符串是空格,我可以

"    ".strip!

这将给予空字符串""
我希望能够做的是这样的事情。

"    ".strip!.to_nil!

这将得到一个用nil替换空字符串的位置。如果字符串是.empty?,则to_nil!将直接将字符串更改为nil,否则如果字符串不为空,则不会更改。
这里的关键是,我希望它直接发生,而不是通过如下赋值语句

f = nil if f.strip!.empty?
5lhxktic

5lhxktic1#

干净的方法是使用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
注意:不适用于IRB,适用于Ruby on Rails!

iswrvxsc

iswrvxsc2#

这不可能。
String#squeeze!可以在原处工作,因为可以修改原始对象来存储新值,但是值nil是另一个类的对象,所以不能用类String的对象来表示。

r1zk6ea1

r1zk6ea13#

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

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

然后你会得到:

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

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

fgw7neuy

fgw7neuy4#

我们可以使用string[regexp],如果匹配,则返回new_string;如果不匹配,则返回nil(参见文档String)。

''[/.+/] 
# => 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

相关问题