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