剥离函数!,然后将零长度字符串转换为nil

时间:2014-08-28 19:45:58

标签: ruby

删除字符串周围的开始和结束空格的最有效方法是什么,如果结果值为零长度,则将字符串转换为nil?

例如:

> a=''
> squash(a)
=> nil

> a='    '
> squash(a)
=> nil

> a='  xyz  '
> squash(a)
=> 'xyz'

> a=nil
> squash(a)
=> nil

到目前为止:

def squash(value)

    return nil if value.nil?

    value.strip!

    (value.blank? ? nil : value)

end

似乎可能有更简洁的方式来实现这一点。

**编辑**

当我在Rails工作时,如果答案也包含仅支持Ruby的实现,那就太好了。

我应该强调,实现需要能够处理一个 nil值的字符串。

8 个答案:

答案 0 :(得分:3)

假设你想要这个用于rails(否则blank?未定义)你可以使用presence方法:

def squash(value)
  value && value.strip.presence
end

在纯红宝石中,我会这样做:

def squash(value)
  return unless value
  value = value.strip
  value unless value.empty?
end

答案 1 :(得分:3)

这适用于普通的Ruby:

def squash(str)
  str = str.to_s.strip
  str unless str.empty?
end

答案 2 :(得分:2)

这是一种方式:

def squash(str)
  (str && str[/\S/]) ? str.strip : nil
end

/\S/查找不是空格的字符。

squash " My dog has fleas. " #=> "My dog has fleas."
squash "                   " #=> nil
squash nil                   #=> nil

读者挑战

我还试图实现squash!,这会将参数str转换为适当位置。如果strnil,请不要管它。如果str包含至少一个非空白字符,则str.strip!。但是,我无法找到将字符串转换为nil的方法。我想在字符串为空或仅包含空格时执行此操作,但问题是将任何字符串(或更一般地,任何非零对象)转换为nil,当对象作为方法参数接收时。可以吗? [编辑: @Stefan说类型无法更改。我确信他是对的,但我想知道写的是什么,并理解为什么不允许这样做。任何人?的潮] 即可。

答案 3 :(得分:1)

这会处理你的所有例子。

def squash(value)
  value.to_s.strip.empty? ? nil : value.strip
end

答案 4 :(得分:1)

只需添加它,因为它很短:

def squash(str)
  str.to_s[/\S(.*\S)?/]
end

squash(nil)         #=> nil
squash("")          #=> nil
squash(" ")         #=> nil
squash("a")         #=> "a"
squash(" a")        #=> "a"
squash("a ")        #=> "a"
squash(" a ")       #=> "a"
squash(" foo ")     #=> "foo"
squash(" foo bar ") #=> "foo bar"

答案 5 :(得分:0)

这是一个普通的红宝石版本:

def squash(str)
  str && str.strip! && (str unless str.empty?)
end

更新 - 如果您想要一个没有副作用的版本:

def squash(str)
  str && (x = str.strip) && (x unless x.empty?)
end

答案 6 :(得分:0)

如果要使用带有参数squash的方法名称value

def squash(value)
  return value unless value.instance_of?(String)
  return if value.strip!&.empty?
  value
end

功能:

  • pure RubyRuby on Rails上工作
  • 也可以使用string以外的其他数据类型,例如,如果需要,您可以传递number

测试:

squash('ok')
#=> ok
squash('')
#=> nil
squash('    ')
#=> nil
squash('  xyz  ')
#=> 'xyz'
squash('xyz  ')
#=> 'xyz'
squash('    xyz')
#=> 'xyz'
squash(123)
#=> 123
squash(nil)
#=> nil

注意: 我使用Ruby 2.3.0中发布的safe navigation operator。因此,请在使用前确定。

答案 7 :(得分:-1)

irb(main):001:0> s = " string "
=> " string "
irb(main):002:0> s.strip!
=> "string"
irb(main):003:0> s.blank?
NoMethodError: undefined method `blank?' for "string":String
        from (irb):3
        from C:/RUBY/BIN/irb:12:in `'
irb(main):004:0>

我认为blank不是Ruby而是Rails?无论如何,

出了什么问题
(value.length == 0 ? nil : value)

甚至更好

value.empty? ? nil : value

至少每个人都会理解这里的目的是什么。