【问题标题】:Converting an empty string to nil in place?将空字符串转换为 nil 就地?
【发布时间】:2013-03-03 09:26:01
【问题描述】:

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

 "    ".strip!

这会给我一个空字符串""

我想做的就是这样。

"    ".strip!.to_nil!

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

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

之类的分配
f = nil if f.strip!.empty?

【问题讨论】:

  • 也许我遗漏了一些东西......但是首先对字符串做一些事情然后将其设置为 nil 有什么意义呢?不妨一开始就将字符串设置为 nil,对吧?
  • 不能就地完成。您是否只对就地修改感兴趣?我用String#presence 创建了一个答案,但它不是就地的(请注意,就地/重新绑定通常都是不好的做法)。
  • 我同意它们通常是一种不好的做法,我实际上是在尝试绕过障碍,这种类型的解决方案会使它变得非常容易。

标签: ruby string null in-place


【解决方案1】:

干净的方法是使用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

【讨论】:

  • 太棒了。正是我想要的。
【解决方案2】:

这是不可能的。

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

【讨论】:

  • 这真的是我想做的事情的核心。我本质上想做一个改变类型的就地改变。使用 send、eval 等围绕 Ruby 的所有其他魔法......我在想可能有一种方法可以通过 object_id 找到对象并将其从自身下方切换出来。
  • 使用即时值的nil 尤其困难。它总是有 4 作为 object_id。
  • 同意;我想我真正想要的是试图欺骗系统从一个 object_id 指向另一个。以同样的方式,我们可以使用 send 绕过 private。
【解决方案3】:

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

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

然后你会得到:

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

当然你也可以在检查是否适合你之前去掉字符串

【讨论】:

  • to_nil 是一个非常具有误导性的方法名称。
  • 也许有更好的名字,这不是问题。回头看@bigtunacan 的问题,他在寻找一个名为to_nil 的函数。
  • 很好奇,为什么会误导?
  • @ahnbizcad 因为您希望s.to_nil.nil? 总是评估true,但事实并非如此。
【解决方案4】:

正则表达式来救援!我们可以使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 2012-07-15
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多