在Ruby中修剪字符串而不创建新字符串的规范方法是什么?
这就是我现在所拥有的——对于它正在做的工作来说,它看起来太冗长了在Ruby中修剪字符串而不创建新字符串的规范方法是什么?,ruby,string,Ruby,String,这就是我现在所拥有的——对于它正在做的工作来说,它看起来太冗长了 @title = tokens[Title].strip! || tokens[Title] if !tokens[Title].nil? 假设令牌是通过拆分CSV行获得的数组。 现在的功能像条带!咬!如果未修改字符串,则返回nil "abc".strip! # => nil " abc ".strip! # => "abc" 如果它包含额外的前导或尾随空格而不创建副本,Ruby怎么说修剪它呢
@title = tokens[Title].strip! || tokens[Title] if !tokens[Title].nil?
假设令牌是通过拆分CSV行获得的数组。
现在的功能像条带!咬!如果未修改字符串,则返回nil
"abc".strip! # => nil
" abc ".strip! # => "abc"
如果它包含额外的前导或尾随空格而不创建副本,Ruby怎么说修剪它呢
如果我想做
tokens[Title].chomp!会变得更丑!。脱衣舞代码>我想你想要的是:
@title = tokens[Title]
@title.strip!
如果没有剥离任何内容,该方法将返回nil
,如果剥离,则返回变量本身
根据Ruby标准,带有感叹号后缀的方法会在适当的位置更改变量
希望这有帮助
更新:这是从irb
输出的,用于演示:
>> @title = "abc"
=> "abc"
>> @title.strip!
=> nil
>> @title
=> "abc"
>> @title = " abc "
=> " abc "
>> @title.strip!
=> "abc"
>> @title
=> "abc"
我认为您的示例是一种明智的方法,尽管您可以将其稍微简化为:
@title = tokens[Title].strip! || tokens[Title] if tokens[Title]
或者,您可以将其放在两行:
@title = tokens[Title] || ''
@title.strip!
没有必要同时进行strip和chomp,因为strip还将删除尾随的回车符,除非您更改了默认的记录分隔符,而这正是您要执行的操作
Olly的答案在Ruby中已经有了实现这一点的标准方法,不过如果你发现自己经常这样做,你可以为它定义一个方法:
def strip_or_self!(str)
str.strip! || str
end
给予:
@title = strip_or_self!(tokens[Title]) if tokens[Title]
还要记住,如果令牌为nil,if语句将阻止@title
被赋值,这将导致它保留其以前的值。如果您希望或不介意始终分配@title
,您可以将支票移动到方法中,进一步减少重复:
def strip_or_self!(str)
str.strip! || str if str
end
或者,如果您觉得有冒险精神,可以在字符串本身上定义一个方法:
class String
def strip_or_self!
strip! || self
end
end
提供下列其中一项:
@title = tokens[Title].strip_or_self! if tokens[Title]
@title = tokens[Title] && tokens[Title].strip_or_self!
顺便说一句,现在ruby已经支持不带“!”的strip了
比较:
p "abc".strip! == " abc ".strip! # false, because "abc".strip! will return nil
p "abc".strip == " abc ".strip # true
此外,如果没有重复项,也不可能剥离
。请参阅string.c中的源代码:
ruby 1.9.3p0(2011-10-30)[i386-mingw32]
更新1:
正如我现在看到的——它创建于1999年(见SVN):
更新2:
strip
不会创建重复项-无论是1.9.x、2.x还是trunk版本。我的方式:
> (@title = " abc ").strip!
=> "abc"
> @title
=> "abc"
我完全有可能不理解这个话题,但这不符合你的需要吗
" success ".strip! || "rescue" #=> "success"
"failure".strip! || "rescue" #=> "rescue"
如果您有ruby 1.9或activesupport,您可以简单地执行以下操作
@title = tokens[Title].try :tap, &:strip!
这真的很酷,因为它利用了:try
和:tap
方法,在我看来,这是ruby中最强大的函数构造
一种更为可爱的形式,传递的功能完全是符号:
@title = tokens[Title].send :try, :tap, &:strip!
如果您使用的是Ruby on Rails,则会出现挤压
> @title = " abc "
=> " abc "
> @title.squish
=> "abc"
> @title
=> " abc "
> @title.squish!
=> "abc"
> @title
=> "abc"
如果您只使用Ruby,则需要使用strip
这就是问题所在。。在你的情况下,你想使用无爆炸带
脱衣舞!当然返回nil,如果没有操作,它仍然更新变量,所以strip!不能内联使用。如果你想使用带内联,你可以使用没有爆炸的版本
脱衣舞使用多行方法
> tokens["Title"] = " abc "
=> " abc "
> tokens["Title"].strip!
=> "abc"
> @title = tokens["Title"]
=> "abc"
条带式单线进近。。。你的回答
> tokens["Title"] = " abc "
=> " abc "
> @title = tokens["Title"].strip if tokens["Title"].present?
=> "abc"
如果在需要以下内容后要使用其他方法:
( str.strip || str ).split(',')
这样你就可以脱光衣服,在:)之后仍然做一些事情。Hmm。。我仍然认为@title=tokens[title].strip!看起来更干净-很遗憾它返回nil而不是未修改的字符串。除非有人发布更好的答案。。你得到了被接受的位。好的,@title=tokens[title]。strip会起作用,但是你会有一个副本,如果你保持tokens[title]变量不变,这是很好的。Ruby 1.9有tap,它完全可以做你想要的:@title.tap{x | x.strip!}@timkay是否可以做@title.tap&:strip代码>?这看起来比其他任何东西都干净。为什么它会返回nil
,除非它去除了某些东西?毫无疑问,这让很多人感到困惑(因为这毫无意义)。如果你要反复从代币中读取内容,那么对其进行预处理可能更有意义。也就是说,“tokens.each{| t | t.strip!}”。然后你可以只做“@title=tokens[title]| | |”“如果没有副本,剥离是不可能的”-当然这是可能的,这就是剥离
是为@KarolyHorvath编写的,您没有看到用C编写的源代码吗?请仔细阅读,我在这里写的关于副本的内容。我当然看到了。但这是strip
的源代码。我是不是误解了什么?否则我怎么解释“没有复制就不可能剥离”@KarolyHorvath内部复制总是被创建的。这是关于字符串'str=rb_str_dup(str)`如果你不想复制,你可以使用strip
akarb\u str\u strip\u bang
。
> tokens["Title"] = " abc "
=> " abc "
> @title = tokens["Title"].strip if tokens["Title"].present?
=> "abc"
( str.strip || str ).split(',')