删除字符串周围的开始和结束空格的最有效方法是什么,如果结果值为零长度,则将字符串转换为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
值的字符串。
答案 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
转换为适当位置。如果str
为nil
,请不要管它。如果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 Ruby
或Ruby 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
至少每个人都会理解这里的目的是什么。