在Ruby中修改string而不创build新string的规范方法是什么?

这就是我现在所拥有的 – 对于正在做的工作来说,这看起来太冗长了。

@title = tokens[Title].strip! || tokens[Title] if !tokens[Title].nil? 

假设令牌是通过分割CSV行获得的数组。 现在的function像strip! 的Chomp! 等。 如果string未被修改,则全部返回nil

 "abc".strip! # => nil " abc ".strip! # => "abc" 

什么是Ruby的方式来说,如果它包含额外的前导或尾随空格,而不创build副本修剪它?

获取丑陋,如果我想做tokens[Title].chomp!.strip!

我想你想要的是:

 @title = tokens[Title] @title.strip! 

#strip! 方法将返回nil如果它没有剥离任何东西,并且variables本身,如果它被剥离。

根据Ruby标准,带有感叹号后缀的方法可以更改variables。

希望这可以帮助。

更新:这是从irb输出来演示:

 >> @title = "abc" => "abc" >> @title.strip! => nil >> @title => "abc" >> @title = " abc " => " abc " >> @title.strip! => "abc" >> @title => "abc" 

顺便说一句,现在ruby已经支持没有“!”的地带。

比较:

 p "abc".strip! == " abc ".strip! # false, because "abc".strip! will return nil p "abc".strip == " abc ".strip # true 

也不可能strip没有重复。 在string.c中查看源代码:

 static VALUE rb_str_strip(VALUE str) { str = rb_str_dup(str); rb_str_strip_bang(str); return str; } 

ruby1.9.3p0(2011-10-30)[i386-mingw32]

更新1:正如我现在看到的 – 它创build于1999年(见SVN中的#372 ):

Update2: strip! 不会在1.9.x,2.x和trunk版本中创build重复项。

不需要strip和chomp,strip也会删除拖尾的回车符,除非你改变了默认的logging分隔符,这就是你要的。

Olly的回答在Ruby中已经有了这样的规范,但是如果你发现自己做了这么多,你总是可以为它定义一个方法:

 def strip_or_self!(str) str.strip! || str end 

赠送:

 @title = strip_or_self!(tokens[Title]) if tokens[Title] 

还要记住,if语句将防止@title被赋值,如果令牌为零,这将导致它保持以前的值。 如果你想或不介意@title总是被分配,你可以将支票移入方法,并进一步减less重复:

 def strip_or_self!(str) str.strip! || str if str end 

另外,如果你感觉冒险,你可以在String上定义一个方法:

 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 on Rails,那么就有一种压抑感

 > @title = " abc " => " abc " > @title.squish => "abc" > @title => " abc " > @title.squish! => "abc" > @title => "abc" 

如果你只使用Ruby,你想使用strip

在这里谎言gotcha ..在你的情况下,你想使用没有爆炸的地带!

而脱衣舞! 肯定会返回零如果没有动作,它仍然更新variables,所以脱衣服! 不能使用内联。 如果你想使用内嵌条,你可以使用没有爆炸的版本!

跳闸! 采用多线方式

 > 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" 

我认为你的例子是一个明智的做法,虽然你可以简化为:

 @title = tokens[Title].strip! || tokens[Title] if tokens[Title] 

另外你可以把它放在两行:

 @title = tokens[Title] || '' @title.strip! 

我的方式:

 > (@title = " abc ").strip! => "abc" > @title => "abc" 

如果您想在使用其他方法之后再使用其他方法:

 ( str.strip || str ).split(',') 

这样,你可以剥离和仍然做一些事情:)

如果你有ruby1.9或有源支持,你可以简单地做

 @title = tokens[Title].try :tap, &:strip! 

这真的很酷,因为它利用了:try和the :tap方法,这是ruby中function最强大的结构。

一个更偶然的forms,传递函数作为符号:

 @title = tokens[Title].send :try, :tap, &:strip! 
 @title = tokens[Title].strip! || tokens[Title] 

这是完全可能的,我不理解的话题,但不是这样做你需要什么?

 " success ".strip! || "rescue" #=> "success" "failure".strip! || "rescue" #=> "rescue"